[iOS 한글화]어플리케이션 구조를 파악하자![iOS 한글화]어플리케이션 구조를 파악하자!

Posted at 2012. 1. 28. 15:15 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
 강좌 개요

이전 강좌에서 보셨듯이 어플리케이션의 텍스트를 불러올때 외부 파일을 이용하는지, 내부 바이너리에 내장되어 있는지 확인하는 것이 우선입니다.

이번 강좌에서는 어떤 방식으로 텍스트를 불러오는지 확인하는 방법에 대해 소개합니다. 물론 어플리케이션의 개발자가 모두 다르기 때문에 아래 방식으로 모든 어플리케이션의 한글화가 가능한지는 판단할 수는 없습니다.(일부 예외가 있음)

 본 강좌

iOS 어플리케이션의 텍스트 저장방식은 크게 5가지로 나눌 수 있습니다.

1. 외부 언어 파일 이용(lproj)
2. 외부 언어 바이너리 이용(어플리케이션 폴더 내에 내장)

3. 메인 바이너리 내장
4. DLC 파일에 포함(게임 에피소드 등을 인앱결제, iAP 사용하는 어플)
5. 서버 텍스트 이용(인터넷 연결되지 않았을 시 이용 불가한 일부 어플)

첫번째 방식인 외부 언어 파일을 이용할 경우 손쉽게 한글화를 할 수 있으며 순정에서도 패치가 가능합니다. 또한 이 방식을 xcode(ios 어플리케이션 개발 툴)에서 지원하기 때문에 대부분의 어플리케이션이 외부 언어 파일을 이용합니다.

두번째 방식은 외부 언어 바이너리를 사용하는 경우인데 lproj 폴더가 아닌 어플리케이션 메인 경로에 언어 파일들이 들어있는 경우입니다.
이 경우에는 한글화가 가능할 수도 있고 불가능할 수도 있는데 바이너리 파일의 인코딩에 따라 달라집니다. 만약 바이너리 파일이 아스키 코드만을 사용하거나 S-JIS, 중국어등 타국가의 인코딩을 사용할 경우 3번 방식과 같이 메인 바이너리를 수정하지 않으면 한글화가 불가능합니다.


남은 어플리케이션이 나머지 3,4,5번째 방식을 사용할 경우 한글화하기가 매우 어렵습니다.

두번째 방식은 이전 강좌에서 보셧듯이 한글화하려면 바이너리 덤프 과정(이 또한 탈옥 필수)을 거쳐야하며 탈옥을 하지 않으면 패치가 불가능합니다.
세번째 방식은 또 두가지 경우로 나뉘는데 iAP로 추가된 파일에서 텍스트 파일이 따로 분리되어 있으면 구입자에 한해서 패치가 가능할 수도 있습니다.
하지만 텍스트와 인증 파일이 같이 합쳐져 있는 경우 한글화가 어렵습니다.(패치자 자신만 사용 가능)
네번째 방식은 서버에 텍스트가 저장되어 있으므로 한글화가 아예 불가능합니다. hosts 파일 해킹을 통해서 한글화가 가능할 수도 있으나 서버를 직접 구축하여야하며 탈옥 하지 않으면 역시 패치가 불가합니다.

제 블로그의 강좌에서는 위의 방식을 구분하는 간단한 방법과 외부 언어 파일을 이용하는 경우에 한해서만 다루며, 탈옥이 필요한 경우는 다루지 않습니다.

그럼 AppZappPush 어플리케이션을 예로 들어 보겠습니다.

일단 i-Funbox 등의 프로그램을 이용해서 어플리케이션의 경로로 들어갑니다.



경로로 들어가보면 여러 폴더가 보이는데 끝이 lproj 로 시작하는 폴더들이 보이실겁니다. 이 폴더들이 바로 외부 언어 파일을 저장하고 있는 폴더입니다.
lproj 앞에는 언어 약자가 붙는데
English(en).lproj 영어
ko.lproj 한국어
es.lproj 스페인어
fr.lproj 프랑스어
it.lproj 이태리어
ja.lproj 일본어
....
등등 입니다.(더 많은 언어 정보는 http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes 에서 639-1 항목을 보시면 됩니다.)

이 외부 언어 폴더 안에는 텍스트 파일 뿐만 아니라 각 언어별 이미지 파일 등도 들어있습니다. 그리고 언어 폴더가 있어도 텍스트가 포함되어 있지 않은 경우도 있습니다. 이걸 확인하는 방법은 간단합니다. lproj 폴더 내로 들어간다음 Localizable.strings 파일이 존재하는지 확인하시면 됩니다. 물론 이 파일이 있어도 내부 텍스트를 사용하는 경우도 있습니다..
그리고 lproj 폴더가 있음에도 Localizable.strings 파일이 없는 경우에는 lproj 폴더 안에 있는 모든 파일을 확인해서 텍스트가 존재하는지 확인하는 수 밖에는 없습니다. 만약 텍스트가 없는 경우로 확인되면 2,3,4,5번의 경우를 확인하셔야 합니다.
(만약 English.lproj 또는 en.lproj폴더 외에 다른 언어의 폴더도 있는 경우 1번 경우일 가능성이 높습니다.)

그럼 다시 AppZappPush 경로 내의 스크린샷을 보시면 ko.lproj 가 없는 것을 확인하실 수 있습니다. 바로 이 어플리케이션이 한국어 언어 파일을 제공하지 않고 있다는 뜻입니다. iOS의 언어 설정이 한국어로 되어 있지만 ko.lproj 폴더가 없기 때문에 기본 언어인 영어(English.lproj)에서 언어 파일을 불러오게 됩니다.
(* AppZappPush는 특이하게 English.lproj와 en.lproj 두 폴더가 모두 있습니다만 둘다 같은 폴더이므로 크게 상관 없습니다.) 
English.lproj 폴더로 들어가보겠습니다. 


폴더로 들어가보면 Localizable.strings 파일과 여러개의 이미지 파일이 있군요.
저 Localizable.strings 내에 텍스트가 저장되어 있을 가능성이 높아졌습니다.

그럼 이 Localizable.strings를 메모장으로 열어보겠습니다.

이런.. 이 어플리케이션은 바이너리 plist 파일을 사용하는군요.
파일의 맨 앞부분이 bplist로 시작하는 경우 바이너리 plist 파일이며 이 바이너리 plist 파일을 사용하는 경우에는 일반 텍스트 편집기로는 수정할 수 없고 일반 plist 파일로 변환을 하거나 바이너리 plist의 편집을 지원하는 에디터를 사용하여야 합니다.

자세한 수정 방법은 다음 강좌에서 다루겠습니다.


 강좌를 마치며

강좌 내용이 이해가 되셨나요?

오늘 강좌는 lproj를 이용하는 어플리케이션과 아닌 어플리케이션에 대해 소개하고 lproj를 사용하는 어플리케이션의 구조에 대해 알아보았습니다.
lproj를 사용하는 어플리케이션에 대한 강좌가 끝나면 두번째 방식인 외부 바이너리 텍스트 파일을 사용하는 경우에 대해서도 다룰 예정이며 3,4,5번째 방식은 일반적인 방법으로는 한글화가 불가능하므로 넘기도록 하겠습니다.

더 궁금하신 점이 있다면 메일 보내주시면 더 상세히 알려드리겠습니다. 

//