123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194 |
- #include "translation.h"
- #include "io/resource_loader.h"
- #include "os/os.h"
- #include "project_settings.h"
- static const char *locale_list[] = {
- "aa",
- "aa_DJ",
- "aa_ER",
- "aa_ET",
- "af",
- "af_ZA",
- "agr_PE",
- "ak_GH",
- "am_ET",
- "an_ES",
- "anp_IN",
- "ar",
- "ar_AE",
- "ar_BH",
- "ar_DZ",
- "ar_EG",
- "ar_IN",
- "ar_IQ",
- "ar_JO",
- "ar_KW",
- "ar_LB",
- "ar_LY",
- "ar_MA",
- "ar_OM",
- "ar_QA",
- "ar_SA",
- "ar_SD",
- "ar_SS",
- "ar_SY",
- "ar_TN",
- "ar_YE",
- "as_IN",
- "ast_ES",
- "ayc_PE",
- "ay_PE",
- "az_AZ",
- "be",
- "be_BY",
- "bem_ZM",
- "ber_DZ",
- "ber_MA",
- "bg",
- "bg_BG",
- "bhb_IN",
- "bho_IN",
- "bi_TV",
- "bn",
- "bn_BD",
- "bn_IN",
- "bo",
- "bo_CN",
- "bo_IN",
- "br_FR",
- "brx_IN",
- "bs_BA",
- "byn_ER",
- "ca",
- "ca_AD",
- "ca_ES",
- "ca_FR",
- "ca_IT",
- "ce_RU",
- "chr_US",
- "cmn_TW",
- "crh_UA",
- "csb_PL",
- "cs",
- "cs_CZ",
- "cv_RU",
- "cy_GB",
- "da",
- "da_DK",
- "de",
- "de_AT",
- "de_BE",
- "de_CH",
- "de_DE",
- "de_IT",
- "de_LU",
- "doi_IN",
- "dv_MV",
- "dz_BT",
- "el",
- "el_CY",
- "el_GR",
- "en",
- "en_AG",
- "en_AU",
- "en_BW",
- "en_CA",
- "en_DK",
- "en_GB",
- "en_HK",
- "en_IE",
- "en_IL",
- "en_IN",
- "en_NG",
- "en_NZ",
- "en_PH",
- "en_SG",
- "en_US",
- "en_ZA",
- "en_ZM",
- "en_ZW",
- "eo",
- "es",
- "es_AR",
- "es_BO",
- "es_CL",
- "es_CO",
- "es_CR",
- "es_CU",
- "es_DO",
- "es_EC",
- "es_ES",
- "es_GT",
- "es_HN",
- "es_MX",
- "es_NI",
- "es_PA",
- "es_PE",
- "es_PR",
- "es_PY",
- "es_SV",
- "es_US",
- "es_UY",
- "es_VE",
- "et",
- "et_EE",
- "eu",
- "eu_ES",
- "fa",
- "fa_IR",
- "ff_SN",
- "fi",
- "fi_FI",
- "fil_PH",
- "fo_FO",
- "fr",
- "fr_BE",
- "fr_CA",
- "fr_CH",
- "fr_FR",
- "fr_LU",
- "fur_IT",
- "fy_DE",
- "fy_NL",
- "ga",
- "ga_IE",
- "gd_GB",
- "gez_ER",
- "gez_ET",
- "gl_ES",
- "gu_IN",
- "gv_GB",
- "hak_TW",
- "ha_NG",
- "he",
- "he_IL",
- "hi",
- "hi_IN",
- "hne_IN",
- "hr",
- "hr_HR",
- "hsb_DE",
- "ht_HT",
- "hu",
- "hu_HU",
- "hus_MX",
- "hy_AM",
- "ia_FR",
- "id",
- "id_ID",
- "ig_NG",
- "ik_CA",
- "is",
- "is_IS",
- "it",
- "it_CH",
- "it_IT",
- "iu_CA",
- "ja",
- "ja_JP",
- "kab_DZ",
- "ka_GE",
- "kk_KZ",
- "kl_GL",
- "km_KH",
- "kn_IN",
- "kok_IN",
- "ko",
- "ko_KR",
- "ks_IN",
- "ku",
- "ku_TR",
- "kw_GB",
- "ky_KG",
- "lb_LU",
- "lg_UG",
- "li_BE",
- "li_NL",
- "lij_IT",
- "ln_CD",
- "lo_LA",
- "lt",
- "lt_LT",
- "lv",
- "lv_LV",
- "lzh_TW",
- "mag_IN",
- "mai_IN",
- "mg_MG",
- "mh_MH",
- "mhr_RU",
- "mi_NZ",
- "miq_NI",
- "mk",
- "mk_MK",
- "ml_IN",
- "mni_IN",
- "mn_MN",
- "mr_IN",
- "ms",
- "ms_MY",
- "mt",
- "mt_MT",
- "my_MM",
- "myv_RU",
- "nah_MX",
- "nan_TW",
- "nb",
- "nb_NO",
- "nds_DE",
- "nds_NL",
- "ne_NP",
- "nhn_MX",
- "niu_NU",
- "niu_NZ",
- "nl",
- "nl_AW",
- "nl_BE",
- "nl_NL",
- "nn",
- "nn_NO",
- "nr_ZA",
- "nso_ZA",
- "oc_FR",
- "om",
- "om_ET",
- "om_KE",
- "or_IN",
- "os_RU",
- "pa_IN",
- "pap",
- "pap_AN",
- "pap_AW",
- "pap_CW",
- "pa_PK",
- "pl",
- "pl_PL",
- "pr",
- "ps_AF",
- "pt",
- "pt_BR",
- "pt_PT",
- "quy_PE",
- "quz_PE",
- "raj_IN",
- "ro",
- "ro_RO",
- "ru",
- "ru_RU",
- "ru_UA",
- "rw_RW",
- "sa_IN",
- "sat_IN",
- "sc_IT",
- "sco",
- "sd_IN",
- "se_NO",
- "sgs_LT",
- "shs_CA",
- "sid_ET",
- "si_LK",
- "sk",
- "sk_SK",
- "sl",
- "sl_SI",
- "so",
- "so_DJ",
- "so_ET",
- "so_KE",
- "so_SO",
- "son_ML",
- "sq",
- "sq_AL",
- "sq_KV",
- "sq_MK",
- "sr",
- "sr_Cyrl",
- "sr_ME",
- "sr_RS",
- "ss_ZA",
- "st_ZA",
- "sv",
- "sv_FI",
- "sv_SE",
- "sw_KE",
- "sw_TZ",
- "szl_PL",
- "ta",
- "ta_IN",
- "ta_LK",
- "tcy_IN",
- "te_IN",
- "tg_TJ",
- "the_NP",
- "th",
- "th_TH",
- "ti",
- "ti_ER",
- "ti_ET",
- "tig_ER",
- "tk_TM",
- "tl_PH",
- "tn_ZA",
- "tr",
- "tr_CY",
- "tr_TR",
- "ts_ZA",
- "tt_RU",
- "ug_CN",
- "uk",
- "uk_UA",
- "unm_US",
- "ur",
- "ur_IN",
- "ur_PK",
- "uz",
- "uz_UZ",
- "ve_ZA",
- "vi",
- "vi_VN",
- "wa_BE",
- "wae_CH",
- "wal_ET",
- "wo_SN",
- "xh_ZA",
- "yi_US",
- "yo_NG",
- "yue_HK",
- "zh",
- "zh_CN",
- "zh_HK",
- "zh_SG",
- "zh_TW",
- "zu_ZA",
- 0
- };
- static const char *locale_names[] = {
- "Afar",
- "Afar (Djibouti)",
- "Afar (Eritrea)",
- "Afar (Ethiopia)",
- "Afrikaans",
- "Afrikaans (South Africa)",
- "Aguaruna (Peru)",
- "Akan (Ghana)",
- "Amharic (Ethiopia)",
- "Aragonese (Spain)",
- "Angika (India)",
- "Arabic",
- "Arabic (United Arab Emirates)",
- "Arabic (Bahrain)",
- "Arabic (Algeria)",
- "Arabic (Egypt)",
- "Arabic (India)",
- "Arabic (Iraq)",
- "Arabic (Jordan)",
- "Arabic (Kuwait)",
- "Arabic (Lebanon)",
- "Arabic (Libya)",
- "Arabic (Morocco)",
- "Arabic (Oman)",
- "Arabic (Qatar)",
- "Arabic (Saudi Arabia)",
- "Arabic (Sudan)",
- "Arabic (South Soudan)",
- "Arabic (Syria)",
- "Arabic (Tunisia)",
- "Arabic (Yemen)",
- "Assamese (India)",
- "Asturian (Spain)",
- "Southern Aymara (Peru)",
- "Aymara (Peru)",
- "Azerbaijani (Azerbaijan)",
- "Belarusian",
- "Belarusian (Belarus)",
- "Bemba (Zambia)",
- "Berber languages (Algeria)",
- "Berber languages (Morocco)",
- "Bulgarian",
- "Bulgarian (Bulgaria)",
- "Bhili (India)",
- "Bhojpuri (India)",
- "Bislama (Tuvalu)",
- "Bengali",
- "Bengali (Bangladesh)",
- "Bengali (India)",
- "Tibetan",
- "Tibetan (China)",
- "Tibetan (India)",
- "Breton (France)",
- "Bodo (India)",
- "Bosnian (Bosnia and Herzegovina)",
- "Bilin (Eritrea)",
- "Catalan",
- "Catalan (Andorra)",
- "Catalan (Spain)",
- "Catalan (France)",
- "Catalan (Italy)",
- "Chechen (Russia)",
- "Cherokee (United States)",
- "Mandarin Chinese (Taiwan)",
- "Crimean Tatar (Ukraine)",
- "Kashubian (Poland)",
- "Czech",
- "Czech (Czech Republic)",
- "Chuvash (Russia)",
- "Welsh (United Kingdom)",
- "Danish",
- "Danish (Denmark)",
- "German",
- "German (Austria)",
- "German (Belgium)",
- "German (Switzerland)",
- "German (Germany)",
- "German (Italy)",
- "German (Luxembourg)",
- "Dogri (India)",
- "Dhivehi (Maldives)",
- "Dzongkha (Bhutan)",
- "Greek",
- "Greek (Cyprus)",
- "Greek (Greece)",
- "English",
- "English (Antigua and Barbuda)",
- "English (Australia)",
- "English (Botswana)",
- "English (Canada)",
- "English (Denmark)",
- "English (United Kingdom)",
- "English (Hong Kong)",
- "English (Ireland)",
- "English (Israel)",
- "English (India)",
- "English (Nigeria)",
- "English (New Zealand)",
- "English (Philippines)",
- "English (Singapore)",
- "English (United States)",
- "English (South Africa)",
- "English (Zambia)",
- "English (Zimbabwe)",
- "Esperanto",
- "Spanish",
- "Spanish (Argentina)",
- "Spanish (Bolivia)",
- "Spanish (Chile)",
- "Spanish (Colombia)",
- "Spanish (Costa Rica)",
- "Spanish (Cuba)",
- "Spanish (Dominican Republic)",
- "Spanish (Ecuador)",
- "Spanish (Spain)",
- "Spanish (Guatemala)",
- "Spanish (Honduras)",
- "Spanish (Mexico)",
- "Spanish (Nicaragua)",
- "Spanish (Panama)",
- "Spanish (Peru)",
- "Spanish (Puerto Rico)",
- "Spanish (Paraguay)",
- "Spanish (El Salvador)",
- "Spanish (United States)",
- "Spanish (Uruguay)",
- "Spanish (Venezuela)",
- "Estonian",
- "Estonian (Estonia)",
- "Basque",
- "Basque (Spain)",
- "Persian",
- "Persian (Iran)",
- "Fulah (Senegal)",
- "Finnish",
- "Finnish (Finland)",
- "Filipino (Philippines)",
- "Faroese (Faroe Islands)",
- "French",
- "French (Belgium)",
- "French (Canada)",
- "French (Switzerland)",
- "French (France)",
- "French (Luxembourg)",
- "Friulian (Italy)",
- "Western Frisian (Germany)",
- "Western Frisian (Netherlands)",
- "Irish",
- "Irish (Ireland)",
- "Scottish Gaelic (United Kingdom)",
- "Geez (Eritrea)",
- "Geez (Ethiopia)",
- "Galician (Spain)",
- "Gujarati (India)",
- "Manx (United Kingdom)",
- "Hakka Chinese (Taiwan)",
- "Hausa (Nigeria)",
- "Hebrew",
- "Hebrew (Israel)",
- "Hindi",
- "Hindi (India)",
- "Chhattisgarhi (India)",
- "Croatian",
- "Croatian (Croatia)",
- "Upper Sorbian (Germany)",
- "Haitian (Haiti)",
- "Hungarian",
- "Hungarian (Hungary)",
- "Huastec (Mexico)",
- "Armenian (Armenia)",
- "Interlingua (France)",
- "Indonesian",
- "Indonesian (Indonesia)",
- "Igbo (Nigeria)",
- "Inupiaq (Canada)",
- "Icelandic",
- "Icelandic (Iceland)",
- "Italian",
- "Italian (Switzerland)",
- "Italian (Italy)",
- "Inuktitut (Canada)",
- "Japanese",
- "Japanese (Japan)",
- "Kabyle (Algeria)",
- "Georgian (Georgia)",
- "Kazakh (Kazakhstan)",
- "Kalaallisut (Greenland)",
- "Central Khmer (Cambodia)",
- "Kannada (India)",
- "Konkani (India)",
- "Korean",
- "Korean (South Korea)",
- "Kashmiri (India)",
- "Kurdish",
- "Kurdish (Turkey)",
- "Cornish (United Kingdom)",
- "Kirghiz (Kyrgyzstan)",
- "Luxembourgish (Luxembourg)",
- "Ganda (Uganda)",
- "Limburgan (Belgium)",
- "Limburgan (Netherlands)",
- "Ligurian (Italy)",
- "Lingala (Congo)",
- "Lao (Laos)",
- "Lithuanian",
- "Lithuanian (Lithuania)",
- "Latvian",
- "Latvian (Latvia)",
- "Literary Chinese (Taiwan)",
- "Magahi (India)",
- "Maithili (India)",
- "Malagasy (Madagascar)",
- "Marshallese (Marshall Islands)",
- "Eastern Mari (Russia)",
- "Maori (New Zealand)",
- "Mískito (Nicaragua)",
- "Macedonian",
- "Macedonian (Macedonia)",
- "Malayalam (India)",
- "Manipuri (India)",
- "Mongolian (Mongolia)",
- "Marathi (India)",
- "Malay",
- "Malay (Malaysia)",
- "Maltese",
- "Maltese (Malta)",
- "Burmese (Myanmar)",
- "Erzya (Russia)",
- "Nahuatl languages (Mexico)",
- "Min Nan Chinese (Taiwan)",
- "Norwegian Bokmål",
- "Norwegian Bokmål (Norway)",
- "Low German (Germany)",
- "Low German (Netherlands)",
- "Nepali (Nepal)",
- "Central Nahuatl (Mexico)",
- "Niuean (Niue)",
- "Niuean (New Zealand)",
- "Dutch",
- "Dutch (Aruba)",
- "Dutch (Belgium)",
- "Dutch (Netherlands)",
- "Norwegian Nynorsk",
- "Norwegian Nynorsk (Norway)",
- "South Ndebele (South Africa)",
- "Pedi (South Africa)",
- "Occitan (France)",
- "Oromo",
- "Oromo (Ethiopia)",
- "Oromo (Kenya)",
- "Oriya (India)",
- "Ossetian (Russia)",
- "Panjabi (India)",
- "Papiamento",
- "Papiamento (Netherlands Antilles)",
- "Papiamento (Aruba)",
- "Papiamento (Curaçao)",
- "Panjabi (Pakistan)",
- "Polish",
- "Polish (Poland)",
- "Pirate",
- "Pushto (Afghanistan)",
- "Portuguese",
- "Portuguese (Brazil)",
- "Portuguese (Portugal)",
- "Ayacucho Quechua (Peru)",
- "Cusco Quechua (Peru)",
- "Rajasthani (India)",
- "Romanian",
- "Romanian (Romania)",
- "Russian",
- "Russian (Russia)",
- "Russian (Ukraine)",
- "Kinyarwanda (Rwanda)",
- "Sanskrit (India)",
- "Santali (India)",
- "Sardinian (Italy)",
- "Scots (Scotland)",
- "Sindhi (India)",
- "Northern Sami (Norway)",
- "Samogitian (Lithuania)",
- "Shuswap (Canada)",
- "Sidamo (Ethiopia)",
- "Sinhala (Sri Lanka)",
- "Slovak",
- "Slovak (Slovakia)",
- "Slovenian",
- "Slovenian (Slovenia)",
- "Somali",
- "Somali (Djibouti)",
- "Somali (Ethiopia)",
- "Somali (Kenya)",
- "Somali (Somalia)",
- "Songhai languages (Mali)",
- "Albanian",
- "Albanian (Albania)",
- "Albanian (Kosovo)",
- "Albanian (Macedonia)",
- "Serbian",
- "Serbian (Cyrillic)",
- "Serbian (Montenegro)",
- "Serbian (Serbia)",
- "Swati (South Africa)",
- "Southern Sotho (South Africa)",
- "Swedish",
- "Swedish (Finland)",
- "Swedish (Sweden)",
- "Swahili (Kenya)",
- "Swahili (Tanzania)",
- "Silesian (Poland)",
- "Tamil",
- "Tamil (India)",
- "Tamil (Sri Lanka)",
- "Tulu (India)",
- "Telugu (India)",
- "Tajik (Tajikistan)",
- "Chitwania Tharu (Nepal)",
- "Thai",
- "Thai (Thailand)",
- "Tigrinya",
- "Tigrinya (Eritrea)",
- "Tigrinya (Ethiopia)",
- "Tigre (Eritrea)",
- "Turkmen (Turkmenistan)",
- "Tagalog (Philippines)",
- "Tswana (South Africa)",
- "Turkish",
- "Turkish (Cyprus)",
- "Turkish (Turkey)",
- "Tsonga (South Africa)",
- "Tatar (Russia)",
- "Uighur (China)",
- "Ukrainian",
- "Ukrainian (Ukraine)",
- "Unami (United States)",
- "Urdu",
- "Urdu (India)",
- "Urdu (Pakistan)",
- "Uzbek",
- "Uzbek (Uzbekistan)",
- "Venda (South Africa)",
- "Vietnamese",
- "Vietnamese (Vietnam)",
- "Walloon (Belgium)",
- "Walser (Switzerland)",
- "Wolaytta (Ethiopia)",
- "Wolof (Senegal)",
- "Xhosa (South Africa)",
- "Yiddish (United States)",
- "Yoruba (Nigeria)",
- "Yue Chinese (Hong Kong)",
- "Chinese",
- "Chinese (China)",
- "Chinese (Hong Kong)",
- "Chinese (Singapore)",
- "Chinese (Taiwan)",
- "Zulu (South Africa)",
- 0
- };
- static const char *locale_renames[][2] = {
- { "in", "id" },
- { "iw", "he" },
- { "no", "nb" },
- { NULL, NULL }
- };
- static String get_trimmed_locale(const String &p_locale) {
- return p_locale.substr(0, 2);
- }
- PoolVector<String> Translation::_get_messages() const {
- PoolVector<String> msgs;
- msgs.resize(translation_map.size() * 2);
- int idx = 0;
- for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
- msgs.set(idx + 0, E->key());
- msgs.set(idx + 1, E->get());
- idx += 2;
- }
- return msgs;
- }
- PoolVector<String> Translation::_get_message_list() const {
- PoolVector<String> msgs;
- msgs.resize(translation_map.size());
- int idx = 0;
- for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
- msgs.set(idx, E->key());
- idx += 1;
- }
- return msgs;
- }
- void Translation::_set_messages(const PoolVector<String> &p_messages) {
- int msg_count = p_messages.size();
- ERR_FAIL_COND(msg_count % 2);
- PoolVector<String>::Read r = p_messages.read();
- for (int i = 0; i < msg_count; i += 2) {
- add_message(r[i + 0], r[i + 1]);
- }
- }
- void Translation::set_locale(const String &p_locale) {
- String univ_locale = TranslationServer::standardize_locale(p_locale);
- if (!TranslationServer::is_locale_valid(univ_locale)) {
- String trimmed_locale = get_trimmed_locale(univ_locale);
- ERR_EXPLAIN("Invalid locale: " + trimmed_locale);
- ERR_FAIL_COND(!TranslationServer::is_locale_valid(trimmed_locale));
- locale = trimmed_locale;
- } else {
- locale = univ_locale;
- }
- if (OS::get_singleton()->get_main_loop()) {
- OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_TRANSLATION_CHANGED);
- }
- }
- void Translation::add_message(const StringName &p_src_text, const StringName &p_xlated_text) {
- translation_map[p_src_text] = p_xlated_text;
- }
- StringName Translation::get_message(const StringName &p_src_text) const {
- const Map<StringName, StringName>::Element *E = translation_map.find(p_src_text);
- if (!E)
- return StringName();
- return E->get();
- }
- void Translation::erase_message(const StringName &p_src_text) {
- translation_map.erase(p_src_text);
- }
- void Translation::get_message_list(List<StringName> *r_messages) const {
- for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
- r_messages->push_back(E->key());
- }
- }
- int Translation::get_message_count() const {
- return translation_map.size();
- };
- void Translation::_bind_methods() {
- ClassDB::bind_method(D_METHOD("set_locale", "locale"), &Translation::set_locale);
- ClassDB::bind_method(D_METHOD("get_locale"), &Translation::get_locale);
- ClassDB::bind_method(D_METHOD("add_message", "src_message", "xlated_message"), &Translation::add_message);
- ClassDB::bind_method(D_METHOD("get_message", "src_message"), &Translation::get_message);
- ClassDB::bind_method(D_METHOD("erase_message", "src_message"), &Translation::erase_message);
- ClassDB::bind_method(D_METHOD("get_message_list"), &Translation::_get_message_list);
- ClassDB::bind_method(D_METHOD("get_message_count"), &Translation::get_message_count);
- ClassDB::bind_method(D_METHOD("_set_messages"), &Translation::_set_messages);
- ClassDB::bind_method(D_METHOD("_get_messages"), &Translation::_get_messages);
- ADD_PROPERTY(PropertyInfo(Variant::POOL_STRING_ARRAY, "messages", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_messages", "_get_messages");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "locale"), "set_locale", "get_locale");
- }
- Translation::Translation() :
- locale("en") {
- }
- bool TranslationServer::is_locale_valid(const String &p_locale) {
- const char **ptr = locale_list;
- while (*ptr) {
- if (*ptr == p_locale)
- return true;
- ptr++;
- }
- return false;
- }
- String TranslationServer::standardize_locale(const String &p_locale) {
-
- String univ_locale = p_locale.replace("-", "_");
-
- int idx = 0;
- while (locale_renames[idx][0] != NULL) {
- if (locale_renames[idx][0] == univ_locale) {
- univ_locale = locale_renames[idx][1];
- break;
- }
- idx++;
- }
- return univ_locale;
- }
- void TranslationServer::set_locale(const String &p_locale) {
- String univ_locale = standardize_locale(p_locale);
- if (!is_locale_valid(univ_locale)) {
- String trimmed_locale = get_trimmed_locale(univ_locale);
- ERR_EXPLAIN("Invalid locale: " + trimmed_locale);
- ERR_FAIL_COND(!is_locale_valid(trimmed_locale));
- locale = trimmed_locale;
- } else {
- locale = univ_locale;
- }
- if (OS::get_singleton()->get_main_loop()) {
- OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_TRANSLATION_CHANGED);
- }
- ResourceLoader::reload_translation_remaps();
- }
- String TranslationServer::get_locale() const {
- return locale;
- }
- String TranslationServer::get_locale_name(const String &p_locale) const {
- if (!locale_name_map.has(p_locale)) return String();
- return locale_name_map[p_locale];
- }
- Vector<String> TranslationServer::get_all_locales() {
- Vector<String> locales;
- const char **ptr = locale_list;
- while (*ptr) {
- locales.push_back(*ptr);
- ptr++;
- }
- return locales;
- }
- Vector<String> TranslationServer::get_all_locale_names() {
- Vector<String> locales;
- const char **ptr = locale_names;
- while (*ptr) {
- locales.push_back(String::utf8(*ptr));
- ptr++;
- }
- return locales;
- }
- void TranslationServer::add_translation(const Ref<Translation> &p_translation) {
- translations.insert(p_translation);
- }
- void TranslationServer::remove_translation(const Ref<Translation> &p_translation) {
- translations.erase(p_translation);
- }
- void TranslationServer::clear() {
- translations.clear();
- };
- StringName TranslationServer::translate(const StringName &p_message) const {
-
- if (!enabled)
- return p_message;
- StringName res;
- bool near_match = false;
- const CharType *lptr = &locale[0];
- for (const Set<Ref<Translation> >::Element *E = translations.front(); E; E = E->next()) {
- const Ref<Translation> &t = E->get();
- String l = t->get_locale();
- if (lptr[0] != l[0] || lptr[1] != l[1])
- continue;
-
- bool match = (l != locale);
- if (near_match && !match)
- continue;
- StringName r = t->get_message(p_message);
- if (!r)
- continue;
- res = r;
- if (match)
- break;
- else
- near_match = true;
- }
- if (!res) {
-
- if (fallback.length() >= 2) {
- const CharType *fptr = &fallback[0];
- bool near_match = false;
- for (const Set<Ref<Translation> >::Element *E = translations.front(); E; E = E->next()) {
- const Ref<Translation> &t = E->get();
- String l = t->get_locale();
- if (fptr[0] != l[0] || fptr[1] != l[1])
- continue;
-
- bool match = (l != fallback);
- if (near_match && !match)
- continue;
- StringName r = t->get_message(p_message);
- if (!r)
- continue;
- res = r;
- if (match)
- break;
- else
- near_match = true;
- }
- }
- }
- if (!res)
- return p_message;
- return res;
- }
- TranslationServer *TranslationServer::singleton = NULL;
- bool TranslationServer::_load_translations(const String &p_from) {
- if (ProjectSettings::get_singleton()->has_setting(p_from)) {
- PoolVector<String> translations = ProjectSettings::get_singleton()->get(p_from);
- int tcount = translations.size();
- if (tcount) {
- PoolVector<String>::Read r = translations.read();
- for (int i = 0; i < tcount; i++) {
-
- Ref<Translation> tr = ResourceLoader::load(r[i]);
- if (tr.is_valid())
- add_translation(tr);
- }
- }
- return true;
- }
- return false;
- }
- void TranslationServer::setup() {
- String test = GLOBAL_DEF("locale/test", "");
- test = test.strip_edges();
- if (test != "")
- set_locale(test);
- else
- set_locale(OS::get_singleton()->get_locale());
- fallback = GLOBAL_DEF("locale/fallback", "en");
- #ifdef TOOLS_ENABLED
- {
- String options = "";
- int idx = 0;
- while (locale_list[idx]) {
- if (idx > 0)
- options += ",";
- options += locale_list[idx];
- idx++;
- }
- ProjectSettings::get_singleton()->set_custom_property_info("locale/fallback", PropertyInfo(Variant::STRING, "locale/fallback", PROPERTY_HINT_ENUM, options));
- }
- #endif
-
- }
- void TranslationServer::set_tool_translation(const Ref<Translation> &p_translation) {
- tool_translation = p_translation;
- }
- StringName TranslationServer::tool_translate(const StringName &p_message) const {
- if (tool_translation.is_valid()) {
- StringName r = tool_translation->get_message(p_message);
- if (r) {
- return r;
- }
- }
- return p_message;
- }
- void TranslationServer::_bind_methods() {
- ClassDB::bind_method(D_METHOD("set_locale", "locale"), &TranslationServer::set_locale);
- ClassDB::bind_method(D_METHOD("get_locale"), &TranslationServer::get_locale);
- ClassDB::bind_method(D_METHOD("get_locale_name", "locale"), &TranslationServer::get_locale_name);
- ClassDB::bind_method(D_METHOD("translate", "message"), &TranslationServer::translate);
- ClassDB::bind_method(D_METHOD("add_translation", "translation"), &TranslationServer::add_translation);
- ClassDB::bind_method(D_METHOD("remove_translation", "translation"), &TranslationServer::remove_translation);
- ClassDB::bind_method(D_METHOD("clear"), &TranslationServer::clear);
- }
- void TranslationServer::load_translations() {
- String locale = get_locale();
- bool found = _load_translations("locale/translations");
- if (_load_translations("locale/translations_" + locale.substr(0, 2)))
- found = true;
- if (locale.substr(0, 2) != locale) {
- if (_load_translations("locale/translations_" + locale))
- found = true;
- }
- }
- TranslationServer::TranslationServer() :
- locale("en"),
- enabled(true) {
- singleton = this;
- for (int i = 0; locale_list[i]; ++i) {
- locale_name_map.insert(locale_list[i], String::utf8(locale_names[i]));
- }
- }
|