JSON 언어팩 동작 방식 > WIP

본문 바로가기
사이트 내 전체검색


회원로그인

WIP

WIP | JSON 언어팩 동작 방식

페이지 정보

작성자 CmdList 작성일17-06-14 20:08 조회618회 댓글0건

본문

1. 소스 파일 구조.

   1. ui_language.cpp : json 언어팩을 읽어서 std::unordered_map 배열에 문자열을 저장합니다.

   2. ui_language.h : 헤더 파일 쓰이는 함수는 _(유니코드 분류명, 유니코드 문자열)

       func() : _(wchar_t *category, wchar_t *word)

   3. translate.cpp : windows 리소스를 다국어 문자열로 수정합니다. (메뉴, 대화상자, 탭, 트리뷰 등)

   4. translate.h : TranslateDialog(), TranslateMenu() 등 함수 원형 선언

 

2. JSON 언어팩 사용 방법

   1. 일반 문자열 : _(L"String Table", L"No Selection") 식으로 앞에 분류명을 추가하면 됩니다.

      한국어 : "선택되지 않았습니다.", 일본어 : "選択されていません", 중국어 : "没有选定"

   2. 메뉴 : TranslateMenu(L"Main Menu", GetMenu(hMain));

   3. 대화상자 : TranslateDialog(L"Interface Options", hDlg, lParam, false);

 

3. JSON 언어팩 구조

   JSON 언어팩은 동시에 여러개를 불러올 수 있습니다.

   (파일 편집을 분류해서 나누거나, 하나로 합칠 수 있습니다.)

   load_ui_translation(language_path, language, "ui_core.json;ui_menu.json;ui_dialog.json");

 

  "<keywords>" 안에 있는 것만 읽어오도록 처리합니다. (필요한 정보만 읽습니다.)

  "msgid" : "원본 문자열", "msgstr": "번역 문자열" 방식으로 처리합니다.

   한줄은 다음과 같이 저장합니다.
   { "msgid" : "&File", "msgstr": "파일(&F)" },

   여러 줄은 다음과 같이 저장합니다.
   {
      "msgid" : [

          "1st text",
          "2nd text"

      ],

      "msgstr": [

          "1번째 텍스트",
          "2번째 텍스트"

      ],
  },
  

ui_menu.json 파일 예시 :

{
    "JSON validate" : "https://jsonlint.com/", <--- 이 사이트에서 JSON의 문법을 검사할 수 있습니다.

 

    "<keywords>": [  <--- 아래의 목록만 읽도록 처리합니다.
        "Main Menu",
        "Context Menu",
        "Header Context Menu",
        "Context Menu Tree",
        "Context Screen Shot",
        "String Table"
    ],

 

    "Main Menu": [
        {
            "msgid" : "&File",
            "msgstr": "파일(&F)"
        },
        {
            "msgid" : "&Play",
            "msgstr": "실행(&P)"
        },
        {
            "msgid" : "Play and Record &Input...",
            "msgstr": "실행 및 입력 기록(&I)..."
        }

    ],

   ... (생략) ...

}

 

4. JSON 언어팩은 다음과 같은 함수로 처리해서 문자열을 찾습니다.

using keyword_t  = std::unordered_map<std::wstring, std::wstring>;
using langpack_t = std::unordered_map<std::wstring, keyword_t>;

 

static langpack_t g_ui_translation;

 

const wchar_t *lang_ui_translate(const wchar_t *mode, const wchar_t *word)
{
    if (mode == nullptr || word == nullptr)
    {
        return word;
    }

    if (g_ui_translation.find(mode) == g_ui_translation.end())
    {
        return word;
    }

    if (g_ui_translation[mode].find(word) == g_ui_translation[mode].end())
    {
        return word;
    }

    return g_ui_translation[mode][word].c_str();

댓글목록

등록된 댓글이 없습니다.

WIP 목록

게시물 검색

Copyright © cmdlist.com. All rights reserved.
(Today : 8 / Total : 14,757)

Top