다국어를 지원 하나 방법은 여러가지가 있으나 간단하게 언어 텍스트를 개별 언어 파일에서 로드해서 UI에 반영하는 방식을 생각해 보자.
예를 들어 로그인창에 "아이디", "패스워드"라는 텍스트가 있다면 ko-KR.xml과 en-US.xml 파일을 아래처럼 만들 수 있다.
ko-KR.xml
<?xml version='1.0' encoding='UTF-8'?>
<resource>
<string id='login.id'>
<![CDATA[아이디]]>
</string>
<string id='login.pw'>
<![CDATA[패스워드
안녕하세요!]]>
</string>
</resource>
en-US.xml
<?xml version='1.0' encoding='UTF-8'?>
<resource>
<string id='login.id'>
<![CDATA[ID]]>
</string>
<string id='login.pw'>
<![CDATA[Password]]>
</string>
</resource>
지원하는 언어권이 많아지면 관리하기가 복잡해지므로 간단한 툴을 하나 만들어보았다.
최근에 루비라는 언어를 공부하고 있는데 루비를 이용해서 엑셀파일에서 각 언어권 xml 파일을 생성하는 스크립트를 만들었다.
language_table.xlsx 파일의 내용은 아래와 같다고 할때.
gen_localexml.rb 파일을 실행하면 ko-KR.xml, en-US.xml, jp-JP.xml 파일이 생성된다.
# -*- coding: utf-8 -*-
require 'rexml/document'
=begin
다국어 리소스 xml 파일 생성
keys: 스트링 키 리스트
lang: 언어 리스트, 0번째는 ko-KR 값은 언어종류
=end
def generate_xmlfile(keys, lang)
doc2 = REXML::Document.new ("<?xml version='1.0' encoding='UTF-8'?>")
root = doc2.add_element("resource")
for i in (1..keys.length-1)
root.add_element("string", {"id"=>"#{keys[i]}"}) . text = REXML::CData.new( "#{lang[i]}" )
end
xml = ''
doc2.write(xml, 2)
File.write( "#{lang[0]}.xml", xml.encode('UTF-8') )
p "generate #{lang[0]}.xml"
end
require 'win32ole'
excel = WIN32OLE::new('excel.Application')
excel_path = ARGV[0]
p "open #{excel_path}"
workbook = excel.Workbooks.Open( excel_path )
worksheet = workbook.Worksheets(1)
# load string id
keys = []
for i in (1..100000)
val = worksheet.Cells(i,1).Value
str = val.to_s
if str.length == 0 then break end
keys.push(str)
end
# load language
for i in (2..100)
size = keys.length
lang = []
# 첫 ROW가 비어있으면 break
l = worksheet.Cells(1, i).Value.to_s
if l.length == 0 then break end
for j in (1..size)
val = worksheet.Cells(j, i).Value
str = val.to_s
lang.push(str)
# 값이 없는것 워닝노출
if str.length == 0 then
p "------> warning #{l} #{keys[j-1]} is empty!"
end
end
generate_xmlfile(keys, lang)
end
excel.Quit()
실행결과는 아래와 같다. 언어 텍스트가 없는 아이디에 대해서는 경고를 뿌려준다.
xml 파일을 손수 편집할 필요가 없으며 문자열 수정이나 추가 삭제가 필요한 경우 엑셀파일을 수정하면 된다.
E:\Down2\locale_test>"c:\Ruby200\bin\ruby.exe" gen_localexml.rb "E:\Down2\locale
_test\language_table.xlsx"
"open E:\\Down2\\locale_test\\language_table.xlsx"
"generate ko-KR.xml"
"generate en-US.xml"
"------> warning jp-JP login.id is empty!"
"------> warning jp-JP login.pw is empty!"
"generate jp-JP.xml"
E:\Down2\locale_test>if not 0 == 0 goto error
E:\Down2\locale_test>echo "generate local xml [OK]"
"generate local xml [OK]"
E:\Down2\locale_test>exit /b 0
이 코드를 이용하여 sdp 프로젝트에 다국어를 지원을 쉽게 구현할 수 있을 것이다.