WIP | JSON 언어팩 동작 방식
페이지 정보
작성자 CmdList 작성일17-06-14 20:08 조회4,067회 댓글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();
}
댓글목록
등록된 댓글이 없습니다.