github.com/saferwall/pe@v1.5.2/resource.go (about) 1 // Copyright 2018 Saferwall. All rights reserved. 2 // Use of this source code is governed by Apache v2 license 3 // license that can be found in the LICENSE file. 4 5 package pe 6 7 import ( 8 "encoding/binary" 9 ) 10 11 // ResourceType represents a resource type. 12 type ResourceType int 13 14 // ResourceLang represents a resource language. 15 type ResourceLang uint32 16 17 // ResourceSubLang represents a resource sub language. 18 type ResourceSubLang uint32 19 20 // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f 21 22 // Special resource (sub)language identifiers. 23 const ( 24 LangNeutral ResourceLang = 0x00 // Default custom (MUI) locale language 25 LangUserDefault ResourceLang = 0x01 // User default locale language 26 LangSystemDefault ResourceLang = 0x02 // System default locale language 27 LangInvariant ResourceLang = 0x7F // Invariant locale language 28 29 SubLangNeutral ResourceSubLang = 0x00 // Neutral sub-language 30 SubLangInvariant ResourceSubLang = 0x00 // Invariant sub-language 31 SubLangDefault ResourceSubLang = 0x01 // User default sub-language 32 SubLangSysDefault ResourceSubLang = 0x02 // System default sub-language 33 SubLangCustomDefault ResourceSubLang = 0x03 // Default custom sub-language 34 SubLangCustomUnspecified ResourceSubLang = 0x04 // Unspecified custom sub-language 35 SubLangMUICustomDefault ResourceSubLang = 0x05 // Default custom MUI sub-language 36 ) 37 38 // All resource language identifiers. 39 const ( 40 // Afrikaans (af) 41 LangAfrikaans ResourceLang = 0x0036 42 // Albanian (sq) 43 LangAlbanian ResourceLang = 0x001C 44 // Alsatian (gsw) 45 LangAlsatian ResourceLang = 0x0084 46 // Amharic (am) 47 LangAmharic ResourceLang = 0x005E 48 // Arabic (ar) 49 LangArabic ResourceLang = 0x0001 50 // Armenian (hy) 51 LangArmenian ResourceLang = 0x002B 52 // Assamese (as) 53 LangAssamese ResourceLang = 0x004D 54 // Azerbaijani (Latin) (az) 55 LangAzerbaijaniLatin ResourceLang = 0x002C 56 // Bangla (bn) 57 LangBangla ResourceLang = 0x0045 58 // Bashkir (ba) 59 LangBashkir ResourceLang = 0x006D 60 // Basque (eu) 61 LangBasque ResourceLang = 0x002D 62 // Belarusian (be) 63 LangBelarusian ResourceLang = 0x0023 64 // Bosnian (Latin) (bs) 65 LangBosnianLatin ResourceLang = 0x781A 66 // Breton (br) 67 LangBreton ResourceLang = 0x007E 68 // Bulgarian (bg) 69 LangBulgarian ResourceLang = 0x0002 70 // Burmese (my) 71 LangBurmese ResourceLang = 0x0055 72 // Catalan (ca) 73 LangCatalan ResourceLang = 0x0003 74 // Central Kurdish (ku) 75 LangCentralKurdish ResourceLang = 0x0092 76 // Cherokee (chr) 77 LangCherokee ResourceLang = 0x005C 78 // Chinese (Simplified) (zh) 79 LangChineseSimplified ResourceLang = 0x7804 80 // Corsican (co) 81 LangCorsican ResourceLang = 0x0083 82 // Croatian (hr) 83 LangCroatian ResourceLang = 0x001A 84 // Czech (cs) 85 LangCzech ResourceLang = 0x0005 86 // Danish (da) 87 LangDanish ResourceLang = 0x0006 88 // Dari (prs) 89 LangDari ResourceLang = 0x008C 90 // Divehi (dv) 91 LangDivehi ResourceLang = 0x0065 92 // Dutch (nl) 93 LangDutch ResourceLang = 0x0013 94 // English (en) 95 LangEnglish ResourceLang = 0x0009 96 // Estonian (et) 97 LangEstonian ResourceLang = 0x0025 98 // Faroese (fo) 99 LangFaroese ResourceLang = 0x0038 100 // Filipino (fil) 101 LangFilipino ResourceLang = 0x0064 102 // Finnish (fi) 103 LangFinnish ResourceLang = 0x000B 104 // French (fr) 105 LangFrench ResourceLang = 0x000C 106 // Frisian (fy) 107 LangFrisian ResourceLang = 0x0062 108 // Fulah (ff) 109 LangFulah ResourceLang = 0x0067 110 // Fulah (Latin) (ff-Latn) 111 LangFulahLatin ResourceLang = 0x7C67 112 // Galician (gl) 113 LangGalician ResourceLang = 0x0056 114 // Georgian (ka) 115 LangGeorgian ResourceLang = 0x0037 116 // German (de) 117 LangGerman ResourceLang = 0x0007 118 // Greek (el) 119 LangGreek ResourceLang = 0x0008 120 // Greenlandic (kl) 121 LangGreenlandic ResourceLang = 0x006F 122 // Guarani (gn) 123 LangGuarani ResourceLang = 0x0074 124 // Gujarati (gu) 125 LangGujarati ResourceLang = 0x0047 126 // Hausa (Latin) (ha) 127 LangHausaLatin ResourceLang = 0x0068 128 // Hawaiian (haw) 129 LangHawaiian ResourceLang = 0x0075 130 // Hebrew (he) 131 LangHebrew ResourceLang = 0x000D 132 // Hindi (hi) 133 LangHindi ResourceLang = 0x0039 134 // Hungarian (hu) 135 LangHungarian ResourceLang = 0x000E 136 // Icelandic (is) 137 LangIcelandic ResourceLang = 0x000F 138 // Igbo (ig) 139 LangIgbo ResourceLang = 0x0070 140 // Indonesian (id) 141 LangIndonesian ResourceLang = 0x0021 142 // Inuktitut (Latin) (iu) 143 LangInuktitutLatin ResourceLang = 0x005D 144 // Irish (ga) 145 LangIrish ResourceLang = 0x003C 146 // Italian (it) 147 LangItalian ResourceLang = 0x0010 148 // Japanese (ja) 149 LangJapanese ResourceLang = 0x0011 150 // Kannada (kn) 151 LangKannada ResourceLang = 0x004B 152 // Kashmiri (ks) 153 LangKashmiri ResourceLang = 0x0060 154 // Kazakh (kk) 155 LangKazakh ResourceLang = 0x003F 156 // Khmer (km) 157 LangKhmer ResourceLang = 0x0053 158 // K'iche (quc) 159 LangKiche ResourceLang = 0x0086 160 // Kinyarwanda (rw) 161 LangKinyarwanda ResourceLang = 0x0087 162 // Kiswahili (sw) 163 LangKiswahili ResourceLang = 0x0041 164 // Konkani (kok) 165 LangKonkani ResourceLang = 0x0057 166 // Korean (ko) 167 LangKorean ResourceLang = 0x0012 168 // Kyrgyz (ky) 169 LangKyrgyz ResourceLang = 0x0040 170 // Lao (lo) 171 LangLao ResourceLang = 0x0054 172 // Latvian (lv) 173 LangLatvian ResourceLang = 0x0026 174 // Lithuanian (lt) 175 LangLithuanian ResourceLang = 0x0027 176 // Lower Sorbian (dsb) 177 LangLowerSorbian ResourceLang = 0x7C2E 178 // Luxembourgish (lb) 179 LangLuxembourgish ResourceLang = 0x006E 180 // Macedonian (mk) 181 LangMacedonian ResourceLang = 0x002F 182 // Malay (ms) 183 LangMalay ResourceLang = 0x003E 184 // Malayalam (ml) 185 LangMalayalam ResourceLang = 0x004C 186 // Maltese (mt) 187 LangMaltese ResourceLang = 0x003A 188 // Maori (mi) 189 LangMaori ResourceLang = 0x0081 190 // Mapudungun (arn) 191 LangMapudungun ResourceLang = 0x007A 192 // Marathi (mr) 193 LangMarathi ResourceLang = 0x004E 194 // Mohawk (moh) 195 LangMohawk ResourceLang = 0x007C 196 // Mongolian (Cyrillic) (mn) 197 LangMongolianCyrillic ResourceLang = 0x0050 198 // Nepali (ne) 199 LangNepali ResourceLang = 0x0061 200 // Norwegian (Bokmal) (no) 201 LangNorwegianBokmalNo ResourceLang = 0x0014 202 // Norwegian (Bokmal) (nb) 203 LangNorwegianBokmal ResourceLang = 0x7C14 204 // Norwegian (Nynorsk) (nn) 205 LangNorwegianNynorsk ResourceLang = 0x7814 206 // Occitan (oc) 207 LangOccitan ResourceLang = 0x0082 208 // Odia (or) 209 LangOdia ResourceLang = 0x0048 210 // Oromo (om) 211 LangOromo ResourceLang = 0x0072 212 // Pashto (ps) 213 LangPashto ResourceLang = 0x0063 214 // Persian (fa) 215 LangPersian ResourceLang = 0x0029 216 // Polish (pl) 217 LangPolish ResourceLang = 0x0015 218 // Portuguese (pt) 219 LangPortuguese ResourceLang = 0x0016 220 // Punjabi (pa) 221 LangPunjabi ResourceLang = 0x0046 222 // Quechua (quz) 223 LangQuechua ResourceLang = 0x006B 224 // Romanian (ro) 225 LangRomanian ResourceLang = 0x0018 226 // Romansh (rm) 227 LangRomansh ResourceLang = 0x0017 228 // Russian (ru) 229 LangRussian ResourceLang = 0x0019 230 // Sakha (sah) 231 LangSakha ResourceLang = 0x0085 232 // Sami (Inari) (smn) 233 LangSamiInari ResourceLang = 0x703B 234 // Sami (Lule) (smj) 235 LangSamiLule ResourceLang = 0x7C3B 236 // Sami (Northern) (se) 237 LangSamiNorthern ResourceLang = 0x003B 238 // Sami (Skolt) (sms) 239 LangSamiSkolt ResourceLang = 0x743B 240 // Sami (Southern) (sma) 241 LangSamiSouthern ResourceLang = 0x783B 242 // Sanskrit (sa) 243 LangSanskrit ResourceLang = 0x004F 244 // Scottish Gaelic (gd) 245 LangScottishGaelic ResourceLang = 0x0091 246 // Serbian (Latin) (sr) 247 LangSerbianLatin ResourceLang = 0x7C1A 248 // Sesotho Sa Leboa (nso) 249 LangSesothoSaLeboa ResourceLang = 0x006C 250 // Setswana (tn) 251 LangSetswana ResourceLang = 0x0032 252 // Sindhi (sd) 253 LangSindhi ResourceLang = 0x0059 254 // Sinhala (si) 255 LangSinhala ResourceLang = 0x005B 256 // Slovak (sk) 257 LangSlovak ResourceLang = 0x001B 258 // Slovenian (sl) 259 LangSlovenian ResourceLang = 0x0024 260 // Somali (so) 261 LangSomali ResourceLang = 0x0077 262 // Sotho (st) 263 LangSotho ResourceLang = 0x0030 264 // Spanish (es) 265 LangSpanish ResourceLang = 0x000A 266 // Swedish (sv) 267 LangSwedish ResourceLang = 0x001D 268 // Syriac (syr) 269 LangSyriac ResourceLang = 0x005A 270 // Tajik (Cyrillic) (tg) 271 LangTajikCyrillic ResourceLang = 0x0028 272 // Tamazight (Latin) (tzm) 273 LangTamazightLatin ResourceLang = 0x005F 274 // Tamil (ta) 275 LangTamil ResourceLang = 0x0049 276 // Tatar (tt) 277 LangTatar ResourceLang = 0x0044 278 // Telugu (te) 279 LangTelugu ResourceLang = 0x004A 280 // Thai (th) 281 LangThai ResourceLang = 0x001E 282 // Tibetan (bo) 283 LangTibetan ResourceLang = 0x0051 284 // Tigrinya (ti) 285 LangTigrinya ResourceLang = 0x0073 286 // Tsonga (ts) 287 LangTsonga ResourceLang = 0x0031 288 // Turkish (tr) 289 LangTurkish ResourceLang = 0x001F 290 // Turkmen (tk) 291 LangTurkmen ResourceLang = 0x0042 292 // Ukrainian (uk) 293 LangUkrainian ResourceLang = 0x0022 294 // Upper Sorbian (hsb) 295 LangUpperSorbian ResourceLang = 0x002E 296 // Urdu (ur) 297 LangUrdu ResourceLang = 0x0020 298 // Uyghur (ug) 299 LangUyghur ResourceLang = 0x0080 300 // Uzbek (Latin) (uz) 301 LangUzbekLatin ResourceLang = 0x0043 302 // Venda (ve) 303 LangVenda ResourceLang = 0x0033 304 // Vietnamese (vi) 305 LangVietnamese ResourceLang = 0x002A 306 // Welsh (cy) 307 LangWelsh ResourceLang = 0x0052 308 // Wolof (wo) 309 LangWolof ResourceLang = 0x0088 310 // Xhosa (xh) 311 LangXhosa ResourceLang = 0x0034 312 // Yi (ii) 313 LangYi ResourceLang = 0x0078 314 // Yoruba (yo) 315 LangYoruba ResourceLang = 0x006A 316 // Zulu (zu) 317 LangZulu ResourceLang = 0x0035 318 ) 319 320 // All resource sub-language identifiers. 321 const ( 322 // Afrikaans South Africa (af-ZA) 323 SubLangAfrikaansSouthAfrica ResourceSubLang = iota 324 // Albanian Albania (sq-AL) 325 SubLangAlbanianAlbania 326 // Alsatian France (gsw-FR) 327 SubLangAlsatianFrance 328 // Amharic Ethiopia (am-ET) 329 SubLangAmharicEthiopia 330 // Arabic Algeria (ar-DZ) 331 SubLangArabicAlgeria 332 // Arabic Bahrain (ar-BH) 333 SubLangArabicBahrain 334 // Arabic Egypt (ar-EG) 335 SubLangArabicEgypt 336 // Arabic Iraq (ar-IQ) 337 SubLangArabicIraq 338 // Arabic Jordan (ar-JO) 339 SubLangArabicJordan 340 // Arabic Kuwait (ar-KW) 341 SubLangArabicKuwait 342 // Arabic Lebanon (ar-LB) 343 SubLangArabicLebanon 344 // Arabic Libya (ar-LY) 345 SubLangArabicLibya 346 // Arabic Morocco (ar-MA) 347 SubLangArabicMorocco 348 // Arabic Oman (ar-OM) 349 SubLangArabicOman 350 // Arabic Qatar (ar-QA) 351 SubLangArabicQatar 352 // Arabic Saudi Arabia (ar-SA) 353 SubLangArabicSaudiArabia 354 // Arabic Syria (ar-SY) 355 SubLangArabicSyria 356 // Arabic Tunisia (ar-TN) 357 SubLangArabicTunisia 358 // Arabic U.a.e. (ar-AE) 359 SubLangArabicUae 360 // Arabic Yemen (ar-YE) 361 SubLangArabicYemen 362 // Armenian Armenia (hy-AM) 363 SubLangArmenianArmenia 364 // Assamese India (as-IN) 365 SubLangAssameseIndia 366 // Azerbaijani (Cyrillic) (az-Cyrl) 367 SubLangAzerbaijaniCyrillic 368 // Azerbaijani (Cyrillic) Azerbaijan (az-Cyrl-AZ) 369 SubLangAzerbaijaniCyrillicAzerbaijan 370 // Azerbaijani (Latin) (az-Latn) 371 SubLangAzerbaijaniLatin 372 // Azerbaijani (Latin) Azerbaijan (az-Latn-AZ) 373 SubLangAzerbaijaniLatinAzerbaijan 374 // Bangla Bangladesh (bn-BD) 375 SubLangBanglaBangladesh 376 // Bangla India (bn-IN) 377 SubLangBanglaIndia 378 // Bashkir Russia (ba-RU) 379 SubLangBashkirRussia 380 // Basque Spain (eu-ES) 381 SubLangBasqueSpain 382 // Belarusian Belarus (be-BY) 383 SubLangBelarusianBelarus 384 // Bosnian (Cyrillic) (bs-Cyrl) 385 SubLangBosnianCyrillic 386 // Bosnian (Cyrillic) Bosnia And Herzegovina (bs-Cyrl-BA) 387 SubLangBosnianCyrillicBosniaAndHerzegovina 388 // Bosnian (Latin) (bs-Latn) 389 SubLangBosnianLatin 390 // Bosnian (Latin) Bosnia And Herzegovina (bs-Latn-BA) 391 SubLangBosnianLatinBosniaAndHerzegovina 392 // Breton France (br-FR) 393 SubLangBretonFrance 394 // Bulgarian Bulgaria (bg-BG) 395 SubLangBulgarianBulgaria 396 // Burmese Myanmar (my-MM) 397 SubLangBurmeseMyanmar 398 // Catalan Spain (ca-ES) 399 SubLangCatalanSpain 400 // Central Atlas Tamazight (Arabic) Morocco (tzm-ArabMA) 401 SubLangCentralAtlasTamazightArabicMorocco 402 // Central Kurdish (ku-Arab) 403 SubLangCentralKurdish 404 // Central Kurdish Iraq (ku-Arab-IQ) 405 SubLangCentralKurdishIraq 406 // Cherokee (chr-Cher) 407 SubLangCherokee 408 // Cherokee United States (chr-Cher-US) 409 SubLangCherokeeUnitedStates 410 // Chinese (Simplified) (zh-Hans) 411 SubLangChineseSimplified 412 // Chinese (Simplified) People's Republic Of China (zh-CN) 413 SubLangChineseSimplifiedPeoplesRepublicOfChina 414 // Chinese (Simplified) Singapore (zh-SG) 415 SubLangChineseSimplifiedSingapore 416 // Chinese (Traditional) (zh-Hant) 417 SubLangChineseTraditional 418 // Chinese (Traditional) Hong Kong S.a.r. (zh-HK) 419 SubLangChineseTraditionalHongKongSar 420 // Chinese (Traditional) Macao S.a.r. (zh-MO) 421 SubLangChineseTraditionalMacaoSar 422 // Chinese (Traditional) Taiwan (zh-TW) 423 SubLangChineseTraditionalTaiwan 424 // Corsican France (co-FR) 425 SubLangCorsicanFrance 426 // Croatian Croatia (hr-HR) 427 SubLangCroatianCroatia 428 // Croatian (Latin) Bosnia And Herzegovina (hr-BA) 429 SubLangCroatianLatinBosniaAndHerzegovina 430 // Czech Czech Republic (cs-CZ) 431 SubLangCzechCzechRepublic 432 // Danish Denmark (da-DK) 433 SubLangDanishDenmark 434 // Dari Afghanistan (prs-AF) 435 SubLangDariAfghanistan 436 // Divehi Maldives (dv-MV) 437 SubLangDivehiMaldives 438 // Dutch Belgium (nl-BE) 439 SubLangDutchBelgium 440 // Dutch Netherlands (nl-NL) 441 SubLangDutchNetherlands 442 // Dzongkha Bhutan (dz-BT) 443 SubLangDzongkhaBhutan 444 // English Australia (en-AU) 445 SubLangEnglishAustralia 446 // English Belize (en-BZ) 447 SubLangEnglishBelize 448 // English Canada (en-CA) 449 SubLangEnglishCanada 450 // English Caribbean (en-029) 451 SubLangEnglishCaribbean 452 // English Hong Kong (en-HK) 453 SubLangEnglishHongKong 454 // English India (en-IN) 455 SubLangEnglishIndia 456 // English Ireland (en-IE) 457 SubLangEnglishIreland 458 // English Jamaica (en-JM) 459 SubLangEnglishJamaica 460 // English Malaysia (en-MY) 461 SubLangEnglishMalaysia 462 // English New Zealand (en-NZ) 463 SubLangEnglishNewZealand 464 // English Republic Of The Philippines (en-PH) 465 SubLangEnglishRepublicOfThePhilippines 466 // English Singapore (en-SG) 467 SubLangEnglishSingapore 468 // English South Africa (en-ZA) 469 SubLangEnglishSouthAfrica 470 // English Trinidad And Tobago (en-TT) 471 SubLangEnglishTrinidadAndTobago 472 // English United Arab Emirates (en-AE) 473 SubLangEnglishUnitedArabEmirates 474 // English United Kingdom (en-GB) 475 SubLangEnglishUnitedKingdom 476 // English United States (en-US) 477 SubLangEnglishUnitedStates 478 // English Zimbabwe (en-ZW) 479 SubLangEnglishZimbabwe 480 // Estonian Estonia (et-EE) 481 SubLangEstonianEstonia 482 // Faroese Faroe Islands (fo-FO) 483 SubLangFaroeseFaroeIslands 484 // Filipino Philippines (fil-PH) 485 SubLangFilipinoPhilippines 486 // Finnish Finland (fi-FI) 487 SubLangFinnishFinland 488 // French Belgium (fr-BE) 489 SubLangFrenchBelgium 490 // French Cameroon (fr-CM) 491 SubLangFrenchCameroon 492 // French Canada (fr-CA) 493 SubLangFrenchCanada 494 // French Caribbean (fr-029) 495 SubLangFrenchCaribbean 496 // French Congo, Drc (fr-CD) 497 SubLangFrenchCongoDrc 498 // French Côte D'ivoire (fr-CI) 499 SubLangFrenchCôteDivoire 500 // French France (fr-FR) 501 SubLangFrenchFrance 502 // French Haiti (fr-HT) 503 SubLangFrenchHaiti 504 // French Luxembourg (fr-LU) 505 SubLangFrenchLuxembourg 506 // French Mali (fr-ML) 507 SubLangFrenchMali 508 // French Morocco (fr-MA) 509 SubLangFrenchMorocco 510 // French Principality Of Monaco (fr-MC) 511 SubLangFrenchPrincipalityOfMonaco 512 // French Reunion (fr-RE) 513 SubLangFrenchReunion 514 // French Senegal (fr-SN) 515 SubLangFrenchSenegal 516 // French Switzerland (fr-CH) 517 SubLangFrenchSwitzerland 518 // Frisian Netherlands (fy-NL) 519 SubLangFrisianNetherlands 520 // Fulah Nigeria (ff-NG) 521 SubLangFulahNigeria 522 // Fulah (Latin) Nigeria (ff-Latn-NG) 523 SubLangFulahLatinNigeria 524 // Fulah Senegal (ff-Latn-SN) 525 SubLangFulahSenegal 526 // Galician Spain (gl-ES) 527 SubLangGalicianSpain 528 // Georgian Georgia (ka-GE) 529 SubLangGeorgianGeorgia 530 // German Austria (de-AT) 531 SubLangGermanAustria 532 // German Germany (de-DE) 533 SubLangGermanGermany 534 // German Liechtenstein (de-LI) 535 SubLangGermanLiechtenstein 536 // German Luxembourg (de-LU) 537 SubLangGermanLuxembourg 538 // German Switzerland (de-CH) 539 SubLangGermanSwitzerland 540 // Greek Greece (el-GR) 541 SubLangGreekGreece 542 // Greenlandic Greenland (kl-GL) 543 SubLangGreenlandicGreenland 544 // Guarani Paraguay (gn-PY) 545 SubLangGuaraniParaguay 546 // Gujarati India (gu-IN) 547 SubLangGujaratiIndia 548 // Hausa (Latin) (ha-Latn) 549 SubLangHausaLatin 550 // Hausa (Latin) Nigeria (ha-Latn-NG) 551 SubLangHausaLatinNigeria 552 // Hawaiian United States (haw-US) 553 SubLangHawaiianUnitedStates 554 // Hebrew Israel (he-IL) 555 SubLangHebrewIsrael 556 // Hindi India (hi-IN) 557 SubLangHindiIndia 558 // Hungarian Hungary (hu-HU) 559 SubLangHungarianHungary 560 // Icelandic Iceland (is-IS) 561 SubLangIcelandicIceland 562 // Igbo Nigeria (ig-NG) 563 SubLangIgboNigeria 564 // Indonesian Indonesia (id-ID) 565 SubLangIndonesianIndonesia 566 // Inuktitut (Latin) (iu-Latn) 567 SubLangInuktitutLatin 568 // Inuktitut (Latin) Canada (iu-Latn-CA) 569 SubLangInuktitutLatinCanada 570 // Inuktitut (Syllabics) (iu-Cans) 571 SubLangInuktitutSyllabics 572 // Inuktitut (Syllabics) Canada (iu-Cans-CA) 573 SubLangInuktitutSyllabicsCanada 574 // Irish Ireland (ga-IE) 575 SubLangIrishIreland 576 // Italian Italy (it-IT) 577 SubLangItalianItaly 578 // Italian Switzerland (it-CH) 579 SubLangItalianSwitzerland 580 // Japanese Japan (ja-JP) 581 SubLangJapaneseJapan 582 // Kannada India (kn-IN) 583 SubLangKannadaIndia 584 // Kanuri (Latin) Nigeria (kr-Latn-NG) 585 SubLangKanuriLatinNigeria 586 // Kashmiri Perso-Arabic (ks-Arab) 587 SubLangKashmiriPersoArabic 588 // Kashmiri (Devanagari) India (ks-Deva-IN) 589 SubLangKashmiriDevanagariIndia 590 // Kazakh Kazakhstan (kk-KZ) 591 SubLangKazakhKazakhstan 592 // Khmer Cambodia (km-KH) 593 SubLangKhmerCambodia 594 // K'iche Guatemala (quc-Latn-GT) 595 SubLangKicheGuatemala 596 // Kinyarwanda Rwanda (rw-RW) 597 SubLangKinyarwandaRwanda 598 // Kiswahili Kenya (sw-KE) 599 SubLangKiswahiliKenya 600 // Konkani India (kok-IN) 601 SubLangKonkaniIndia 602 // Korean Korea (ko-KR) 603 SubLangKoreanKorea 604 // Kyrgyz Kyrgyzstan (ky-KG) 605 SubLangKyrgyzKyrgyzstan 606 // Lao Lao P.d.r. (lo-LA) 607 SubLangLaoLaoPdr 608 // Latin Vatican City (la-VA) 609 SubLangLatinVaticanCity 610 // Latvian Latvia (lv-LV) 611 SubLangLatvianLatvia 612 // Lithuanian Lithuania (lt-LT) 613 SubLangLithuanianLithuania 614 // Lower Sorbian Germany (dsb-DE) 615 SubLangLowerSorbianGermany 616 // Luxembourgish Luxembourg (lb-LU) 617 SubLangLuxembourgishLuxembourg 618 // Macedonian North Macedonia (mk-MK) 619 SubLangMacedonianNorthMacedonia 620 // Malay Brunei Darussalam (ms-BN) 621 SubLangMalayBruneiDarussalam 622 // Malay Malaysia (ms-MY) 623 SubLangMalayMalaysia 624 // Malayalam India (ml-IN) 625 SubLangMalayalamIndia 626 // Maltese Malta (mt-MT) 627 SubLangMalteseMalta 628 // Maori New Zealand (mi-NZ) 629 SubLangMaoriNewZealand 630 // Mapudungun Chile (arn-CL) 631 SubLangMapudungunChile 632 // Marathi India (mr-IN) 633 SubLangMarathiIndia 634 // Mohawk Canada (moh-CA) 635 SubLangMohawkCanada 636 // Mongolian (Cyrillic) (mn-Cyrl) 637 SubLangMongolianCyrillic 638 // Mongolian (Cyrillic) Mongolia (mn-MN) 639 SubLangMongolianCyrillicMongolia 640 // Mongolian (Traditional Mongolian) (mn-Mong) 641 SubLangMongolianTraditionalMongolian 642 // Mongolian (Traditional Mongolian) People's Republic Of China (mn-MongCN) 643 SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina 644 // Mongolian (Traditional Mongolian) Mongolia (mn-MongMN) 645 SubLangMongolianTraditionalMongolianMongolia 646 // Nepali India (ne-IN) 647 SubLangNepaliIndia 648 // Nepali Nepal (ne-NP) 649 SubLangNepaliNepal 650 // Norwegian (Bokmal) Norway (nb-NO) 651 SubLangNorwegianBokmalNorway 652 // Norwegian (Nynorsk) Norway (nn-NO) 653 SubLangNorwegianNynorskNorway 654 // Occitan France (oc-FR) 655 SubLangOccitanFrance 656 // Odia India (or-IN) 657 SubLangOdiaIndia 658 // Oromo Ethiopia (om-ET) 659 SubLangOromoEthiopia 660 // Pashto Afghanistan (ps-AF) 661 SubLangPashtoAfghanistan 662 // Persian Iran (fa-IR) 663 SubLangPersianIran 664 // Polish Poland (pl-PL) 665 SubLangPolishPoland 666 // Portuguese Brazil (pt-BR) 667 SubLangPortugueseBrazil 668 // Portuguese Portugal (pt-PT) 669 SubLangPortuguesePortugal 670 // Pseudo Language Pseudo Locale For East Asian/Complex Script Localization Testing (qps-ploca) 671 SubLangPseudoLanguagePseudoLocaleForEastAsianComplexScriptLocalizationTesting 672 // Pseudo Language Pseudo Locale Used For Localization Testing (qps-ploc) 673 SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTesting 674 // Pseudo Language Pseudo Locale Used For Localization Testing Of Mirrored Locales (qps-plocm) 675 SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTestingOfMirroredLocales 676 // Punjabi (pa-Arab) 677 SubLangPunjabi 678 // Punjabi India (pa-IN) 679 SubLangPunjabiIndia 680 // Punjabi Islamic Republic Of Pakistan (pa-Arab-PK) 681 SubLangPunjabiIslamicRepublicOfPakistan 682 // Quechua Bolivia (quz-BO) 683 SubLangQuechuaBolivia 684 // Quechua Ecuador (quz-EC) 685 SubLangQuechuaEcuador 686 // Quechua Peru (quz-PE) 687 SubLangQuechuaPeru 688 // Romanian Moldova (ro-MD) 689 SubLangRomanianMoldova 690 // Romanian Romania (ro-RO) 691 SubLangRomanianRomania 692 // Romansh Switzerland (rm-CH) 693 SubLangRomanshSwitzerland 694 // Russian Moldova (ru-MD) 695 SubLangRussianMoldova 696 // Russian Russia (ru-RU) 697 SubLangRussianRussia 698 // Sakha Russia (sah-RU) 699 SubLangSakhaRussia 700 // Sami (Inari) Finland (smn-FI) 701 SubLangSamiInariFinland 702 // Sami (Lule) Norway (smj-NO) 703 SubLangSamiLuleNorway 704 // Sami (Lule) Sweden (smj-SE) 705 SubLangSamiLuleSweden 706 // Sami (Northern) Finland (se-FI) 707 SubLangSamiNorthernFinland 708 // Sami (Northern) Norway (se-NO) 709 SubLangSamiNorthernNorway 710 // Sami (Northern) Sweden (se-SE) 711 SubLangSamiNorthernSweden 712 // Sami (Skolt) Finland (sms-FI) 713 SubLangSamiSkoltFinland 714 // Sami (Southern) Norway (sma-NO) 715 SubLangSamiSouthernNorway 716 // Sami (Southern) Sweden (sma-SE) 717 SubLangSamiSouthernSweden 718 // Sanskrit India (sa-IN) 719 SubLangSanskritIndia 720 // Scottish Gaelic United Kingdom (gd-GB) 721 SubLangScottishGaelicUnitedKingdom 722 // Serbian (Cyrillic) (sr-Cyrl) 723 SubLangSerbianCyrillic 724 // Serbian (Cyrillic) Bosnia And Herzegovina (sr-Cyrl-BA) 725 SubLangSerbianCyrillicBosniaAndHerzegovina 726 // Serbian (Cyrillic) Montenegro (sr-Cyrl-ME) 727 SubLangSerbianCyrillicMontenegro 728 // Serbian (Cyrillic) Serbia (sr-Cyrl-RS) 729 SubLangSerbianCyrillicSerbia 730 // Serbian (Cyrillic) Serbia And Montenegro (Former) (sr-Cyrl-CS) 731 SubLangSerbianCyrillicSerbiaAndMontenegroFormer 732 // Serbian (Latin) (sr-Latn) 733 SubLangSerbianLatin 734 // Serbian (Latin) Bosnia And Herzegovina (sr-Latn-BA) 735 SubLangSerbianLatinBosniaAndHerzegovina 736 // Serbian (Latin) Montenegro (sr-Latn-ME) 737 SubLangSerbianLatinMontenegro 738 // Serbian (Latin) Serbia (sr-Latn-RS) 739 SubLangSerbianLatinSerbia 740 // Serbian (Latin) Serbia And Montenegro (Former) (sr-Latn-CS) 741 SubLangSerbianLatinSerbiaAndMontenegroFormer 742 // Sesotho Sa Leboa South Africa (nso-ZA) 743 SubLangSesothoSaLeboaSouthAfrica 744 // Setswana Botswana (tn-BW) 745 SubLangSetswanaBotswana 746 // Setswana South Africa (tn-ZA) 747 SubLangSetswanaSouthAfrica 748 // Sindhi (sd-Arab) 749 SubLangSindhi 750 // Sindhi Islamic Republic Of Pakistan (sd-Arab-PK) 751 SubLangSindhiIslamicRepublicOfPakistan 752 // Sinhala Sri Lanka (si-LK) 753 SubLangSinhalaSriLanka 754 // Slovak Slovakia (sk-SK) 755 SubLangSlovakSlovakia 756 // Slovenian Slovenia (sl-SI) 757 SubLangSlovenianSlovenia 758 // Somali Somalia (so-SO) 759 SubLangSomaliSomalia 760 // Sotho South Africa (st-ZA) 761 SubLangSothoSouthAfrica 762 // Spanish Argentina (es-AR) 763 SubLangSpanishArgentina 764 // Spanish Bolivarian Republic Of Venezuela (es-VE) 765 SubLangSpanishBolivarianRepublicOfVenezuela 766 // Spanish Bolivia (es-BO) 767 SubLangSpanishBolivia 768 // Spanish Chile (es-CL) 769 SubLangSpanishChile 770 // Spanish Colombia (es-CO) 771 SubLangSpanishColombia 772 // Spanish Costa Rica (es-CR) 773 SubLangSpanishCostaRica 774 // Spanish Cuba (es-CU) 775 SubLangSpanishCuba 776 // Spanish Dominican Republic (es-DO) 777 SubLangSpanishDominicanRepublic 778 // Spanish Ecuador (es-EC) 779 SubLangSpanishEcuador 780 // Spanish El Salvador (es-SV) 781 SubLangSpanishElSalvador 782 // Spanish Guatemala (es-GT) 783 SubLangSpanishGuatemala 784 // Spanish Honduras (es-HN) 785 SubLangSpanishHonduras 786 // Spanish Latin America (es-419) 787 SubLangSpanishLatinAmerica 788 // Spanish Mexico (es-MX) 789 SubLangSpanishMexico 790 // Spanish Nicaragua (es-NI) 791 SubLangSpanishNicaragua 792 // Spanish Panama (es-PA) 793 SubLangSpanishPanama 794 // Spanish Paraguay (es-PY) 795 SubLangSpanishParaguay 796 // Spanish Peru (es-PE) 797 SubLangSpanishPeru 798 // Spanish Puerto Rico (es-PR) 799 SubLangSpanishPuertoRico 800 // Spanish Spain (es-ES_tradnl) 801 SubLangSpanishSpainTraditional 802 // Spanish Spain (es-ES) 803 SubLangSpanishSpain 804 // Spanish United States (es-US) 805 SubLangSpanishUnitedStates 806 // Spanish Uruguay (es-UY) 807 SubLangSpanishUruguay 808 // Swedish Finland (sv-FI) 809 SubLangSwedishFinland 810 // Swedish Sweden (sv-SE) 811 SubLangSwedishSweden 812 // Syriac Syria (syr-SY) 813 SubLangSyriacSyria 814 // Tajik (Cyrillic) (tg-Cyrl) 815 SubLangTajikCyrillic 816 // Tajik (Cyrillic) Tajikistan (tg-Cyrl-TJ) 817 SubLangTajikCyrillicTajikistan 818 // Tamazight (Latin) (tzm-Latn) 819 SubLangTamazightLatin 820 // Tamazight (Latin) Algeria (tzm-Latn-DZ) 821 SubLangTamazightLatinAlgeria 822 // Tamil India (ta-IN) 823 SubLangTamilIndia 824 // Tamil Sri Lanka (ta-LK) 825 SubLangTamilSriLanka 826 // Tatar Russia (tt-RU) 827 SubLangTatarRussia 828 // Telugu India (te-IN) 829 SubLangTeluguIndia 830 // Thai Thailand (th-TH) 831 SubLangThaiThailand 832 // Tibetan People's Republic Of China (bo-CN) 833 SubLangTibetanPeoplesRepublicOfChina 834 // Tigrinya Eritrea (ti-ER) 835 SubLangTigrinyaEritrea 836 // Tigrinya Ethiopia (ti-ET) 837 SubLangTigrinyaEthiopia 838 // Tsonga South Africa (ts-ZA) 839 SubLangTsongaSouthAfrica 840 // Turkish Turkey (tr-TR) 841 SubLangTurkishTurkey 842 // Turkmen Turkmenistan (tk-TM) 843 SubLangTurkmenTurkmenistan 844 // Ukrainian Ukraine (uk-UA) 845 SubLangUkrainianUkraine 846 // Upper Sorbian Germany (hsb-DE) 847 SubLangUpperSorbianGermany 848 // Urdu India (ur-IN) 849 SubLangUrduIndia 850 // Urdu Islamic Republic Of Pakistan (ur-PK) 851 SubLangUrduIslamicRepublicOfPakistan 852 // Uyghur People's Republic Of China (ug-CN) 853 SubLangUyghurPeoplesRepublicOfChina 854 // Uzbek (Cyrillic) (uz-Cyrl) 855 SubLangUzbekCyrillic 856 // Uzbek (Cyrillic) Uzbekistan (uz-Cyrl-UZ) 857 SubLangUzbekCyrillicUzbekistan 858 // Uzbek (Latin) (uz-Latn) 859 SubLangUzbekLatin 860 // Uzbek (Latin) Uzbekistan (uz-Latn-UZ) 861 SubLangUzbekLatinUzbekistan 862 // Valencian Spain (ca-ESvalencia) 863 SubLangValencianSpain 864 // Venda South Africa (ve-ZA) 865 SubLangVendaSouthAfrica 866 // Vietnamese Vietnam (vi-VN) 867 SubLangVietnameseVietnam 868 // Welsh United Kingdom (cy-GB) 869 SubLangWelshUnitedKingdom 870 // Wolof Senegal (wo-SN) 871 SubLangWolofSenegal 872 // Xhosa South Africa (xh-ZA) 873 SubLangXhosaSouthAfrica 874 // Yi People's Republic Of China (ii-CN) 875 SubLangYiPeoplesRepublicOfChina 876 // Yiddish World (yi-001) 877 SubLangYiddishWorld 878 // Yoruba Nigeria (yo-NG) 879 SubLangYorubaNigeria 880 // Zulu South Africa (zu-ZA) 881 SubLangZuluSouthAfrica 882 ) 883 884 const ( 885 maxAllowedEntries = 0x1000 886 ) 887 888 // Predefined Resource Types. 889 const ( 890 RTCursor ResourceType = iota + 1 // Hardware-dependent cursor resource. 891 RTBitmap = 2 // Bitmap resource. 892 RTIcon = 3 // Hardware-dependent icon resource. 893 RTMenu = 4 // Menu resource. 894 RTDialog = 5 // Dialog box. 895 RTString = 6 // String-table entry. 896 RTFontDir = 7 // Font directory resource. 897 RTFont = 8 // Font resource. 898 RTAccelerator = 9 // Accelerator table. 899 RTRCdata = 10 // Application-defined resource (raw data). 900 RTMessageTable = 11 // Message-table entry. 901 RTGroupCursor = RTCursor + 11 // Hardware-independent cursor resource. 902 RTGroupIcon = RTIcon + 11 // Hardware-independent icon resource. 903 RTVersion = 16 // Version resource. 904 RTDlgInclude = 17 // Dialog include entry. 905 RTPlugPlay = 19 // Plug and Play resource. 906 RTVxD = 20 // VXD. 907 RTAniCursor = 21 // Animated cursor. 908 RTAniIcon = 22 // Animated icon. 909 RTHtml = 23 // HTML resource. 910 RTManifest = 24 // Side-by-Side Assembly Manifest. 911 ) 912 913 // ImageResourceDirectory represents the IMAGE_RESOURCE_DIRECTORY. 914 // This data structure should be considered the heading of a table because the 915 // table actually consists of directory entries. 916 type ImageResourceDirectory struct { 917 // Resource flags. This field is reserved for future use. It is currently 918 // set to zero. 919 Characteristics uint32 `json:"characteristics"` 920 921 // The time that the resource data was created by the resource compiler. 922 TimeDateStamp uint32 `json:"time_date_stamp"` 923 924 // The major version number, set by the user. 925 MajorVersion uint16 `json:"major_version"` 926 927 // The minor version number, set by the user. 928 MinorVersion uint16 `json:"minor_version"` 929 930 // The number of directory entries immediately following the table that use 931 // strings to identify Type, Name, or Language entries (depending on the 932 // level of the table). 933 NumberOfNamedEntries uint16 `json:"number_of_named_entries"` 934 935 // The number of directory entries immediately following the Name entries 936 // that use numeric IDs for Type, Name, or Language entries. 937 NumberOfIDEntries uint16 `json:"number_of_id_entries"` 938 } 939 940 // ImageResourceDirectoryEntry represents an entry in the resource directory 941 // entries. 942 type ImageResourceDirectoryEntry struct { 943 // Name is used to identify either a type of resource, a resource name, or a 944 // resource's language ID. 945 Name uint32 `json:"name"` 946 947 // OffsetToData is always used to point to a sibling in the tree, either a 948 // directory node or a leaf node. 949 OffsetToData uint32 `json:"offset_to_data"` 950 } 951 952 // ImageResourceDataEntry Each Resource Data entry describes an actual unit of 953 // raw data in the Resource Data area. 954 type ImageResourceDataEntry struct { 955 // The address of a unit of resource data in the Resource Data area. 956 OffsetToData uint32 `json:"offset_to_data"` 957 958 // The size, in bytes, of the resource data that is pointed to by the Data 959 // RVA field. 960 Size uint32 `json:"size"` 961 962 // The code page that is used to decode code point values within the 963 // resource data. Typically, the code page would be the Unicode code page. 964 CodePage uint32 `json:"code_page"` 965 966 // Reserved, must be 0. 967 Reserved uint32 `json:"reserved"` 968 } 969 970 // ResourceDirectory represents resource directory information. 971 type ResourceDirectory struct { 972 // IMAGE_RESOURCE_DIRECTORY structure. 973 Struct ImageResourceDirectory `json:"struct"` 974 975 // list of entries. 976 Entries []ResourceDirectoryEntry `json:"entries"` 977 } 978 979 // ResourceDirectoryEntry represents a resource directory entry. 980 type ResourceDirectoryEntry struct { 981 // IMAGE_RESOURCE_DIRECTORY_ENTRY structure. 982 Struct ImageResourceDirectoryEntry `json:"struct"` 983 984 // If the resource is identified by name this attribute will contain the 985 // name string. Empty string otherwise. If identified by id, the id is 986 // available at `ID` field. 987 Name string `json:"name"` 988 989 // The resource identifier. 990 ID uint32 `json:"id"` 991 992 // IsResourceDir tell us if the entry is pointing to a resource directory or 993 // a resource data entry. 994 IsResourceDir bool `json:"is_resource_dir"` 995 996 // If this entry has a lower level directory this attribute will point to 997 // the ResourceDirData instance representing it. 998 Directory ResourceDirectory `json:"directory"` 999 1000 // If this entry has no further lower directories and points to the actual 1001 // resource data, this attribute will reference the corresponding 1002 // ResourceDataEntry instance. 1003 Data ResourceDataEntry `json:"data"` 1004 } 1005 1006 // ResourceDataEntry represents a resource data entry. 1007 type ResourceDataEntry struct { 1008 1009 // IMAGE_RESOURCE_DATA_ENTRY structure. 1010 Struct ImageResourceDataEntry `json:"struct"` 1011 1012 // Primary language ID. 1013 Lang ResourceLang `json:"lang"` 1014 1015 // Sub language ID. 1016 SubLang ResourceSubLang `json:"sub_lang"` 1017 } 1018 1019 func (pe *File) parseResourceDataEntry(rva uint32) ImageResourceDataEntry { 1020 dataEntry := ImageResourceDataEntry{} 1021 dataEntrySize := uint32(binary.Size(dataEntry)) 1022 offset := pe.GetOffsetFromRva(rva) 1023 err := pe.structUnpack(&dataEntry, offset, dataEntrySize) 1024 if err != nil { 1025 pe.logger.Warnf("Error parsing a resource directory data entry, the RVA is invalid") 1026 } 1027 return dataEntry 1028 } 1029 1030 func (pe *File) parseResourceDirectoryEntry(rva uint32) *ImageResourceDirectoryEntry { 1031 resource := ImageResourceDirectoryEntry{} 1032 resourceSize := uint32(binary.Size(resource)) 1033 offset := pe.GetOffsetFromRva(rva) 1034 err := pe.structUnpack(&resource, offset, resourceSize) 1035 if err != nil { 1036 return nil 1037 } 1038 1039 if resource == (ImageResourceDirectoryEntry{}) { 1040 return nil 1041 } 1042 1043 // resource.NameOffset = resource.Name & 0x7FFFFFFF 1044 1045 // resource.__pad = resource.Name & 0xFFFF0000 1046 // resource.Id = resource.Name & 0x0000FFFF 1047 1048 // resource.DataIsDirectory = (resource.OffsetToData & 0x80000000) >> 31 1049 // resource.OffsetToDirectory = resource.OffsetToData & 0x7FFFFFFF 1050 1051 return &resource 1052 } 1053 1054 // Navigating the resource directory hierarchy is like navigating a hard disk. 1055 // There's a master directory (the root directory), which has subdirectories. 1056 // The subdirectories have subdirectories of their own that may point to the 1057 // raw resource data for things like dialog templates. 1058 func (pe *File) doParseResourceDirectory(rva, size, baseRVA, level uint32, 1059 dirs []uint32) (ResourceDirectory, error) { 1060 1061 resourceDir := ImageResourceDirectory{} 1062 resourceDirSize := uint32(binary.Size(resourceDir)) 1063 offset := pe.GetOffsetFromRva(rva) 1064 err := pe.structUnpack(&resourceDir, offset, resourceDirSize) 1065 if err != nil { 1066 return ResourceDirectory{}, err 1067 } 1068 1069 if baseRVA == 0 { 1070 baseRVA = rva 1071 } 1072 1073 if len(dirs) == 0 { 1074 dirs = append(dirs, rva) 1075 } 1076 1077 // Advance the RVA to the position immediately following the directory 1078 // table header and pointing to the first entry in the table. 1079 rva += resourceDirSize 1080 1081 numberOfEntries := int(resourceDir.NumberOfNamedEntries + 1082 resourceDir.NumberOfIDEntries) 1083 var dirEntries []ResourceDirectoryEntry 1084 1085 // Set a hard limit on the maximum reasonable number of entries. 1086 if numberOfEntries > maxAllowedEntries { 1087 pe.logger.Warnf(`Error parsing the resources directory. 1088 The directory contains %d entries`, numberOfEntries) 1089 return ResourceDirectory{}, nil 1090 } 1091 1092 for i := 0; i < numberOfEntries; i++ { 1093 res := pe.parseResourceDirectoryEntry(rva) 1094 if res == nil { 1095 pe.logger.Warn("Error parsing a resource directory entry, the RVA is invalid") 1096 break 1097 } 1098 1099 nameIsString := (res.Name & 0x80000000) >> 31 1100 entryName := "" 1101 entryID := uint32(0) 1102 if nameIsString == 0 { 1103 entryID = res.Name 1104 } else { 1105 nameOffset := res.Name & 0x7FFFFFFF 1106 uStringOffset := pe.GetOffsetFromRva(baseRVA + nameOffset) 1107 maxLen, err := pe.ReadUint16(uStringOffset) 1108 if err != nil { 1109 break 1110 } 1111 entryName = pe.readUnicodeStringAtRVA(baseRVA+nameOffset+2, 1112 uint32(maxLen*2)) 1113 } 1114 1115 // A directory entry points to either another resource directory or to 1116 // the data for an individual resource. When the directory entry points 1117 // to another resource directory, the high bit of the second DWORD in 1118 // the structure is set and the remaining 31 bits are an offset to the 1119 // resource directory. 1120 dataIsDirectory := (res.OffsetToData & 0x80000000) >> 31 1121 1122 // The offset is relative to the beginning of the resource section, 1123 // not an RVA. 1124 OffsetToDirectory := res.OffsetToData & 0x7FFFFFFF 1125 if dataIsDirectory > 0 { 1126 // One trick malware can do is to recursively reference 1127 // the next directory. This causes hilarity to ensue when 1128 // trying to parse everything correctly. 1129 // If the original RVA given to this function is equal to 1130 // the next one to parse, we assume that it's a trick. 1131 // Instead of raising a PEFormatError this would skip some 1132 // reasonable data so we just break. 1133 // 9ee4d0a0caf095314fd7041a3e4404dc is the offending sample. 1134 if intInSlice(baseRVA+OffsetToDirectory, dirs) { 1135 break 1136 } 1137 1138 level++ 1139 dirs = append(dirs, baseRVA+OffsetToDirectory) 1140 directoryEntry, _ := pe.doParseResourceDirectory( 1141 baseRVA+OffsetToDirectory, 1142 size-(rva-baseRVA), 1143 baseRVA, 1144 level, 1145 dirs) 1146 1147 dirEntries = append(dirEntries, ResourceDirectoryEntry{ 1148 Struct: *res, 1149 Name: entryName, 1150 ID: entryID, 1151 IsResourceDir: true, 1152 Directory: directoryEntry}) 1153 } else { 1154 // data is entry 1155 dataEntryStruct := pe.parseResourceDataEntry(baseRVA + 1156 OffsetToDirectory) 1157 entryData := ResourceDataEntry{ 1158 Struct: dataEntryStruct, 1159 Lang: ResourceLang(res.Name & 0x3ff), 1160 SubLang: ResourceSubLang(res.Name >> 10), 1161 } 1162 1163 dirEntries = append(dirEntries, ResourceDirectoryEntry{ 1164 Struct: *res, 1165 Name: entryName, 1166 ID: entryID, 1167 IsResourceDir: false, 1168 Data: entryData}) 1169 } 1170 1171 rva += uint32(binary.Size(res)) 1172 } 1173 1174 return ResourceDirectory{ 1175 Struct: resourceDir, 1176 Entries: dirEntries, 1177 }, nil 1178 } 1179 1180 // The resource directory contains resources like dialog templates, icons, 1181 // and bitmaps. The resources are found in a section called .rsrc section. 1182 func (pe *File) parseResourceDirectory(rva, size uint32) error { 1183 var dirs []uint32 1184 Resources, err := pe.doParseResourceDirectory(rva, size, 0, 0, dirs) 1185 if err != nil { 1186 return err 1187 } 1188 1189 pe.Resources = Resources 1190 pe.HasResource = true 1191 return err 1192 } 1193 1194 // String stringify the resource type. 1195 func (rt ResourceType) String() string { 1196 1197 rsrcTypeMap := map[ResourceType]string{ 1198 RTCursor: "Cursor", 1199 RTBitmap: "Bitmap", 1200 RTIcon: "Icon", 1201 RTMenu: "Menu", 1202 RTDialog: "Dialog box", 1203 RTString: "String", 1204 RTFontDir: "Font directory", 1205 RTFont: "Font", 1206 RTAccelerator: "Accelerator", 1207 RTRCdata: "RC Data", 1208 RTMessageTable: "Message Table", 1209 RTGroupCursor: "Group Cursor", 1210 RTGroupIcon: "Group Icon", 1211 RTVersion: "Version", 1212 RTDlgInclude: "Dialog Include", 1213 RTPlugPlay: "Plug & Play", 1214 RTVxD: "VxD", 1215 RTAniCursor: "Animated Cursor", 1216 RTAniIcon: "Animated Icon", 1217 RTHtml: "HTML", 1218 RTManifest: "Manifest", 1219 } 1220 1221 if val, ok := rsrcTypeMap[rt]; ok { 1222 return val 1223 } 1224 1225 return "?" 1226 } 1227 1228 // String stringify the resource language. 1229 func (lang ResourceLang) String() string { 1230 1231 rsrcLangMap := map[ResourceLang]string{ 1232 LangAfrikaans: "Afrikaans (af)", 1233 LangAlbanian: "Albanian (sq)", 1234 LangAlsatian: "Alsatian (gsw)", 1235 LangAmharic: "Amharic (am)", 1236 LangArabic: "Arabic (ar)", 1237 LangArmenian: "Armenian (hy)", 1238 LangAssamese: "Assamese (as)", 1239 LangAzerbaijaniLatin: "Azerbaijani (Latin) (az)", 1240 LangBangla: "Bangla (bn)", 1241 LangBashkir: "Bashkir (ba)", 1242 LangBasque: "Basque (eu)", 1243 LangBelarusian: "Belarusian (be)", 1244 LangBosnianLatin: "Bosnian (Latin) (bs)", 1245 LangBreton: "Breton (br)", 1246 LangBulgarian: "Bulgarian (bg)", 1247 LangBurmese: "Burmese (my)", 1248 LangCatalan: "Catalan (ca)", 1249 LangCentralKurdish: "Central Kurdish (ku)", 1250 LangCherokee: "Cherokee (chr)", 1251 LangChineseSimplified: "Chinese (Simplified) (zh)", 1252 LangCorsican: "Corsican (co)", 1253 LangCroatian: "Croatian (hr)", 1254 LangCzech: "Czech (cs)", 1255 LangDanish: "Danish (da)", 1256 LangDari: "Dari (prs)", 1257 LangDivehi: "Divehi (dv)", 1258 LangDutch: "Dutch (nl)", 1259 LangEnglish: "English (en)", 1260 LangEstonian: "Estonian (et)", 1261 LangFaroese: "Faroese (fo)", 1262 LangFilipino: "Filipino (fil)", 1263 LangFinnish: "Finnish (fi)", 1264 LangFrench: "French (fr)", 1265 LangFrisian: "Frisian (fy)", 1266 LangFulah: "Fulah (ff)", 1267 LangFulahLatin: "Fulah (Latin) (ff-Latn)", 1268 LangGalician: "Galician (gl)", 1269 LangGeorgian: "Georgian (ka)", 1270 LangGerman: "German (de)", 1271 LangGreek: "Greek (el)", 1272 LangGreenlandic: "Greenlandic (kl)", 1273 LangGuarani: "Guarani (gn)", 1274 LangGujarati: "Gujarati (gu)", 1275 LangHausaLatin: "Hausa (Latin) (ha)", 1276 LangHawaiian: "Hawaiian (haw)", 1277 LangHebrew: "Hebrew (he)", 1278 LangHindi: "Hindi (hi)", 1279 LangHungarian: "Hungarian (hu)", 1280 LangIcelandic: "Icelandic (is)", 1281 LangIgbo: "Igbo (ig)", 1282 LangIndonesian: "Indonesian (id)", 1283 LangInuktitutLatin: "Inuktitut (Latin) (iu)", 1284 LangIrish: "Irish (ga)", 1285 LangItalian: "Italian (it)", 1286 LangJapanese: "Japanese (ja)", 1287 LangKannada: "Kannada (kn)", 1288 LangKashmiri: "Kashmiri (ks)", 1289 LangKazakh: "Kazakh (kk)", 1290 LangKhmer: "Khmer (km)", 1291 LangKiche: "K'iche (quc)", 1292 LangKinyarwanda: "Kinyarwanda (rw)", 1293 LangKiswahili: "Kiswahili (sw)", 1294 LangKonkani: "Konkani (kok)", 1295 LangKorean: "Korean (ko)", 1296 LangKyrgyz: "Kyrgyz (ky)", 1297 LangLao: "Lao (lo)", 1298 LangLatvian: "Latvian (lv)", 1299 LangLithuanian: "Lithuanian (lt)", 1300 LangLowerSorbian: "Lower Sorbian (dsb)", 1301 LangLuxembourgish: "Luxembourgish (lb)", 1302 LangMacedonian: "Macedonian (mk)", 1303 LangMalay: "Malay (ms)", 1304 LangMalayalam: "Malayalam (ml)", 1305 LangMaltese: "Maltese (mt)", 1306 LangMaori: "Maori (mi)", 1307 LangMapudungun: "Mapudungun (arn)", 1308 LangMarathi: "Marathi (mr)", 1309 LangMohawk: "Mohawk (moh)", 1310 LangMongolianCyrillic: "Mongolian (Cyrillic) (mn)", 1311 LangNepali: "Nepali (ne)", 1312 LangNorwegianBokmalNo: "Norwegian (Bokmal) (no)", 1313 LangNorwegianBokmal: "Norwegian (Bokmal) (nb)", 1314 LangNorwegianNynorsk: "Norwegian (Nynorsk) (nn)", 1315 LangOccitan: "Occitan (oc)", 1316 LangOdia: "Odia (or)", 1317 LangOromo: "Oromo (om)", 1318 LangPashto: "Pashto (ps)", 1319 LangPersian: "Persian (fa)", 1320 LangPolish: "Polish (pl)", 1321 LangPortuguese: "Portuguese (pt)", 1322 LangPunjabi: "Punjabi (pa)", 1323 LangQuechua: "Quechua (quz)", 1324 LangRomanian: "Romanian (ro)", 1325 LangRomansh: "Romansh (rm)", 1326 LangRussian: "Russian (ru)", 1327 LangSakha: "Sakha (sah)", 1328 LangSamiInari: "Sami (Inari) (smn)", 1329 LangSamiLule: "Sami (Lule) (smj)", 1330 LangSamiNorthern: "Sami (Northern) (se)", 1331 LangSamiSkolt: "Sami (Skolt) (sms)", 1332 LangSamiSouthern: "Sami (Southern) (sma)", 1333 LangSanskrit: "Sanskrit (sa)", 1334 LangScottishGaelic: "Scottish Gaelic (gd)", 1335 LangSerbianLatin: "Serbian (Latin) (sr)", 1336 LangSesothoSaLeboa: "Sesotho Sa Leboa (nso)", 1337 LangSetswana: "Setswana (tn)", 1338 LangSindhi: "Sindhi (sd)", 1339 LangSinhala: "Sinhala (si)", 1340 LangSlovak: "Slovak (sk)", 1341 LangSlovenian: "Slovenian (sl)", 1342 LangSomali: "Somali (so)", 1343 LangSotho: "Sotho (st)", 1344 LangSpanish: "Spanish (es)", 1345 LangSwedish: "Swedish (sv)", 1346 LangSyriac: "Syriac (syr)", 1347 LangTajikCyrillic: "Tajik (Cyrillic) (tg)", 1348 LangTamazightLatin: "Tamazight (Latin) (tzm)", 1349 LangTamil: "Tamil (ta)", 1350 LangTatar: "Tatar (tt)", 1351 LangTelugu: "Telugu (te)", 1352 LangThai: "Thai (th)", 1353 LangTibetan: "Tibetan (bo)", 1354 LangTigrinya: "Tigrinya (ti)", 1355 LangTsonga: "Tsonga (ts)", 1356 LangTurkish: "Turkish (tr)", 1357 LangTurkmen: "Turkmen (tk)", 1358 LangUkrainian: "Ukrainian (uk)", 1359 LangUpperSorbian: "Upper Sorbian (hsb)", 1360 LangUrdu: "Urdu (ur)", 1361 LangUyghur: "Uyghur (ug)", 1362 LangUzbekLatin: "Uzbek (Latin) (uz)", 1363 LangVenda: "Venda (ve)", 1364 LangVietnamese: "Vietnamese (vi)", 1365 LangWelsh: "Welsh (cy)", 1366 LangWolof: "Wolof (wo)", 1367 LangXhosa: "Xhosa (xh)", 1368 LangYi: "Yi (ii)", 1369 LangYoruba: "Yoruba (yo)", 1370 LangZulu: "Zulu (zu)", 1371 } 1372 1373 if val, ok := rsrcLangMap[lang]; ok { 1374 return val 1375 } 1376 1377 return "?" 1378 } 1379 1380 // String stringify the resource sub language. 1381 func (subLang ResourceSubLang) String() string { 1382 1383 rsrcSubLangMap := map[ResourceSubLang]string{ 1384 SubLangAfrikaansSouthAfrica: "Afrikaans South Africa (af-ZA)", 1385 SubLangAlbanianAlbania: "Albanian Albania (sq-AL)", 1386 SubLangAlsatianFrance: "Alsatian France (gsw-FR)", 1387 SubLangAmharicEthiopia: "Amharic Ethiopia (am-ET)", 1388 SubLangArabicAlgeria: "Arabic Algeria (ar-DZ)", 1389 SubLangArabicBahrain: "Arabic Bahrain (ar-BH)", 1390 SubLangArabicEgypt: "Arabic Egypt (ar-EG)", 1391 SubLangArabicIraq: "Arabic Iraq (ar-IQ)", 1392 SubLangArabicJordan: "Arabic Jordan (ar-JO)", 1393 SubLangArabicKuwait: "Arabic Kuwait (ar-KW)", 1394 SubLangArabicLebanon: "Arabic Lebanon (ar-LB)", 1395 SubLangArabicLibya: "Arabic Libya (ar-LY)", 1396 SubLangArabicMorocco: "Arabic Morocco (ar-MA)", 1397 SubLangArabicOman: "Arabic Oman (ar-OM)", 1398 SubLangArabicQatar: "Arabic Qatar (ar-QA)", 1399 SubLangArabicSaudiArabia: "Arabic Saudi Arabia (ar-SA)", 1400 SubLangArabicSyria: "Arabic Syria (ar-SY)", 1401 SubLangArabicTunisia: "Arabic Tunisia (ar-TN)", 1402 SubLangArabicUae: "Arabic U.a.e. (ar-AE)", 1403 SubLangArabicYemen: "Arabic Yemen (ar-YE)", 1404 SubLangArmenianArmenia: "Armenian Armenia (hy-AM)", 1405 SubLangAssameseIndia: "Assamese India (as-IN)", 1406 SubLangAzerbaijaniCyrillic: "Azerbaijani (Cyrillic) (az-Cyrl)", 1407 SubLangAzerbaijaniCyrillicAzerbaijan: "Azerbaijani (Cyrillic) Azerbaijan (az-Cyrl-AZ)", 1408 SubLangAzerbaijaniLatin: "Azerbaijani (Latin) (az-Latn)", 1409 SubLangAzerbaijaniLatinAzerbaijan: "Azerbaijani (Latin) Azerbaijan (az-Latn-AZ)", 1410 SubLangBanglaBangladesh: "Bangla Bangladesh (bn-BD)", 1411 SubLangBanglaIndia: "Bangla India (bn-IN)", 1412 SubLangBashkirRussia: "Bashkir Russia (ba-RU)", 1413 SubLangBasqueSpain: "Basque Spain (eu-ES)", 1414 SubLangBelarusianBelarus: "Belarusian Belarus (be-BY)", 1415 SubLangBosnianCyrillic: "Bosnian (Cyrillic) (bs-Cyrl)", 1416 SubLangBosnianCyrillicBosniaAndHerzegovina: "Bosnian (Cyrillic) Bosnia And Herzegovina (bs-Cyrl-BA)", 1417 SubLangBosnianLatin: "Bosnian (Latin) (bs-Latn)", 1418 SubLangBosnianLatinBosniaAndHerzegovina: "Bosnian (Latin) Bosnia And Herzegovina (bs-Latn-BA)", 1419 SubLangBretonFrance: "Breton France (br-FR)", 1420 SubLangBulgarianBulgaria: "Bulgarian Bulgaria (bg-BG)", 1421 SubLangBurmeseMyanmar: "Burmese Myanmar (my-MM)", 1422 SubLangCatalanSpain: "Catalan Spain (ca-ES)", 1423 SubLangCentralAtlasTamazightArabicMorocco: "Central Atlas Tamazight (Arabic) Morocco (tzm-ArabMA)", 1424 SubLangCentralKurdish: "Central Kurdish (ku-Arab)", 1425 SubLangCentralKurdishIraq: "Central Kurdish Iraq (ku-Arab-IQ)", 1426 SubLangCherokee: "Cherokee (chr-Cher)", 1427 SubLangCherokeeUnitedStates: "Cherokee United States (chr-Cher-US)", 1428 SubLangChineseSimplified: "Chinese (Simplified) (zh-Hans)", 1429 SubLangChineseSimplifiedPeoplesRepublicOfChina: "Chinese (Simplified) People's Republic Of China (zh-CN)", 1430 SubLangChineseSimplifiedSingapore: "Chinese (Simplified) Singapore (zh-SG)", 1431 SubLangChineseTraditional: "Chinese (Traditional) (zh-Hant)", 1432 SubLangChineseTraditionalHongKongSar: "Chinese (Traditional) Hong Kong S.a.r. (zh-HK)", 1433 SubLangChineseTraditionalMacaoSar: "Chinese (Traditional) Macao S.a.r. (zh-MO)", 1434 SubLangChineseTraditionalTaiwan: "Chinese (Traditional) Taiwan (zh-TW)", 1435 SubLangCorsicanFrance: "Corsican France (co-FR)", 1436 SubLangCroatianCroatia: "Croatian Croatia (hr-HR)", 1437 SubLangCroatianLatinBosniaAndHerzegovina: "Croatian (Latin) Bosnia And Herzegovina (hr-BA)", 1438 SubLangCzechCzechRepublic: "Czech Czech Republic (cs-CZ)", 1439 SubLangDanishDenmark: "Danish Denmark (da-DK)", 1440 SubLangDariAfghanistan: "Dari Afghanistan (prs-AF)", 1441 SubLangDivehiMaldives: "Divehi Maldives (dv-MV)", 1442 SubLangDutchBelgium: "Dutch Belgium (nl-BE)", 1443 SubLangDutchNetherlands: "Dutch Netherlands (nl-NL)", 1444 SubLangDzongkhaBhutan: "Dzongkha Bhutan (dz-BT)", 1445 SubLangEnglishAustralia: "English Australia (en-AU)", 1446 SubLangEnglishBelize: "English Belize (en-BZ)", 1447 SubLangEnglishCanada: "English Canada (en-CA)", 1448 SubLangEnglishCaribbean: "English Caribbean (en-029)", 1449 SubLangEnglishHongKong: "English Hong Kong (en-HK)", 1450 SubLangEnglishIndia: "English India (en-IN)", 1451 SubLangEnglishIreland: "English Ireland (en-IE)", 1452 SubLangEnglishJamaica: "English Jamaica (en-JM)", 1453 SubLangEnglishMalaysia: "English Malaysia (en-MY)", 1454 SubLangEnglishNewZealand: "English New Zealand (en-NZ)", 1455 SubLangEnglishRepublicOfThePhilippines: "English Republic Of The Philippines (en-PH)", 1456 SubLangEnglishSingapore: "English Singapore (en-SG)", 1457 SubLangEnglishSouthAfrica: "English South Africa (en-ZA)", 1458 SubLangEnglishTrinidadAndTobago: "English Trinidad And Tobago (en-TT)", 1459 SubLangEnglishUnitedArabEmirates: "English United Arab Emirates (en-AE)", 1460 SubLangEnglishUnitedKingdom: "English United Kingdom (en-GB)", 1461 SubLangEnglishUnitedStates: "English United States (en-US)", 1462 SubLangEnglishZimbabwe: "English Zimbabwe (en-ZW)", 1463 SubLangEstonianEstonia: "Estonian Estonia (et-EE)", 1464 SubLangFaroeseFaroeIslands: "Faroese Faroe Islands (fo-FO)", 1465 SubLangFilipinoPhilippines: "Filipino Philippines (fil-PH)", 1466 SubLangFinnishFinland: "Finnish Finland (fi-FI)", 1467 SubLangFrenchBelgium: "French Belgium (fr-BE)", 1468 SubLangFrenchCameroon: "French Cameroon (fr-CM)", 1469 SubLangFrenchCanada: "French Canada (fr-CA)", 1470 SubLangFrenchCaribbean: "French Caribbean (fr-029)", 1471 SubLangFrenchCongoDrc: "French Congo, Drc (fr-CD)", 1472 SubLangFrenchCôteDivoire: "French Côte D'ivoire (fr-CI)", 1473 SubLangFrenchFrance: "French France (fr-FR)", 1474 SubLangFrenchHaiti: "French Haiti (fr-HT)", 1475 SubLangFrenchLuxembourg: "French Luxembourg (fr-LU)", 1476 SubLangFrenchMali: "French Mali (fr-ML)", 1477 SubLangFrenchMorocco: "French Morocco (fr-MA)", 1478 SubLangFrenchPrincipalityOfMonaco: "French Principality Of Monaco (fr-MC)", 1479 SubLangFrenchReunion: "French Reunion (fr-RE)", 1480 SubLangFrenchSenegal: "French Senegal (fr-SN)", 1481 SubLangFrenchSwitzerland: "French Switzerland (fr-CH)", 1482 SubLangFrisianNetherlands: "Frisian Netherlands (fy-NL)", 1483 SubLangFulahNigeria: "Fulah Nigeria (ff-NG)", 1484 SubLangFulahLatinNigeria: "Fulah (Latin) Nigeria (ff-Latn-NG)", 1485 SubLangFulahSenegal: "Fulah Senegal (ff-Latn-SN)", 1486 SubLangGalicianSpain: "Galician Spain (gl-ES)", 1487 SubLangGeorgianGeorgia: "Georgian Georgia (ka-GE)", 1488 SubLangGermanAustria: "German Austria (de-AT)", 1489 SubLangGermanGermany: "German Germany (de-DE)", 1490 SubLangGermanLiechtenstein: "German Liechtenstein (de-LI)", 1491 SubLangGermanLuxembourg: "German Luxembourg (de-LU)", 1492 SubLangGermanSwitzerland: "German Switzerland (de-CH)", 1493 SubLangGreekGreece: "Greek Greece (el-GR)", 1494 SubLangGreenlandicGreenland: "Greenlandic Greenland (kl-GL)", 1495 SubLangGuaraniParaguay: "Guarani Paraguay (gn-PY)", 1496 SubLangGujaratiIndia: "Gujarati India (gu-IN)", 1497 SubLangHausaLatin: "Hausa (Latin) (ha-Latn)", 1498 SubLangHausaLatinNigeria: "Hausa (Latin) Nigeria (ha-Latn-NG)", 1499 SubLangHawaiianUnitedStates: "Hawaiian United States (haw-US)", 1500 SubLangHebrewIsrael: "Hebrew Israel (he-IL)", 1501 SubLangHindiIndia: "Hindi India (hi-IN)", 1502 SubLangHungarianHungary: "Hungarian Hungary (hu-HU)", 1503 SubLangIcelandicIceland: "Icelandic Iceland (is-IS)", 1504 SubLangIgboNigeria: "Igbo Nigeria (ig-NG)", 1505 SubLangIndonesianIndonesia: "Indonesian Indonesia (id-ID)", 1506 SubLangInuktitutLatin: "Inuktitut (Latin) (iu-Latn)", 1507 SubLangInuktitutLatinCanada: "Inuktitut (Latin) Canada (iu-Latn-CA)", 1508 SubLangInuktitutSyllabics: "Inuktitut (Syllabics) (iu-Cans)", 1509 SubLangInuktitutSyllabicsCanada: "Inuktitut (Syllabics) Canada (iu-Cans-CA)", 1510 SubLangIrishIreland: "Irish Ireland (ga-IE)", 1511 SubLangItalianItaly: "Italian Italy (it-IT)", 1512 SubLangItalianSwitzerland: "Italian Switzerland (it-CH)", 1513 SubLangJapaneseJapan: "Japanese Japan (ja-JP)", 1514 SubLangKannadaIndia: "Kannada India (kn-IN)", 1515 SubLangKanuriLatinNigeria: "Kanuri (Latin) Nigeria (kr-Latn-NG)", 1516 SubLangKashmiriPersoArabic: "Kashmiri Perso-Arabic (ks-Arab)", 1517 SubLangKashmiriDevanagariIndia: "Kashmiri (Devanagari) India (ks-Deva-IN)", 1518 SubLangKazakhKazakhstan: "Kazakh Kazakhstan (kk-KZ)", 1519 SubLangKhmerCambodia: "Khmer Cambodia (km-KH)", 1520 SubLangKicheGuatemala: "K'iche Guatemala (quc-Latn-GT)", 1521 SubLangKinyarwandaRwanda: "Kinyarwanda Rwanda (rw-RW)", 1522 SubLangKiswahiliKenya: "Kiswahili Kenya (sw-KE)", 1523 SubLangKonkaniIndia: "Konkani India (kok-IN)", 1524 SubLangKoreanKorea: "Korean Korea (ko-KR)", 1525 SubLangKyrgyzKyrgyzstan: "Kyrgyz Kyrgyzstan (ky-KG)", 1526 SubLangLaoLaoPdr: "Lao Lao P.d.r. (lo-LA)", 1527 SubLangLatinVaticanCity: "Latin Vatican City (la-VA)", 1528 SubLangLatvianLatvia: "Latvian Latvia (lv-LV)", 1529 SubLangLithuanianLithuania: "Lithuanian Lithuania (lt-LT)", 1530 SubLangLowerSorbianGermany: "Lower Sorbian Germany (dsb-DE)", 1531 SubLangLuxembourgishLuxembourg: "Luxembourgish Luxembourg (lb-LU)", 1532 SubLangMacedonianNorthMacedonia: "Macedonian North Macedonia (mk-MK)", 1533 SubLangMalayBruneiDarussalam: "Malay Brunei Darussalam (ms-BN)", 1534 SubLangMalayMalaysia: "Malay Malaysia (ms-MY)", 1535 SubLangMalayalamIndia: "Malayalam India (ml-IN)", 1536 SubLangMalteseMalta: "Maltese Malta (mt-MT)", 1537 SubLangMaoriNewZealand: "Maori New Zealand (mi-NZ)", 1538 SubLangMapudungunChile: "Mapudungun Chile (arn-CL)", 1539 SubLangMarathiIndia: "Marathi India (mr-IN)", 1540 SubLangMohawkCanada: "Mohawk Canada (moh-CA)", 1541 SubLangMongolianCyrillic: "Mongolian (Cyrillic) (mn-Cyrl)", 1542 SubLangMongolianCyrillicMongolia: "Mongolian (Cyrillic) Mongolia (mn-MN)", 1543 SubLangMongolianTraditionalMongolian: "Mongolian (Traditional Mongolian) (mn-Mong)", 1544 SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina: "Mongolian (Traditional Mongolian) People's Republic Of China (mn-MongCN)", 1545 SubLangMongolianTraditionalMongolianMongolia: "Mongolian (Traditional Mongolian) Mongolia (mn-MongMN)", 1546 SubLangNepaliIndia: "Nepali India (ne-IN)", 1547 SubLangNepaliNepal: "Nepali Nepal (ne-NP)", 1548 SubLangNorwegianBokmalNorway: "Norwegian (Bokmal) Norway (nb-NO)", 1549 SubLangNorwegianNynorskNorway: "Norwegian (Nynorsk) Norway (nn-NO)", 1550 SubLangOccitanFrance: "Occitan France (oc-FR)", 1551 SubLangOdiaIndia: "Odia India (or-IN)", 1552 SubLangOromoEthiopia: "Oromo Ethiopia (om-ET)", 1553 SubLangPashtoAfghanistan: "Pashto Afghanistan (ps-AF)", 1554 SubLangPersianIran: "Persian Iran (fa-IR)", 1555 SubLangPolishPoland: "Polish Poland (pl-PL)", 1556 SubLangPortugueseBrazil: "Portuguese Brazil (pt-BR)", 1557 SubLangPortuguesePortugal: "Portuguese Portugal (pt-PT)", 1558 SubLangPseudoLanguagePseudoLocaleForEastAsianComplexScriptLocalizationTesting: "Pseudo Language Pseudo Locale For East Asian/Complex Script Localization Testing (qps-ploca)", 1559 SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTesting: "Pseudo Language Pseudo Locale Used For Localization Testing (qps-ploc)", 1560 SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTestingOfMirroredLocales: "Pseudo Language Pseudo Locale Used For Localization Testing Of Mirrored Locales (qps-plocm)", 1561 SubLangPunjabi: "Punjabi (pa-Arab)", 1562 SubLangPunjabiIndia: "Punjabi India (pa-IN)", 1563 SubLangPunjabiIslamicRepublicOfPakistan: "Punjabi Islamic Republic Of Pakistan (pa-Arab-PK)", 1564 SubLangQuechuaBolivia: "Quechua Bolivia (quz-BO)", 1565 SubLangQuechuaEcuador: "Quechua Ecuador (quz-EC)", 1566 SubLangQuechuaPeru: "Quechua Peru (quz-PE)", 1567 SubLangRomanianMoldova: "Romanian Moldova (ro-MD)", 1568 SubLangRomanianRomania: "Romanian Romania (ro-RO)", 1569 SubLangRomanshSwitzerland: "Romansh Switzerland (rm-CH)", 1570 SubLangRussianMoldova: "Russian Moldova (ru-MD)", 1571 SubLangRussianRussia: "Russian Russia (ru-RU)", 1572 SubLangSakhaRussia: "Sakha Russia (sah-RU)", 1573 SubLangSamiInariFinland: "Sami (Inari) Finland (smn-FI)", 1574 SubLangSamiLuleNorway: "Sami (Lule) Norway (smj-NO)", 1575 SubLangSamiLuleSweden: "Sami (Lule) Sweden (smj-SE)", 1576 SubLangSamiNorthernFinland: "Sami (Northern) Finland (se-FI)", 1577 SubLangSamiNorthernNorway: "Sami (Northern) Norway (se-NO)", 1578 SubLangSamiNorthernSweden: "Sami (Northern) Sweden (se-SE)", 1579 SubLangSamiSkoltFinland: "Sami (Skolt) Finland (sms-FI)", 1580 SubLangSamiSouthernNorway: "Sami (Southern) Norway (sma-NO)", 1581 SubLangSamiSouthernSweden: "Sami (Southern) Sweden (sma-SE)", 1582 SubLangSanskritIndia: "Sanskrit India (sa-IN)", 1583 SubLangScottishGaelicUnitedKingdom: "Scottish Gaelic United Kingdom (gd-GB)", 1584 SubLangSerbianCyrillic: "Serbian (Cyrillic) (sr-Cyrl)", 1585 SubLangSerbianCyrillicBosniaAndHerzegovina: "Serbian (Cyrillic) Bosnia And Herzegovina (sr-Cyrl-BA)", 1586 SubLangSerbianCyrillicMontenegro: "Serbian (Cyrillic) Montenegro (sr-Cyrl-ME)", 1587 SubLangSerbianCyrillicSerbia: "Serbian (Cyrillic) Serbia (sr-Cyrl-RS)", 1588 SubLangSerbianCyrillicSerbiaAndMontenegroFormer: "Serbian (Cyrillic) Serbia And Montenegro (Former) (sr-Cyrl-CS)", 1589 SubLangSerbianLatin: "Serbian (Latin) (sr-Latn)", 1590 SubLangSerbianLatinBosniaAndHerzegovina: "Serbian (Latin) Bosnia And Herzegovina (sr-Latn-BA)", 1591 SubLangSerbianLatinMontenegro: "Serbian (Latin) Montenegro (sr-Latn-ME)", 1592 SubLangSerbianLatinSerbia: "Serbian (Latin) Serbia (sr-Latn-RS)", 1593 SubLangSerbianLatinSerbiaAndMontenegroFormer: "Serbian (Latin) Serbia And Montenegro (Former) (sr-Latn-CS)", 1594 SubLangSesothoSaLeboaSouthAfrica: "Sesotho Sa Leboa South Africa (nso-ZA)", 1595 SubLangSetswanaBotswana: "Setswana Botswana (tn-BW)", 1596 SubLangSetswanaSouthAfrica: "Setswana South Africa (tn-ZA)", 1597 SubLangSindhi: "Sindhi (sd-Arab)", 1598 SubLangSindhiIslamicRepublicOfPakistan: "Sindhi Islamic Republic Of Pakistan (sd-Arab-PK)", 1599 SubLangSinhalaSriLanka: "Sinhala Sri Lanka (si-LK)", 1600 SubLangSlovakSlovakia: "Slovak Slovakia (sk-SK)", 1601 SubLangSlovenianSlovenia: "Slovenian Slovenia (sl-SI)", 1602 SubLangSomaliSomalia: "Somali Somalia (so-SO)", 1603 SubLangSothoSouthAfrica: "Sotho South Africa (st-ZA)", 1604 SubLangSpanishArgentina: "Spanish Argentina (es-AR)", 1605 SubLangSpanishBolivarianRepublicOfVenezuela: "Spanish Bolivarian Republic Of Venezuela (es-VE)", 1606 SubLangSpanishBolivia: "Spanish Bolivia (es-BO)", 1607 SubLangSpanishChile: "Spanish Chile (es-CL)", 1608 SubLangSpanishColombia: "Spanish Colombia (es-CO)", 1609 SubLangSpanishCostaRica: "Spanish Costa Rica (es-CR)", 1610 SubLangSpanishCuba: "Spanish Cuba (es-CU)", 1611 SubLangSpanishDominicanRepublic: "Spanish Dominican Republic (es-DO)", 1612 SubLangSpanishEcuador: "Spanish Ecuador (es-EC)", 1613 SubLangSpanishElSalvador: "Spanish El Salvador (es-SV)", 1614 SubLangSpanishGuatemala: "Spanish Guatemala (es-GT)", 1615 SubLangSpanishHonduras: "Spanish Honduras (es-HN)", 1616 SubLangSpanishLatinAmerica: "Spanish Latin America (es-419)", 1617 SubLangSpanishMexico: "Spanish Mexico (es-MX)", 1618 SubLangSpanishNicaragua: "Spanish Nicaragua (es-NI)", 1619 SubLangSpanishPanama: "Spanish Panama (es-PA)", 1620 SubLangSpanishParaguay: "Spanish Paraguay (es-PY)", 1621 SubLangSpanishPeru: "Spanish Peru (es-PE)", 1622 SubLangSpanishPuertoRico: "Spanish Puerto Rico (es-PR)", 1623 SubLangSpanishSpainTraditional: "Spanish Spain (es-ES_tradnl)", 1624 SubLangSpanishSpain: "Spanish Spain (es-ES)", 1625 SubLangSpanishUnitedStates: "Spanish United States (es-US)", 1626 SubLangSpanishUruguay: "Spanish Uruguay (es-UY)", 1627 SubLangSwedishFinland: "Swedish Finland (sv-FI)", 1628 SubLangSwedishSweden: "Swedish Sweden (sv-SE)", 1629 SubLangSyriacSyria: "Syriac Syria (syr-SY)", 1630 SubLangTajikCyrillic: "Tajik (Cyrillic) (tg-Cyrl)", 1631 SubLangTajikCyrillicTajikistan: "Tajik (Cyrillic) Tajikistan (tg-Cyrl-TJ)", 1632 SubLangTamazightLatin: "Tamazight (Latin) (tzm-Latn)", 1633 SubLangTamazightLatinAlgeria: "Tamazight (Latin) Algeria (tzm-Latn-DZ)", 1634 SubLangTamilIndia: "Tamil India (ta-IN)", 1635 SubLangTamilSriLanka: "Tamil Sri Lanka (ta-LK)", 1636 SubLangTatarRussia: "Tatar Russia (tt-RU)", 1637 SubLangTeluguIndia: "Telugu India (te-IN)", 1638 SubLangThaiThailand: "Thai Thailand (th-TH)", 1639 SubLangTibetanPeoplesRepublicOfChina: "Tibetan People's Republic Of China (bo-CN)", 1640 SubLangTigrinyaEritrea: "Tigrinya Eritrea (ti-ER)", 1641 SubLangTigrinyaEthiopia: "Tigrinya Ethiopia (ti-ET)", 1642 SubLangTsongaSouthAfrica: "Tsonga South Africa (ts-ZA)", 1643 SubLangTurkishTurkey: "Turkish Turkey (tr-TR)", 1644 SubLangTurkmenTurkmenistan: "Turkmen Turkmenistan (tk-TM)", 1645 SubLangUkrainianUkraine: "Ukrainian Ukraine (uk-UA)", 1646 SubLangUpperSorbianGermany: "Upper Sorbian Germany (hsb-DE)", 1647 SubLangUrduIndia: "Urdu India (ur-IN)", 1648 SubLangUrduIslamicRepublicOfPakistan: "Urdu Islamic Republic Of Pakistan (ur-PK)", 1649 SubLangUyghurPeoplesRepublicOfChina: "Uyghur People's Republic Of China (ug-CN)", 1650 SubLangUzbekCyrillic: "Uzbek (Cyrillic) (uz-Cyrl)", 1651 SubLangUzbekCyrillicUzbekistan: "Uzbek (Cyrillic) Uzbekistan (uz-Cyrl-UZ)", 1652 SubLangUzbekLatin: "Uzbek (Latin) (uz-Latn)", 1653 SubLangUzbekLatinUzbekistan: "Uzbek (Latin) Uzbekistan (uz-Latn-UZ)", 1654 SubLangValencianSpain: "Valencian Spain (ca-ESvalencia)", 1655 SubLangVendaSouthAfrica: "Venda South Africa (ve-ZA)", 1656 SubLangVietnameseVietnam: "Vietnamese Vietnam (vi-VN)", 1657 SubLangWelshUnitedKingdom: "Welsh United Kingdom (cy-GB)", 1658 SubLangWolofSenegal: "Wolof Senegal (wo-SN)", 1659 SubLangXhosaSouthAfrica: "Xhosa South Africa (xh-ZA)", 1660 SubLangYiPeoplesRepublicOfChina: "Yi People's Republic Of China (ii-CN)", 1661 SubLangYiddishWorld: "Yiddish World (yi-001)", 1662 SubLangYorubaNigeria: "Yoruba Nigeria (yo-NG)", 1663 SubLangZuluSouthAfrica: "Zulu South Africa (zu-ZA)", 1664 } 1665 1666 if val, ok := rsrcSubLangMap[subLang]; ok { 1667 return val 1668 } 1669 1670 return "?" 1671 } 1672 1673 // PrettyResourceLang prettifies the resource lang and sub lang. 1674 func PrettyResourceLang(lang ResourceLang, subLang int) string { 1675 m := map[ResourceLang]map[int]ResourceSubLang{ 1676 LangAfrikaans: { 1677 0x1: SubLangAfrikaansSouthAfrica, 1678 }, 1679 LangAlbanian: { 1680 0x1: SubLangAlbanianAlbania, 1681 }, 1682 LangAlsatian: { 1683 0x1: SubLangAlsatianFrance, 1684 }, 1685 LangAmharic: { 1686 0x1: SubLangAmharicEthiopia, 1687 }, 1688 LangArabic: { 1689 0x5: SubLangArabicAlgeria, 1690 0xf: SubLangArabicBahrain, 1691 0x3: SubLangArabicEgypt, 1692 0x2: SubLangArabicIraq, 1693 0xb: SubLangArabicJordan, 1694 0xd: SubLangArabicKuwait, 1695 0xc: SubLangArabicLebanon, 1696 0x4: SubLangArabicLibya, 1697 0x6: SubLangArabicMorocco, 1698 0x8: SubLangArabicOman, 1699 0x10: SubLangArabicQatar, 1700 0x1: SubLangArabicSaudiArabia, 1701 0xa: SubLangArabicSyria, 1702 0x7: SubLangArabicTunisia, 1703 0xe: SubLangArabicUae, 1704 0x9: SubLangArabicYemen, 1705 }, 1706 LangArmenian: { 1707 0x1: SubLangArmenianArmenia, 1708 }, 1709 LangAssamese: { 1710 0x1: SubLangAssameseIndia, 1711 0x1d: SubLangAzerbaijaniCyrillic, 1712 0x2: SubLangAzerbaijaniCyrillicAzerbaijan, 1713 }, 1714 LangAzerbaijaniLatin: { 1715 0x1e: SubLangAzerbaijaniLatin, 1716 0x1: SubLangAzerbaijaniLatinAzerbaijan, 1717 }, 1718 LangBangla: { 1719 0x2: SubLangBanglaBangladesh, 1720 0x1: SubLangBanglaIndia, 1721 }, 1722 LangBashkir: { 1723 0x1: SubLangBashkirRussia, 1724 }, 1725 LangBasque: { 1726 0x1: SubLangBasqueSpain, 1727 }, 1728 LangBelarusian: { 1729 0x1: SubLangBelarusianBelarus, 1730 0x19: SubLangBosnianCyrillic, 1731 0x8: SubLangBosnianCyrillicBosniaAndHerzegovina, 1732 0x1a: SubLangBosnianLatin, 1733 }, 1734 LangBosnianLatin: { 1735 0x5: SubLangBosnianLatinBosniaAndHerzegovina, 1736 }, 1737 LangBreton: { 1738 0x1: SubLangBretonFrance, 1739 }, 1740 LangBulgarian: { 1741 0x1: SubLangBulgarianBulgaria, 1742 }, 1743 LangBurmese: { 1744 0x1: SubLangBurmeseMyanmar, 1745 }, 1746 LangCatalan: { 1747 0x1: SubLangCatalanSpain, 1748 }, 1749 LangCentralKurdish: { 1750 0x1f: SubLangCentralKurdish, 1751 0x1: SubLangCentralKurdishIraq, 1752 }, 1753 LangCherokee: { 1754 0x1f: SubLangCherokee, 1755 0x1: SubLangCherokeeUnitedStates, 1756 0x0: SubLangChineseSimplified, 1757 }, 1758 LangChineseSimplified: { 1759 0x2: SubLangChineseSimplifiedPeoplesRepublicOfChina, 1760 0x4: SubLangChineseSimplifiedSingapore, 1761 0x1f: SubLangChineseTraditional, 1762 0x3: SubLangChineseTraditionalHongKongSar, 1763 0x5: SubLangChineseTraditionalMacaoSar, 1764 0x1: SubLangChineseTraditionalTaiwan, 1765 }, 1766 LangCorsican: { 1767 0x1: SubLangCorsicanFrance, 1768 }, 1769 LangCroatian: { 1770 0x1: SubLangCroatianCroatia, 1771 0x4: SubLangCroatianLatinBosniaAndHerzegovina, 1772 }, 1773 LangCzech: { 1774 0x1: SubLangCzechCzechRepublic, 1775 }, 1776 LangDanish: { 1777 0x1: SubLangDanishDenmark, 1778 }, 1779 LangDari: { 1780 0x1: SubLangDariAfghanistan, 1781 }, 1782 LangDivehi: { 1783 0x1: SubLangDivehiMaldives, 1784 }, 1785 LangDutch: { 1786 0x2: SubLangDutchBelgium, 1787 0x1: SubLangDutchNetherlands, 1788 0x3: SubLangDzongkhaBhutan, 1789 }, 1790 LangEnglish: { 1791 0x3: SubLangEnglishAustralia, 1792 0xa: SubLangEnglishBelize, 1793 0x4: SubLangEnglishCanada, 1794 0x9: SubLangEnglishCaribbean, 1795 0xf: SubLangEnglishHongKong, 1796 0x10: SubLangEnglishIndia, 1797 0x6: SubLangEnglishIreland, 1798 0x8: SubLangEnglishJamaica, 1799 0x11: SubLangEnglishMalaysia, 1800 0x5: SubLangEnglishNewZealand, 1801 0xd: SubLangEnglishRepublicOfThePhilippines, 1802 0x12: SubLangEnglishSingapore, 1803 0x7: SubLangEnglishSouthAfrica, 1804 0xb: SubLangEnglishTrinidadAndTobago, 1805 0x13: SubLangEnglishUnitedArabEmirates, 1806 0x2: SubLangEnglishUnitedKingdom, 1807 0x1: SubLangEnglishUnitedStates, 1808 0xc: SubLangEnglishZimbabwe, 1809 }, 1810 LangEstonian: { 1811 0x1: SubLangEstonianEstonia, 1812 }, 1813 LangFaroese: { 1814 0x1: SubLangFaroeseFaroeIslands, 1815 }, 1816 LangFilipino: { 1817 0x1: SubLangFilipinoPhilippines, 1818 }, 1819 LangFinnish: { 1820 0x1: SubLangFinnishFinland, 1821 }, 1822 LangFrench: { 1823 0x2: SubLangFrenchBelgium, 1824 0xb: SubLangFrenchCameroon, 1825 0x3: SubLangFrenchCanada, 1826 0x7: SubLangFrenchCaribbean, 1827 0x9: SubLangFrenchCongoDrc, 1828 0xc: SubLangFrenchCôteDivoire, 1829 0x1: SubLangFrenchFrance, 1830 0xf: SubLangFrenchHaiti, 1831 0x5: SubLangFrenchLuxembourg, 1832 0xd: SubLangFrenchMali, 1833 0xe: SubLangFrenchMorocco, 1834 0x6: SubLangFrenchPrincipalityOfMonaco, 1835 0x8: SubLangFrenchReunion, 1836 0xa: SubLangFrenchSenegal, 1837 0x4: SubLangFrenchSwitzerland, 1838 }, 1839 LangFrisian: { 1840 0x1: SubLangFrisianNetherlands, 1841 }, 1842 LangFulah: { 1843 0x1: SubLangFulahNigeria, 1844 0x2: SubLangFulahSenegal, 1845 }, 1846 LangFulahLatin: { 1847 0x1: SubLangFulahLatinNigeria, 1848 }, 1849 LangGalician: { 1850 0x1: SubLangGalicianSpain, 1851 }, 1852 LangGeorgian: { 1853 0x1: SubLangGeorgianGeorgia, 1854 }, 1855 LangGerman: { 1856 0x3: SubLangGermanAustria, 1857 0x1: SubLangGermanGermany, 1858 0x5: SubLangGermanLiechtenstein, 1859 0x4: SubLangGermanLuxembourg, 1860 0x2: SubLangGermanSwitzerland, 1861 }, 1862 LangGreek: { 1863 0x1: SubLangGreekGreece, 1864 }, 1865 LangGreenlandic: { 1866 0x1: SubLangGreenlandicGreenland, 1867 }, 1868 LangGuarani: { 1869 0x1: SubLangGuaraniParaguay, 1870 }, 1871 LangGujarati: { 1872 0x1: SubLangGujaratiIndia, 1873 }, 1874 LangHausaLatin: { 1875 0x1f: SubLangHausaLatin, 1876 0x1: SubLangHausaLatinNigeria, 1877 }, 1878 LangHawaiian: { 1879 0x1: SubLangHawaiianUnitedStates, 1880 }, 1881 LangHebrew: { 1882 0x1: SubLangHebrewIsrael, 1883 }, 1884 LangHindi: { 1885 0x1: SubLangHindiIndia, 1886 }, 1887 LangHungarian: { 1888 0x1: SubLangHungarianHungary, 1889 }, 1890 LangIcelandic: { 1891 0x1: SubLangIcelandicIceland, 1892 }, 1893 LangIgbo: { 1894 0x1: SubLangIgboNigeria, 1895 }, 1896 LangIndonesian: { 1897 0x1: SubLangIndonesianIndonesia, 1898 }, 1899 LangInuktitutLatin: { 1900 0x1f: SubLangInuktitutLatin, 1901 0x2: SubLangInuktitutLatinCanada, 1902 0x1e: SubLangInuktitutSyllabics, 1903 0x1: SubLangInuktitutSyllabicsCanada, 1904 }, 1905 LangIrish: { 1906 0x2: SubLangIrishIreland, 1907 }, 1908 LangItalian: { 1909 0x1: SubLangItalianItaly, 1910 0x2: SubLangItalianSwitzerland, 1911 }, 1912 LangJapanese: { 1913 0x1: SubLangJapaneseJapan, 1914 }, 1915 LangKannada: { 1916 0x1: SubLangKannadaIndia, 1917 }, 1918 LangKashmiri: { 1919 0x1: SubLangKashmiriPersoArabic, 1920 0x2: SubLangKashmiriDevanagariIndia, 1921 }, 1922 LangKazakh: { 1923 0x1: SubLangKazakhKazakhstan, 1924 }, 1925 LangKhmer: { 1926 0x1: SubLangKhmerCambodia, 1927 }, 1928 LangKiche: { 1929 0x1: SubLangKicheGuatemala, 1930 }, 1931 LangKinyarwanda: { 1932 0x1: SubLangKinyarwandaRwanda, 1933 }, 1934 LangKiswahili: { 1935 0x1: SubLangKiswahiliKenya, 1936 }, 1937 LangKonkani: { 1938 0x1: SubLangKonkaniIndia, 1939 }, 1940 LangKorean: { 1941 0x1: SubLangKoreanKorea, 1942 }, 1943 LangKyrgyz: { 1944 0x1: SubLangKyrgyzKyrgyzstan, 1945 }, 1946 LangLao: { 1947 0x1: SubLangLaoLaoPdr, 1948 }, 1949 LangLatvian: { 1950 0x1: SubLangLatvianLatvia, 1951 }, 1952 LangLithuanian: { 1953 0x1: SubLangLithuanianLithuania, 1954 }, 1955 LangLowerSorbian: { 1956 0x2: SubLangLowerSorbianGermany, 1957 }, 1958 LangLuxembourgish: { 1959 0x1: SubLangLuxembourgishLuxembourg, 1960 }, 1961 LangMacedonian: { 1962 0x1: SubLangMacedonianNorthMacedonia, 1963 }, 1964 LangMalay: { 1965 0x2: SubLangMalayBruneiDarussalam, 1966 0x1: SubLangMalayMalaysia, 1967 }, 1968 LangMalayalam: { 1969 0x1: SubLangMalayalamIndia, 1970 }, 1971 LangMaltese: { 1972 0x1: SubLangMalteseMalta, 1973 }, 1974 LangMaori: { 1975 0x1: SubLangMaoriNewZealand, 1976 }, 1977 LangMapudungun: { 1978 0x1: SubLangMapudungunChile, 1979 }, 1980 LangMarathi: { 1981 0x1: SubLangMarathiIndia, 1982 }, 1983 LangMohawk: { 1984 0x1: SubLangMohawkCanada, 1985 }, 1986 LangMongolianCyrillic: { 1987 0x1e: SubLangMongolianCyrillic, 1988 0x1: SubLangMongolianCyrillicMongolia, 1989 0x1f: SubLangMongolianTraditionalMongolian, 1990 0x2: SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina, 1991 0x3: SubLangMongolianTraditionalMongolianMongolia, 1992 }, 1993 LangNepali: { 1994 0x2: SubLangNepaliIndia, 1995 0x1: SubLangNepaliNepal, 1996 }, 1997 LangNorwegianBokmalNo: {}, 1998 LangNorwegianBokmal: { 1999 0x1: SubLangNorwegianBokmalNorway, 2000 }, 2001 LangNorwegianNynorsk: { 2002 0x2: SubLangNorwegianNynorskNorway, 2003 }, 2004 LangOccitan: { 2005 0x1: SubLangOccitanFrance, 2006 }, 2007 LangOdia: { 2008 0x1: SubLangOdiaIndia, 2009 }, 2010 LangOromo: { 2011 0x1: SubLangOromoEthiopia, 2012 }, 2013 LangPashto: { 2014 0x1: SubLangPashtoAfghanistan, 2015 }, 2016 LangPersian: { 2017 0x1: SubLangPersianIran, 2018 }, 2019 LangPolish: { 2020 0x1: SubLangPolishPoland, 2021 }, 2022 LangPortuguese: { 2023 0x1: SubLangPortugueseBrazil, 2024 0x2: SubLangPortuguesePortugal, 2025 }, 2026 LangPunjabi: { 2027 0x1f: SubLangPunjabi, 2028 0x1: SubLangPunjabiIndia, 2029 0x2: SubLangPunjabiIslamicRepublicOfPakistan, 2030 }, 2031 LangQuechua: { 2032 0x1: SubLangQuechuaBolivia, 2033 0x2: SubLangQuechuaEcuador, 2034 0x3: SubLangQuechuaPeru, 2035 }, 2036 LangRomanian: { 2037 0x2: SubLangRomanianMoldova, 2038 0x1: SubLangRomanianRomania, 2039 }, 2040 LangRomansh: { 2041 0x1: SubLangRomanshSwitzerland, 2042 }, 2043 LangRussian: { 2044 0x2: SubLangRussianMoldova, 2045 0x1: SubLangRussianRussia, 2046 }, 2047 LangSakha: { 2048 0x1: SubLangSakhaRussia, 2049 }, 2050 LangSamiInari: { 2051 0x9: SubLangSamiInariFinland, 2052 }, 2053 LangSamiLule: { 2054 0x4: SubLangSamiLuleNorway, 2055 0x5: SubLangSamiLuleSweden, 2056 }, 2057 LangSamiNorthern: { 2058 0x3: SubLangSamiNorthernFinland, 2059 0x1: SubLangSamiNorthernNorway, 2060 0x2: SubLangSamiNorthernSweden, 2061 }, 2062 LangSamiSkolt: { 2063 0x8: SubLangSamiSkoltFinland, 2064 }, 2065 LangSamiSouthern: { 2066 0x6: SubLangSamiSouthernNorway, 2067 0x7: SubLangSamiSouthernSweden, 2068 }, 2069 LangSanskrit: { 2070 0x1: SubLangSanskritIndia, 2071 }, 2072 LangScottishGaelic: { 2073 0x1: SubLangScottishGaelicUnitedKingdom, 2074 0x1b: SubLangSerbianCyrillic, 2075 0x7: SubLangSerbianCyrillicBosniaAndHerzegovina, 2076 0xc: SubLangSerbianCyrillicMontenegro, 2077 0xa: SubLangSerbianCyrillicSerbia, 2078 0x3: SubLangSerbianCyrillicSerbiaAndMontenegroFormer, 2079 0x1c: SubLangSerbianLatin, 2080 }, 2081 LangSerbianLatin: { 2082 0x6: SubLangSerbianLatinBosniaAndHerzegovina, 2083 0xb: SubLangSerbianLatinMontenegro, 2084 0x9: SubLangSerbianLatinSerbia, 2085 0x2: SubLangSerbianLatinSerbiaAndMontenegroFormer, 2086 }, 2087 LangSesothoSaLeboa: { 2088 0x1: SubLangSesothoSaLeboaSouthAfrica, 2089 }, 2090 LangSetswana: { 2091 0x2: SubLangSetswanaBotswana, 2092 0x1: SubLangSetswanaSouthAfrica, 2093 }, 2094 LangSindhi: { 2095 0x1f: SubLangSindhi, 2096 0x2: SubLangSindhiIslamicRepublicOfPakistan, 2097 }, 2098 LangSinhala: { 2099 0x1: SubLangSinhalaSriLanka, 2100 }, 2101 LangSlovak: { 2102 0x1: SubLangSlovakSlovakia, 2103 }, 2104 LangSlovenian: { 2105 0x1: SubLangSlovenianSlovenia, 2106 }, 2107 LangSomali: { 2108 0x1: SubLangSomaliSomalia, 2109 }, 2110 LangSotho: { 2111 0x1: SubLangSothoSouthAfrica, 2112 }, 2113 LangSpanish: { 2114 0xb: SubLangSpanishArgentina, 2115 0x8: SubLangSpanishBolivarianRepublicOfVenezuela, 2116 0x10: SubLangSpanishBolivia, 2117 0xd: SubLangSpanishChile, 2118 0x9: SubLangSpanishColombia, 2119 0x5: SubLangSpanishCostaRica, 2120 0x17: SubLangSpanishCuba, 2121 0x7: SubLangSpanishDominicanRepublic, 2122 0xc: SubLangSpanishEcuador, 2123 0x11: SubLangSpanishElSalvador, 2124 0x4: SubLangSpanishGuatemala, 2125 0x12: SubLangSpanishHonduras, 2126 0x16: SubLangSpanishLatinAmerica, 2127 0x2: SubLangSpanishMexico, 2128 0x13: SubLangSpanishNicaragua, 2129 0x6: SubLangSpanishPanama, 2130 0xf: SubLangSpanishParaguay, 2131 0xa: SubLangSpanishPeru, 2132 0x14: SubLangSpanishPuertoRico, 2133 0x1: SubLangSpanishSpain, 2134 0x3: SubLangSpanishSpain, 2135 0x15: SubLangSpanishUnitedStates, 2136 0xe: SubLangSpanishUruguay, 2137 }, 2138 LangSwedish: { 2139 0x2: SubLangSwedishFinland, 2140 0x1: SubLangSwedishSweden, 2141 }, 2142 LangSyriac: { 2143 0x1: SubLangSyriacSyria, 2144 }, 2145 LangTajikCyrillic: { 2146 0x1f: SubLangTajikCyrillic, 2147 0x1: SubLangTajikCyrillicTajikistan, 2148 }, 2149 LangTamazightLatin: { 2150 0x1f: SubLangTamazightLatin, 2151 0x2: SubLangTamazightLatinAlgeria, 2152 }, 2153 LangTamil: { 2154 0x1: SubLangTamilIndia, 2155 0x2: SubLangTamilSriLanka, 2156 }, 2157 LangTatar: { 2158 0x1: SubLangTatarRussia, 2159 }, 2160 LangTelugu: { 2161 0x1: SubLangTeluguIndia, 2162 }, 2163 LangThai: { 2164 0x1: SubLangThaiThailand, 2165 }, 2166 LangTibetan: { 2167 0x1: SubLangTibetanPeoplesRepublicOfChina, 2168 }, 2169 LangTigrinya: { 2170 0x2: SubLangTigrinyaEritrea, 2171 0x1: SubLangTigrinyaEthiopia, 2172 }, 2173 LangTsonga: { 2174 0x1: SubLangTsongaSouthAfrica, 2175 }, 2176 LangTurkish: { 2177 0x1: SubLangTurkishTurkey, 2178 }, 2179 LangTurkmen: { 2180 0x1: SubLangTurkmenTurkmenistan, 2181 }, 2182 LangUkrainian: { 2183 0x1: SubLangUkrainianUkraine, 2184 }, 2185 LangUpperSorbian: { 2186 0x1: SubLangUpperSorbianGermany, 2187 }, 2188 LangUrdu: { 2189 0x2: SubLangUrduIndia, 2190 0x1: SubLangUrduIslamicRepublicOfPakistan, 2191 }, 2192 LangUyghur: { 2193 0x1: SubLangUyghurPeoplesRepublicOfChina, 2194 0x1e: SubLangUzbekCyrillic, 2195 0x2: SubLangUzbekCyrillicUzbekistan, 2196 }, 2197 LangUzbekLatin: { 2198 0x1f: SubLangUzbekLatin, 2199 0x1: SubLangUzbekLatinUzbekistan, 2200 0x2: SubLangValencianSpain, 2201 }, 2202 LangVenda: { 2203 0x1: SubLangVendaSouthAfrica, 2204 }, 2205 LangVietnamese: { 2206 0x1: SubLangVietnameseVietnam, 2207 }, 2208 LangWelsh: { 2209 0x1: SubLangWelshUnitedKingdom, 2210 }, 2211 LangWolof: { 2212 0x1: SubLangWolofSenegal, 2213 }, 2214 LangXhosa: { 2215 0x1: SubLangXhosaSouthAfrica, 2216 }, 2217 LangYi: { 2218 0x1: SubLangYiPeoplesRepublicOfChina, 2219 }, 2220 LangYoruba: { 2221 0x1: SubLangYorubaNigeria, 2222 }, 2223 LangZulu: { 2224 0x1: SubLangZuluSouthAfrica, 2225 }, 2226 } 2227 2228 if val, ok := m[lang][subLang]; ok { 2229 return val.String() 2230 } 2231 2232 return "?" 2233 }