개발팁2018. 11. 7. 11:58

자바스크립트에서 다국어 지원을 위한, 라이브러리로 i18n 을 사용하다면,


다국어 text 정의는, 언어 key 와 언어 text 쌍의 json 파일로 관리가 된다.


i18n.t('key.key2.key3')


특정 key 를 현재 언어의 다국어 text 로 변환할때, 위와 같이 javascript 에서 사용하거나,


<span data-i18n='key.key2.key3'></span>


위와 같이 태그 안에서 직접 key 를 호출할 수 있다.



만약, 현재언어의 key.key2.key3 라는 키가 없다면, 대체 text 가 출력되거나, 기본 언어(default language) 의 key 를 찾아서, text 를 출력하게 된다.



누락된 key 가 있는지, 각 언어마다 빠진 데이터가 있는지를 찾아내기는 힘든일이다.


이때, 누락된 데이터가 나오면, 자동으로 알려준다면, 얼마나 쉽게 빠진 text 를 추가할 수 있겠는가..


i18n의 sendMissing 이라는 기능을 이용하면, 쉽게 누락데이터를 관리할 수 있다.



i18n 초기화 함수인 $.i18n.init 의 option 으로 아래와 같은 코드를 작성하면 된다.



        sendMissing: true,              // 번역데이터가 없을때 서버에 전송한다.

        sendMissingTo: 'fallback',

        resPostPath: '/System/I18nMissingKey_Insert'    // 번역데이터가 없을때 서버에 POST 로 넘겨주는 URL


위의 코드 의미는, 누락데이터가 발생했을떼, 웹서버의 /System/I18nMissingKey_Insert 주소로 POST (포스팅) 을 하게 된다.


웹서버는 닷넷이든 자바이든 상관없이, form 방식의 post 데이터를 받아서 처리하면 된다.


실제 서버로 전송되는 데이터는 name / value 의 form data 이고, 아래와 같은 형태이다.


key1.key2.key3=기본text


FORM 데이터의 name 값이 정해진 값이 아니라, key 값을 그대로 전송하기 때문에, form 객체에서 첫번째 항목을 읽어서 처리하면 되겠다.


실제 ASP.NET MVC 에서 Form ModelBinder 로 받아서 첫번째 항목을 DB 에 저장하는 소스이다.

사용하는 언어에 맞게 코딩하면 된다.



        [HttpPost]

        public JsonResult I18nMissingKey_Insert([ModelBinder(typeof(FormRequestModelBinder))] JObject reqParam)

        {

            dynamic param = new

            {

                TKey = ((Newtonsoft.Json.Linq.JProperty)(reqParam.First)).Name, // Request 값중에 첫번째 값을 가져온다.

                DefaultValue = reqParam[((Newtonsoft.Json.Linq.JProperty)(reqParam.First)).Name].ToString(),

                LangCode = this.GetCurrentLang()

            };


            SpotResult result = (new Biz_I18nMissingKey()).Insert(param);


            return Json(result);

        } 

 



아래 화면은 실제 DB 에 저장된, 누락데이터를 조회하고, 등록하는 기능이다.

각 언어별 json 파일로 분리해서 저장하고 있다.




위 코드는 누락된 i18n 데이터만을 관리하고 있지만,


실제, i18n 으로 번역 key / text 를 각각의 json 파일로 관리하는것은 쉽지가 않다.


이를 편하게 관리하기 위해, 각각의 json 파일을 merge 해서, 하나의 datatable 로 관리하도록 한 화면이다.




Posted by 헝개