tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

language.js (6708B)


      1 // |reftest| skip-if(!this.hasOwnProperty('Intl'))
      2 
      3 const tests = {
      4  "en": {
      5    long: {
      6      "de": "German",
      7      "de-AT": "German (Austria)",
      8      "de-1996": "German (German orthography of 1996)",
      9      "en": "English",
     10      "en-Hant-GB": "English (Traditional, United Kingdom)",
     11      "en-Hans-US": "English (Simplified, United States)",
     12      "fr": "French",
     13      "nl-BE": "Dutch (Belgium)",
     14      "cr-Cans": "Cree (Unified Canadian Aboriginal Syllabics)",
     15    },
     16    short: {
     17      "en-Hant-GB": "English (Traditional, UK)",
     18      "en-Hans-US": "English (Simplified, US)",
     19      "cr-Cans": "Cree (UCAS)",
     20    },
     21    narrow: {},
     22  },
     23  "de": {
     24    long: {
     25      "de": "Deutsch",
     26      "de-AT": "Deutsch (Österreich)",
     27      "de-1996": "Deutsch (Neue deutsche Rechtschreibung)",
     28      "en": "Englisch",
     29      "en-Hant-GB": "Englisch (Traditionell, Vereinigtes Königreich)",
     30      "en-Hans-US": "Englisch (Vereinfacht, Vereinigte Staaten)",
     31      "fr": "Französisch",
     32      "nl-BE": "Niederländisch (Belgien)",
     33    },
     34    short: {
     35      "en-Hant-GB": "Englisch (Traditionell, UK)",
     36      "en-Hans-US": "Englisch (Vereinfacht, USA)",
     37    },
     38    narrow: {},
     39  },
     40  "fr": {
     41    long: {
     42      "de": "allemand",
     43      "de-AT": "allemand (Autriche)",
     44      "de-1996": "allemand (orthographe allemande de 1996)",
     45      "en": "anglais",
     46      "en-Hant-GB": "anglais (traditionnel, Royaume-Uni)",
     47      "en-Hans-US": "anglais (simplifié, États-Unis)",
     48      "fr": "français",
     49      "nl-BE": "néerlandais (Belgique)",
     50    },
     51    short: {
     52      "en-Hant-GB": "anglais (traditionnel, R.-U.)",
     53      "en-Hans-US": "anglais (simplifié, É.-U.)",
     54    },
     55    narrow: {},
     56  },
     57  "zh": {
     58    long: {
     59      "zh": "中文",
     60      "zh-Hant": "中文(繁体)",
     61      "zh-Hant-CN": "中文(繁体,中国)",
     62      "zh-Hans-HK": "中文(简体,中国香港特别行政区)",
     63    },
     64    short: {
     65      "zh-Hans-HK": "中文(简体,香港)"
     66    },
     67    narrow: {},
     68  },
     69  "ar": {
     70    long: {
     71      "ar": "العربية",
     72      "ar-SA": "العربية (المملكة العربية السعودية)",
     73      "zh-MO": "الصينية (منطقة ماكاو الإدارية الخاصة)",
     74    },
     75    short: {
     76      "zh-MO": "الصينية (مكاو)",
     77    },
     78    narrow: {},
     79  },
     80 };
     81 
     82 for (let [locale, localeTests] of Object.entries(tests)) {
     83  for (let [style, styleTests] of Object.entries(localeTests)) {
     84    let dn = new Intl.DisplayNames(locale, {type: "language", languageDisplay: "standard", style});
     85 
     86    let resolved = dn.resolvedOptions();
     87    assertEq(resolved.locale, locale);
     88    assertEq(resolved.style, style);
     89    assertEq(resolved.type, "language");
     90    assertEq(resolved.languageDisplay, "standard");
     91    assertEq(resolved.fallback, "code");
     92 
     93    let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
     94    for (let [language, expected] of Object.entries({...inheritedTests, ...styleTests})) {
     95      assertEq(dn.of(language), expected);
     96 
     97      // Also works with objects.
     98      assertEq(dn.of(Object(language)), expected);
     99    }
    100  }
    101 }
    102 
    103 {
    104  let dn = new Intl.DisplayNames("en", {type: "language"});
    105 
    106  // Performs ToString on the input and then validates the stringified result.
    107  assertThrowsInstanceOf(() => dn.of(), RangeError);
    108  assertThrowsInstanceOf(() => dn.of(null), RangeError);
    109  assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
    110  assertThrowsInstanceOf(() => dn.of(0), RangeError);
    111 
    112  // Throws an error if |code| can't be parsed as a `unicode_language_id` production.
    113  assertThrowsInstanceOf(() => dn.of("en-"), RangeError);
    114  assertThrowsInstanceOf(() => dn.of("en-u-ca-gregory"), RangeError);
    115  assertThrowsInstanceOf(() => dn.of("en-x-private"), RangeError);
    116 }
    117 
    118 // Test fallback behaviour.
    119 {
    120  let dn1 = new Intl.DisplayNames("en", {type: "language"});
    121  let dn2 = new Intl.DisplayNames("en", {type: "language", fallback: "code"});
    122  let dn3 = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
    123 
    124  assertEq(dn1.resolvedOptions().fallback, "code");
    125  assertEq(dn2.resolvedOptions().fallback, "code");
    126  assertEq(dn3.resolvedOptions().fallback, "none");
    127 
    128  // "aaa" is not a registered language code.
    129  assertEq(dn1.of("aaa"), "aaa");
    130  assertEq(dn2.of("aaa"), "aaa");
    131  assertEq(dn3.of("aaa"), undefined);
    132 
    133  // "aaa" is not a registered language code.
    134  assertEq(dn1.of("aaa-Latn"), "aaa-Latn");
    135  assertEq(dn2.of("aaa-Latn"), "aaa-Latn");
    136  assertEq(dn3.of("aaa-Latn"), undefined);
    137 
    138  // "Aaaa" is not a registered script code.
    139  assertEq(dn1.of("en-Aaaa"), "en-Aaaa");
    140  assertEq(dn2.of("en-Aaaa"), "en-Aaaa");
    141  assertEq(dn3.of("en-Aaaa"), undefined);
    142 
    143  // "AA" is not a registered region code.
    144  assertEq(dn1.of("en-AA"), "en-AA");
    145  assertEq(dn2.of("en-AA"), "en-AA");
    146  assertEq(dn3.of("en-AA"), undefined);
    147 
    148  // "XZ" doesn't have any localised names.
    149  assertEq(dn1.of("en-XZ"), "en-XZ");
    150  assertEq(dn2.of("en-XZ"), "en-XZ");
    151  assertEq(dn3.of("en-XZ"), undefined);
    152 
    153  // "998" is canonicalised to "XZ".
    154  assertEq(dn1.of("en-998"), "en-XZ");
    155  assertEq(dn2.of("en-998"), "en-XZ");
    156  assertEq(dn3.of("en-998"), undefined);
    157 
    158  // The returned fallback is in canonical case.
    159  assertEq(dn1.of("AAA"), "aaa");
    160  assertEq(dn2.of("AAA"), "aaa");
    161  assertEq(dn3.of("AAA"), undefined);
    162 
    163  assertEq(dn1.of("En-aaaa"), "en-Aaaa");
    164  assertEq(dn2.of("En-aaaa"), "en-Aaaa");
    165  assertEq(dn3.of("En-aaaa"), undefined);
    166 
    167  assertEq(dn1.of("EN-aa"), "en-AA");
    168  assertEq(dn2.of("EN-aa"), "en-AA");
    169  assertEq(dn3.of("EN-aa"), undefined);
    170 }
    171 
    172 // Ensure language tag canonicalisation is performed.
    173 {
    174  let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
    175 
    176  assertEq(dn.of("ru-RU"), "Russian (Russia)");
    177 
    178  // ICU's canonicalisation supports "SU" -> "RU".
    179  assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
    180  assertEq(dn.of("ru-SU"), "Russian (Russia)");
    181 
    182  // ICU's canonicalisation doesn't support "172" -> "RU".
    183  assertEq(Intl.getCanonicalLocales("ru-172")[0], "ru-RU");
    184  assertEq(dn.of("ru-172"), "Russian (Russia)");
    185 }
    186 
    187 // Test when case isn't canonical.
    188 {
    189  let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
    190 
    191  assertEq(dn.of("IT-LATN-IT"), "Italian (Latin, Italy)");
    192  assertEq(dn.of("it-latn-it"), "Italian (Latin, Italy)");
    193 }
    194 
    195 // resolvedOptions() only outputs "languageDisplay" when the type is "language".
    196 {
    197  let dn1 = new Intl.DisplayNames("en", {type: "language"});
    198  let dn2 = new Intl.DisplayNames("en", {type: "script"});
    199 
    200  assertEq(dn1.resolvedOptions().languageDisplay, "dialect");
    201  assertEq(dn2.resolvedOptions().hasOwnProperty("languageDisplay"), false);
    202 }
    203 
    204 if (typeof reportCompare === "function")
    205  reportCompare(true, true);