[{"data":1,"prerenderedAt":416},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fapi\u002Feduwin-i18n-api":3},{"id":4,"title":5,"body":6,"description":16,"extension":410,"meta":411,"navigation":296,"path":412,"seo":413,"stem":414,"__hash__":415},"content\u002Fdocs\u002Fapi\u002Feduwin-i18n-api.md","eduwin 国际化 API",{"type":7,"value":8,"toc":404},"minimark",[9,13,17,21,38,50,53,181,207,210,219,234,237,246,252,279,282,400],[10,11,5],"h1",{"id":12},"eduwin-国际化-api",[14,15,16],"p",{},"eduwin 提供基于 JSON 文件的轻量多语言支持方案。",[18,19,20],"h2",{"id":20},"初始化",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-c shiki shiki-themes github-light github-dark","void i18n_init(const WCHAR *json_path);\n","c","",[29,30,31],"code",{"__ignoreMap":27},[32,33,36],"span",{"class":34,"line":35},"line",1,[32,37,25],{},[14,39,40,41,45,46,49],{},"加载指定路径的 JSON 翻译文件。文件编码为 ",[42,43,44],"strong",{},"UTF-8","。加载成功后自动读取 ",[29,47,48],{},"current"," 字段作为当前语言。",[14,51,52],{},"JSON 文件格式：",[22,54,58],{"className":55,"code":56,"language":57,"meta":27,"style":27},"language-json shiki shiki-themes github-light github-dark","{\n    \"current\": \"zh\",\n    \"labels\": [\n        {\"id\": \"hello\", \"zh\": \"你好\", \"en\": \"hello\", \"jp\": \"こんにちは\"},\n        {\"id\": \"goodbye\", \"zh\": \"再见\", \"en\": \"goodbye\"}\n    ]\n}\n","json",[29,59,60,66,83,92,138,170,176],{"__ignoreMap":27},[32,61,62],{"class":34,"line":35},[32,63,65],{"class":64},"sVt8B","{\n",[32,67,69,73,76,80],{"class":34,"line":68},2,[32,70,72],{"class":71},"sj4cs","    \"current\"",[32,74,75],{"class":64},": ",[32,77,79],{"class":78},"sZZnC","\"zh\"",[32,81,82],{"class":64},",\n",[32,84,86,89],{"class":34,"line":85},3,[32,87,88],{"class":71},"    \"labels\"",[32,90,91],{"class":64},": [\n",[32,93,95,98,101,103,106,109,111,113,116,118,121,123,125,127,130,132,135],{"class":34,"line":94},4,[32,96,97],{"class":64},"        {",[32,99,100],{"class":71},"\"id\"",[32,102,75],{"class":64},[32,104,105],{"class":78},"\"hello\"",[32,107,108],{"class":64},", ",[32,110,79],{"class":71},[32,112,75],{"class":64},[32,114,115],{"class":78},"\"你好\"",[32,117,108],{"class":64},[32,119,120],{"class":71},"\"en\"",[32,122,75],{"class":64},[32,124,105],{"class":78},[32,126,108],{"class":64},[32,128,129],{"class":71},"\"jp\"",[32,131,75],{"class":64},[32,133,134],{"class":78},"\"こんにちは\"",[32,136,137],{"class":64},"},\n",[32,139,141,143,145,147,150,152,154,156,159,161,163,165,167],{"class":34,"line":140},5,[32,142,97],{"class":64},[32,144,100],{"class":71},[32,146,75],{"class":64},[32,148,149],{"class":78},"\"goodbye\"",[32,151,108],{"class":64},[32,153,79],{"class":71},[32,155,75],{"class":64},[32,157,158],{"class":78},"\"再见\"",[32,160,108],{"class":64},[32,162,120],{"class":71},[32,164,75],{"class":64},[32,166,149],{"class":78},[32,168,169],{"class":64},"}\n",[32,171,173],{"class":34,"line":172},6,[32,174,175],{"class":64},"    ]\n",[32,177,179],{"class":34,"line":178},7,[32,180,169],{"class":64},[182,183,184,190],"ul",{},[185,186,187,189],"li",{},[29,188,48],{}," — 默认语言代码，与 labels 中各条目的字段名对应",[185,191,192,195,196],{},[29,193,194],{},"labels"," — 翻译词条数组\n",[182,197,198,204],{},[185,199,200,203],{},[29,201,202],{},"id"," — 词条唯一标识，程序中通过该 id 引用",[185,205,206],{},"其他字段为各语言的翻译文本，字段名即语言代码",[18,208,209],{"id":209},"切换语言",[22,211,213],{"className":24,"code":212,"language":26,"meta":27,"style":27},"void i18n_set_lang(const char *lang);\n",[29,214,215],{"__ignoreMap":27},[32,216,217],{"class":34,"line":35},[32,218,212],{},[14,220,221,222,225,226,228,229,228,231,233],{},"运行时切换语言，无需重新加载文件。",[29,223,224],{},"lang"," 为语言代码（如 ",[29,227,120],{},"、",[29,230,79],{},[29,232,129],{},"）。",[18,235,236],{"id":236},"获取翻译",[22,238,240],{"className":24,"code":239,"language":26,"meta":27,"style":27},"const WCHAR *i18n_get_str(const char *id);\n",[29,241,242],{"__ignoreMap":27},[32,243,244],{"class":34,"line":35},[32,245,239],{},[14,247,248,249,251],{},"按 ",[29,250,202],{}," 返回当前语言的翻译文字（宽字符串）。查找规则：",[253,254,255,263,266,273],"ol",{},[185,256,257,258,260,261],{},"在 ",[29,259,194],{}," 数组中查找匹配的 ",[29,262,202],{},[185,264,265],{},"找到后读取当前语言对应的字段",[185,267,268,269,272],{},"如果当前语言字段不存在，回退到 ",[29,270,271],{},"zh"," 字段",[185,274,275,276,278],{},"如果仍不存在，返回 ",[29,277,202],{}," 本身",[18,280,281],{"id":281},"完整示例",[22,283,285],{"className":24,"code":284,"language":26,"meta":27,"style":27},"#include \"eduwin.h\"\n\nint main(void)\n{\n    if (init_app() != 0) return 1;\n\n    \u002F* 加载翻译文件 *\u002F\n    i18n_init(L\"lang.json\");\n\n    HWND win = create_window(i18n_get_str(\"title\"), 400, 200);\n    if (!win) return 1;\n\n    HWND label = create_label(win, i18n_get_str(\"hello\"), 20, 20, 360, 30);\n\n    HWND btn = create_button(win, i18n_get_str(\"switch_en\"), 20, 70, 100, 28);\n    on_button_click(btn, switch_en, NULL);\n\n    show_window(win);\n    run_app();\n    return 0;\n}\n",[29,286,287,292,298,303,307,312,316,321,327,332,338,344,349,355,360,366,372,377,383,389,395],{"__ignoreMap":27},[32,288,289],{"class":34,"line":35},[32,290,291],{},"#include \"eduwin.h\"\n",[32,293,294],{"class":34,"line":68},[32,295,297],{"emptyLinePlaceholder":296},true,"\n",[32,299,300],{"class":34,"line":85},[32,301,302],{},"int main(void)\n",[32,304,305],{"class":34,"line":94},[32,306,65],{},[32,308,309],{"class":34,"line":140},[32,310,311],{},"    if (init_app() != 0) return 1;\n",[32,313,314],{"class":34,"line":172},[32,315,297],{"emptyLinePlaceholder":296},[32,317,318],{"class":34,"line":178},[32,319,320],{},"    \u002F* 加载翻译文件 *\u002F\n",[32,322,324],{"class":34,"line":323},8,[32,325,326],{},"    i18n_init(L\"lang.json\");\n",[32,328,330],{"class":34,"line":329},9,[32,331,297],{"emptyLinePlaceholder":296},[32,333,335],{"class":34,"line":334},10,[32,336,337],{},"    HWND win = create_window(i18n_get_str(\"title\"), 400, 200);\n",[32,339,341],{"class":34,"line":340},11,[32,342,343],{},"    if (!win) return 1;\n",[32,345,347],{"class":34,"line":346},12,[32,348,297],{"emptyLinePlaceholder":296},[32,350,352],{"class":34,"line":351},13,[32,353,354],{},"    HWND label = create_label(win, i18n_get_str(\"hello\"), 20, 20, 360, 30);\n",[32,356,358],{"class":34,"line":357},14,[32,359,297],{"emptyLinePlaceholder":296},[32,361,363],{"class":34,"line":362},15,[32,364,365],{},"    HWND btn = create_button(win, i18n_get_str(\"switch_en\"), 20, 70, 100, 28);\n",[32,367,369],{"class":34,"line":368},16,[32,370,371],{},"    on_button_click(btn, switch_en, NULL);\n",[32,373,375],{"class":34,"line":374},17,[32,376,297],{"emptyLinePlaceholder":296},[32,378,380],{"class":34,"line":379},18,[32,381,382],{},"    show_window(win);\n",[32,384,386],{"class":34,"line":385},19,[32,387,388],{},"    run_app();\n",[32,390,392],{"class":34,"line":391},20,[32,393,394],{},"    return 0;\n",[32,396,398],{"class":34,"line":397},21,[32,399,169],{},[401,402,403],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":27,"searchDepth":68,"depth":68,"links":405},[406,407,408,409],{"id":20,"depth":68,"text":20},{"id":209,"depth":68,"text":209},{"id":236,"depth":68,"text":236},{"id":281,"depth":68,"text":281},"md",{},"\u002Fdocs\u002Fapi\u002Feduwin-i18n-api",{"title":5,"description":16},"docs\u002Fapi\u002Feduwin-i18n-api","E0GsjHwtJcBRTaH29oJ6dkD_TlCu46Es3XIveM1sjXE",1782488679849]