일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- webp
- 무한스크롤
- 클린 아키텍처
- png
- JPEG
- Cocoa Pod
- 테스트 타겟
- xcode 엔터 표시
- nidthirdpartylogin
- JPG
- xcode 공백 표시
- 함께자라기
- 타뷸레이션
- fetchdescriptor
- swiftdata
- Tuist
- 팀 개발을 위한 git
- SwiftUI
- github 시작하기
- 캐러셀
- Firestore
- .pbxproj
- spm 에러
- swift 모듈화
- TestFlight
- 메모이제이션
- 코드스쿼드
- heic
- NVME
- contentalignmentpoint
- Today
- Total
Sure, Why not?
Localization 다국어 지원 본문
앱은 사용자의 지역에서 잘 실행되고, 모국어로 컨텐츠가 표시가 되면 최상의 경험을 제공할 수 있게 된다.
텍스트를 현지화하기 위해서
기존 Localizable.strings 방식과 String Catalog 방식을 비교하고,
Tuist 프로젝트에서 설정 방법까지 정리하고자 한다.
다국어를 지원하는 기존 방식은
Project -> Info -> Localizations 에서 지원할 언어를 추가해준 다음,
https://developer.apple.com/documentation/foundation/1418095-nslocalizedstring
NSLocalizedString(_:tableName:bundle:value:comment:) | Apple Developer Documentation
Returns a localized string from a table that Xcode generates for you when exporting localizations.
developer.apple.com
공식문서를 보면,
주의깊게 봐야할 점은
tableName과 bundle의 매개변수인데,
하나의 .strings 파일에서 모든 번역을 관리하면 유지보수가 힘들 것이다.
따라서 각 .strings파일을 기능, 뷰에 따라 분리해서 관리하면 효율적이라고 생각이 드는데
이때 tableName은 특정 .strings 파일에서만 번역을 가져올 수 있도록 도와준다.
This defaults to the table in Localizable.stringswhen tableName is nil or an empty string.
특정 파일명이 없다면, nil로 기본값이 되는데
이때 주의할 점은 반드시 Localizable.strings 로 파일을 만들어줘야 접근이 가능하다는 것이다.
--
bundle은 어디서 번역파일을 가져올지 결정하는 역할을 한다.
기본값은 Bundle.main이기 때문에 기본적으로 앱 모듈에서 번역파일을 찾는 것을 의미한다.
만약 모듈화된 프로젝트라면 이를 신경쓰면 좋을 듯하다.
그래서 번역된 파일이 다 준비가 되었다면
extension String {
func localized(from table: String? = nil) -> String {
return NSLocalizedString(self, tableName: table, comment: "")
}
}
사용하기 편하게 다음과 같은 확장함수를 마련하여서, 번역이 필요한 텍스트부분에 함수를 호출하면 된다!
기본적으로 Localizable.strings를 참조하지만,
tableName설정하면 다른 번역 파일 사용가능함.
(만약 strings 파일이 여러개 관리하고 있다면, 저기 매개변수를 enum 타입으로 교체할 것 같다.)
String Catalog ?
https://developer.apple.com/documentation/xcode/localizing-and-varying-text-with-a-string-catalog
Localizing and varying text with a string catalog | Apple Developer Documentation
Use a string catalog to translate text, handle plurals, and vary the text your app displays on specific devices.
developer.apple.com
Xcode 15에 추가된 기능이다.
- 번역을 GUI로 쉽게 관리가 가능하다.
- 뷰 내의 localizable 텍스트들은 자동으로 키값으로 가져올 수 있다.
(LocalizationValue, LocalizedStringKey, LocalizedStringResource 타입들을 인지함)
- 현지화되지 않는 부분을 쉽게 찾을 수 있고, 새로 추가된 항목은 new 로 알려준다.
SwiftUI에서는 자동으로 현지화된다고 공홈에서 나와있다.
그러면 UIKit에서 자동으로 가져올려면
문자열 들어가는 부분에
String(localized: "문자열")
초기화해주면 자동으로 불러올 수 있다.
(고민)
그런데 현재 진행 중인 프로젝트는
App모듈 과 Presentation모듈 로 분리되어 있다.
Presentation 모듈의 텍스트들을 번역해야 하지만, 번역 파일(String Catalog)을 App 모듈에서 관리하고 싶었다.
https://developer.apple.com/forums/thread/737806
String catalogs in packages | Apple Developer Forums
We have separated much of our UI into different packages to reduce complexity and compile time. When we recently tested using new .xcstrings string catalogs, we hit an unexpected problem. Strings extracted from SwiftUI components like Text or Button are ex
developer.apple.com
이 문제를 해결하기 위해 방법을 찾아봤지만,
모듈을 분리한 프로젝트에서 번역을 한 곳(App 모듈)에서 관리하는 것은 쉽지 않았다.
나와 비슷한 고민을 가진 개발자들이 많았지만,
확실한 해결 방법을 찾기는 어려웠다.
그래서
String Catalog를 최상위 앱 모듈이 아닌,
Presentation모듈에 관리하도록 결정했다.
(해당 모듈내부에서 String Catalog 를 두면, 빌드할 때 자동으로 키값이 참조가 되었음.)
이 방식을 사용할 때,
Build settings reference | Apple Developer Documentation
A detailed list of individual Xcode build settings that control or change the way a target is built.
developer.apple.com
추가적으로 Tuist에서 추가해줬다.
settings: .settings(
base: [
"SWIFT_EMIT_LOC_STRINGS": "YES"
]
)
그리고 앱 모듈에서 다음과 같은 코드를 Tuist를 통해 추가해줬다.
infoPlist: .extendingDefault(with: [
"CFBundleAllowMixedLocalizations": true
])
여러 모듈에서 번역파일들이 흩어져있다면,
CFBundleAllowMixedLocalizations = true해주면 된다.
-> 다른 모듈에서 추가한 번역파일을 사용할지 묻는 것
Tuist를 사용해서 프로젝트 설정을 하고자 한다면,
options: .options(
defaultKnownRegions: ["en", "ko", "ja"],
developmentRegion: "en"
),
해당 코드를 추가해주면 된다.
targets: [
.target(
resources: [
"Resources/**"
],
)
]
그리고 해당 코드가 반드시 있어야, 앱이 실제로 리소스들을 사용할 수 있게 된다.
해당 작업을 해주고, 이전과 똑같이
파일 생성해주고 지역에 맞게 번역을 해주면 된다.
Localization .. 많이 삽질하면서, 이것저것 만지다보니
세팅부분과 더불어 알게되어서 뿌듯하다..
기존 방식에 비해,
확실히 String Catalog는 default Localization과 비교하여 번역된 퍼센트도 보여주고,
번역된 부분으로 바로가기도 있고,
각 키값의 상태를 나타내서
보기가 편했다. 👀
'💻' 카테고리의 다른 글
kakao 로그인 (0) | 2025.03.18 |
---|---|
Deadlock (1) | 2025.03.02 |
앱스토어 출시 과정 (+ TestFlight 업로드 ) (0) | 2025.02.11 |
앱스토어 출시 과정 (+ Identifiers ) (0) | 2025.02.10 |
문의하기, 평가하기, 공유하기, 앱정보 표시 (0) | 2025.02.06 |