Sablog Models/모바일·임베디드

strings.xml 로컬화 점검 방법 (How to check strings.xml localization)

어­리 2013. 7. 21. 14:04

안드로이드 SDK에서 l10n은 strings.xml을 이용해 이루어진다. 해외 법인이 따로 있는 회사에서 앱을 개발하는 경우에는 아예 소스 코드를 넘겨서 별도의 앱을 만들어 버리는 경우가 많지만, 규모가 그렇게 크지도 않고 문자열 외의 대대적인 로컬화가 필요가 없다면 res/values locale postfix modifier 사용은 필수적이다. 이럴 경우 트리 메인테이너에게는 언어별 strings.xml을 관리해야 한다는 부담이 작용한다. 개발이 항상 선형으로 이루어질 수는 없기에, 로컬화 담당자가 strings.xml을 들고 왔을 때 무엇이 누락되었을지 찾기 어렵기 때문이다. 주로 이런 문제는 담당 로케일의 QA가 운좋게 찾아내는 게 고작이다.

오픈소스의 경우 얼마나 많은 타깃 언어가 만들어질 것인지 아무도 모르기 때문에 분위기가 다소 자유롭지만, 강제적인 분위기일 뿐 문제는 더욱 귀찮다. 이를테면, 주 언어에서 제거된 항목은 다른 모든 언어에서도 제거되어야 한다. 주 언어에서 새로 만들어진 항목은 다른 언어에도 반영되어야 한다. K-9 Mail의 경우 전자는 perl을 사용해 메인테이너가 관리하고 그 다음에는 번역자가 협조하도록 되어 있으나, 후자에 대해서는 사실상 대책이 없다. 새로 항목을 만들면서 다른 언어마다 주석을 만들어 주는 것도 한계가 있는 것이다.

아래는 K-9 Mail에서 항목을 모두 삭제할 때 사용하는 스크립트이다.

find . -name strings.xml | xargs perl -pi -e's!^\s+<string name="string_name_here".+?</string>\s*\z!!'

다음은 내가 쓰는 스크립트이다. 언어마다 어떤 항목이 들어있는지 수동으로 점검하는 방법이다.

ls res | grep values | while read -d $'\n' fn; do echo $fn; echo `cat res/$fn/strings.xml | grep string_name_here`; done

그러나 이것도 결국 문제가 한두 개일 때 얘기이고, 결국 주 언어와 대상 언어 간에 직접 비교를 할 수밖에 없다. 그래서 찾아낸 방법이다.

  1. 자바스크립트 콘솔을 지원하는 웹브라우저로 두 XML 파일을 연다. 나는 크롬을 사용한다.
  2. var s = document.getElementsByTagName('string')
  3. var a = []; for (var i = 0; i < s.length; i++) a[i] = s[i].getAttribute('name');
  4. a = a.sort().join('\n');
  5. 결과를 텍스트 파일로 저장해서 diff를 돌린다.

결국 name의 정렬된 목록을 뽑아 내서 비교하는 것이다. diff만 가능하다면 자바스크립트만으로 해결하는 방법이 있을 텐데, 없어서 약간 번거로울 수 있다. node를 사용하면 완전 자동화가 될지도 모르겠다.