Как найти имя cldr от Microsoft CultureInfo в JavaScript?

Я хочу знать, существует ли где-то определенное сопоставление от Microsoft CultureInfo (которое можно посмотреть здесь: MS-LCID (идентификатор кода языка Windows)) к языковому коду Unicode cldr.

В настоящее время я использую jQuery и globalize.js для проверки пользовательского ввода нашего сайта asp.net-core. Наша реализация выглядит аналогично этому примеру validationScript.cshtml (код asp.net-core)

Нам нужно было только изменить раздел скрипта следующим образом:

<script type="text/javascript">
var culture = "@System.Globalization.CultureInfo.CurrentUICulture";

$.when(
  $.get("/lib/newTestLocalization/cldr-core/supplemental/likelySubtags.json"),
  $.get("/lib/newTestLocalization/cldr-numbers-modern/main/" + culture + "/numbers.json"),
  $.get("/lib/newTestLocalization/cldr-core/supplemental/numberingSystems.json"),
  $.get("/lib/newTestLocalization/cldr-core/supplemental/timeData.json"),
  $.get("/lib/newTestLocalization/cldr-core/supplemental/weekData.json")
).then(function() {
    console.log("sucessfully loaded cldr data");
    // Normalize $.get results, we only need the JSON, not the request statuses.
    return [].slice.apply(arguments, [0]).map(function(result) {
      return result[0];
    });
  },
  function() { console.log("Error  loading cldr data!"); }
).then(Globalize.load, function ()
  { console.log("Error  loading cldr data!"); }
).then(function () {
  Globalize.locale(culture);

  console.log("finished Globalize.locale !");
}); 

</script>

Если я переключаю сайт на один из следующих:

  1. CultureInfo ("ж-CHS")
  2. CultureInfo ("ZH-СНТ")
  3. CultureInfo ("де-DE")
  4. CultureInfo ("JA-JP")
  5. CultureInfo ("EN-US")

globalize.js не работает, потому что нет папки cldr для любого из идентификаторов языка выше.

Я посмотрел здесь cldr-numbers-full/main/ (данные JSON для выпуска CLDR 33), но не смог найти ни один из идентификаторов выше.

Итак, мой вопрос: "Есть ли где-то определенное сопоставление MS-LCID с cldr-ID, если это правильный вопрос?

И мой второй вопрос: какой текущий стандарт / передовой опыт использовать?

  1. MS-значений LCID
  2. идентификаторы cldr
  3. Или один из них здесь (языковой тег IETF)
  4. или эти (ISO 639)
  5. или же...

1 ответ

Решение

Наконец-то нашел решение здесь

В конце _ValidationScriptsPartial.cshtml добавьте следующий код.

@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment HostingEnvironment
@{
    string GetDefaultLocale()
    {
        const string localePattern = "lib\\cldr-data\\main\\{0}";
        var currentCulture = System.Globalization.CultureInfo.CurrentCulture;
        var cultureToUse = "en-GB"; //Default regionalisation to use

        if (System.IO.Directory.Exists(System.IO.Path.Combine(HostingEnvironment.WebRootPath, string.Format(localePattern, currentCulture.Name))))
            cultureToUse = currentCulture.Name;
        else if (System.IO.Directory.Exists(System.IO.Path.Combine(HostingEnvironment.WebRootPath, string.Format(localePattern, currentCulture.TwoLetterISOLanguageName))))
            cultureToUse = currentCulture.TwoLetterISOLanguageName;

        return cultureToUse;
    }
}

<script type="text/javascript">
    var culture = "@GetDefaultLocale()";
    $.when(
        $.get("/lib/cldr-data/supplemental/likelySubtags.json"),
        $.get("/lib/cldr-data/main/" + culture + "/numbers.json"),
        $.get("/lib/cldr-data/supplemental/numberingSystems.json"),
        $.get("/lib/cldr-data/main/" + culture + "/ca-gregorian.json"),
        $.get("/lib/cldr-data/main/" + culture +"/timeZoneNames.json"),
        $.get("/lib/cldr-data/supplemental/timeData.json"),
        $.get("/lib/cldr-data/supplemental/weekData.json")
    ).then(function () {
        // Normalize $.get results, we only need the JSON, not the request statuses.
        return [].slice.apply(arguments, [0]).map(function (result) {
            return result[0];
        });
    }).then(Globalize.load).then(function () {
        Globalize.locale(culture);
    });
</script>
Другие вопросы по тегам