하루하나 Localization 적용기 1편
: 깔끔하게 텍스트 지역화해보기
이번편은 매우 간단한 이야기를 담고 있어 가볍게 시작해봅니다!
인스타에 앱 만든다고 or 다운좀! 하고 올리면 외국 친한 친구들이
항상 영어버전도 달라고 dm 이 오곤 하는데요 😂
22년 12월에 친구한테 내년에 해줄게... 하고 약속을 했고
또 현재 출시한 앱에 외국 사용자들이 늘어나고 있어
추진력 100000%인 저는 23년이 된 지금 미루던 localization 을 바로 시도하게 되었습니다.
하루하나라는 앱을 현재 기획리딩 + 간단한 디자인 하면서 개발중에 있어요!
(with 안드 / 디자인하는 iOS개발자)
제가 외국회사를 다닐때 가장 좋았던 것 중 하나가 프로젝트에 별칭을 붙여주는거라 사용중인데
1.0.1 별칭이
바로
글로벌 하루하나 였습니다.
(=> 로컬라이제이션 해야한다는 소리)
그나저나 이게 진짜 위젯 앱 중에 제일 편집이 쉽고 광고도 없어서 좋아요..
진짜 내가쓰려고 만든앱
잠시 홍보도 하고..
AppStore: https://bit.ly/haruhana-challenge
이제 진짜 본론으로 갈게요
1. Extension 이용하기
보통 가장 많이 사용하는 방법인데요.
저역시 사용해보았습니다.
소들이님의 블로그를 보면 기본 적용법 + Extension 이용법이 잘 나와있느니 참고해보세요!
Swift) Localizing - 다국어 처리하기
안녕하세요 :-) 소들입니다 오늘은 Swift에서는 다국어를 어떻게 처리하는지에 대해 공부할 거예여! 다국어 처리가 무엇이냐 하면 우리가 화면에 다음과 같은 Label을 하나 만들고 text를 지정했어
babbab2.tistory.com
아무튼 저도 String Extension을 사용해주었어요!
아래 Extension 을 추가해주면
extension String {
func localized(comment: String = "") -> String {
return NSLocalizedString(self, comment: comment)
}
func localized(with argument: CVarArg = [], comment: String = "") -> String {
return String(format: self.localized(comment: comment), argument)
}
}
이렇게 간단해집니다
// ❌ 사용전
titleLabel.text = String(format: NSLocalizedString(key: "하루하나", comment: "AppName"))
countLabel.text = String(format: NSLocalizedString("등록된챌린지: %d개", comment: "challengeCount"), 101)
// ✅ 사용후
titleLabel.text = "하루하나".localized()
countLabel.text = "등록된챌린지: %d개".localized(with: 101, comment: "challengeCount")
여기까지는 사실 쉽게 적용할 수 있었어요
근데 매번 저 따옴표안에 텍스트를 입력해야한다는 단점이 있고
key값을 잘못 입력하면 값이 key값 그대로 return 된다는 최악의 단점이 존재해서 이걸 해결하고 싶었어요
그래서 찾고 찾아 아래 방법을 적용했습니다
2. I18N Struct 이용기
그리고 I18N Sturct를 만들어주었어요
여담인데 i18n은 internationalization 약자래요
아래처럼 Struct을 만들고 위에서 만든 .localized() 를 이용해서
사용할 키값을 입력하면 엄청나게 깔끔하게 관리가 됩니다
struct I18N {
/* App */
static let appName = "app-name".localized()
static let notiMsg = "noti-msg".localized()
/* Lock Screen*/
static let lockTitle = "lock-title".localized()
static let lockDesc = "lock-desc".localized()
static let lockPlaceholder = "lock-placeholder".localized()
/* 탭 */
static let tabToday = "tab-today".localized()
static let tabRecord = "tab-record".localized()
...
}
이렇게 깔끔해짐!
// 기본사용
titleLabel.text = String(format: NSLocalizedString(key: "하루하나", comment: "AppName"))
// String Extension 적용
titleLabel.text = "하루하나".localized()
// ✅ I18N Sturct 사용
titleLabel.text = I18N.appTitle
매번 key 값을 기억할 필요없이 사용해서 좋더라구요!
번역할때는 텍스트의 양이 어마해져서 생산성 너무 증대되었습니다
3. Localizable 파일 네이밍 전략으로 더 깔끔하게
사실 여기까지만 해도 엄청난 만족이였는데,
사실 그래도 저는 저 이름을 다 기억하는게 너무 최악이였어요...
그래서 Localizable 파일에 네이밍을 아주 아주 체계적으로 해주었습니다.
대분류-(중분류)-소분류
회사에서는 localizaiton에 대해 전문가분들 + 체계를 따로 관리해주시지만
개인앱+사프로 하실때 이방법 추천드립니다.
우선 공용적으로 사용가능한 App, 락스크린, 탭, 버튼은 접두어(대분류) 앞으로 통일했습니다
대분류는 각 Screen 기준입니다.
중분류는 너무 복잡해질때 기능적으로 나누기 위함이고
소분류는 알아서 잘..! 네이밍 하면 되겠죠?
여기까지 텍스트를 가장 깔끔하게 번역해보려고 노력했던 이야기였습니다
저는 처음에 아무생각없이 로컬라이징하다가 중간에 이건 아니다 싶어 체계를 잡게 되었는데요
처음부터 체계를 세운다면 정말 정신건강에 유익하니 추천드립니다..!
또한 귀찮은 작업 중 하나는
localizable 파일의 "key":"value"; 쌍을 매번입력하는게 너무 귀찮았는데요.
이부분에 대한 적용기는 다음에 다룰게요!
ref
https://developer.apple.com/localization/
https://phrase.com/blog/posts/ios-tutorial-internationalization-localization/
https://babbab2.tistory.com/59
https://trilliwon.medium.com/ios에서-localization하는-gorgeous-한-방법-f82ac29d2cfe
'Swift & iOS' 카테고리의 다른 글
[iOS/하루하나] Localization 적용기 2탄 : 앱이름, 사진, 날짜 지역화 (0) | 2023.01.21 |
---|