[iOS/OSX] 앱 로컬라이징 하기

nib 파일 로컬라이징

nib 파일을 선택하고 인터페이습 빌더에서 언어를 추가하면 해당 언어로 표시할 nib 파일이 복사된다. 이에 따라 버튼 레이블이나 뷰에 올라가는 이미지와 텍스트를 변경하면 기기에서 설정한 언어에 따라 자동으로 해당 언어의 nib 파일이 선택되어 로컬라이징된 UI를 보여주게 된다.

문자열 테이블

예를 들어 경고창이나 검색 결과 문구에 대해서는 문자열 테이블을 사용하여 로컬라이징한다. 문자열테이블은 .strings 라는 확장자를 가지고 있다. 예를 들어 코코아 앱에서 찾기 패널을 만들었다고 한다면 Find.strings 파일을 각 언어별로 만들어 둘 수 있다. 문자열 테이블은 키-값 쌍의 모음이다. 각각의 키와 값은 겹따옴표로 둘러진다.

이를 코드에서 사용하려면 NSBundle 을 사용해야 한다.

NSBundle *main = [NSBundle mainBundle];
NSString *aString = [main localizedStringForKey:@"Key1" value:@"DefaultValue1" table:@"Find"];

이 코드는 Find.strings 파일에서 Key1 의 키를 찾는다. 만약 값이 발견되지 않았다면 디폴트로 DefaultValue1 이라는 문자열이 된다.

문자열 테이블 만드는 법

Xcode에서 빈 파일을 하나 만든다음, 이름을 Localizable.strings 라고 하고 English.lproj 디렉토리에 저장한다. 파일의 내용은 앞서 설명한 바와 같이 키와 값 쌍으로 입력하며, 각각의 쌍은 세미콜론으로 끝나야 한다.

"DELETE" = "Delete";
"SURE_DELETE" = "Do you really want to delete %d people?";
"CANCEL" = "Cancel";

이제 만들어진 문자열 테이블을 Xcode에서 선택하고, 인스펙터 패널에서 다른 언어 버전을 추가한다. 신규로 추가한 언어를 선택한 다음, 내용을 편집한다.

"DELETE" = "삭제";
"SURE_DELETE" = "%d명의 인원을 삭제하겠습니까?";
"CANCEL" = "취소";

알파벳이 아닌 문자가 있는 경우에는 유니코드로 변환할 것인지 묻는 경우가 있는데 변환을 해야 한다.

이렇게 저장된 문자열은 다음과 같이 사용한다. (문자열 테이블이 하나 밖에 없는 경우) 문자열 테이블이 더 있는 경우에는 테이블 이름도 명시해야 한다.

NSString *deleteString;
deleteString = [[NSBundle mainBundle] localizedStringForKey:@"DELETE" value:@"Delete?" table:nil];

이렇게 쓰는게 상당히 번거롭기 때문에 매크로로 처리할 수도 있다.

#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

이 때, comment 부분은 그냥 무시된다. 하지만 genstrings 툴을 사용할 때, 코멘트를 보고 활용할 수 있다.

ibtool 을 사용하여 nib 생성하기

ibtool 명령은 터미널을 통해 다국어 적용 문자열을 덤프할 수 있는 명령이다. 아래 예는 MyDocument.nib 파일로부터 Doc.strings 파일을 생성해 내는 명령이다.

$ cd SomeProject/English.lproj
$ ibtool --generate-stringsfile Doc.strings MyDocument.nib

이렇게 생성된 string 파일에서 만약 스페인어 버전을 만들겠다면, 스트링 파일의 값들을 수정해준다. 그런 다음,

$ mkdir ../Spanish.lproj
$ ibtool --strings-file Doc.strings --write ../Spanish.lproj/MyDocument.nib MyDocument.nib

즉, 현재 디렉터리의 MyDoument.nib 파일을 Doc.strings 파일을 참고하여 일부 레이블을 번역한 버전을 자동으로 생성하는 것이다.

문자열 포맷의 토큰 순서 변경하기

예를 들어 페이지 번호를 표시한다고 할 때,

NSString *theFormat = NSLocalizedString(@"PAGE", "%d of %d ");
x = [NSString stringWithFormat:theFormat, currentPage, totalPage];

와 같이 포맷팅할 수 있다. 하지만 언어별로는 순서가 달라질 수 있는데, 이는 다음과 같이 문자열 테이블 작성시에 토큰의 순서를 달러 표시와 함께 써서 변경할 수 있다.

"PAGE" = "%2$d 중 %1$d";