ResourceManager не выбирает правильный набор ресурсов при использовании пользовательской культуры - PullRequest
9 голосов
/ 19 сентября 2010

Я создал локализованный веб-сайт MVC, используя код, найденный в этом блоге Алексом Адамяном .

Это прекрасно работает, если я использую существующую культуру. Тем не менее, я пытаюсь локализовать для тагальского (tl или tl-PH). В Windows нет встроенной культуры, поэтому я создал ее (я пробовал tl и tl-PH) в соответствии с кодом ниже:

public static void CreateCustomCultures()

{

    var cultureBuilder = new CultureAndRegionInfoBuilder(
                            "tl", CultureAndRegionModifiers.Neutral);

    cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US"));
    cultureBuilder.IsMetric = true;
    cultureBuilder.CultureEnglishName = "Tagalog";
    cultureBuilder.CultureNativeName = "Tagalog";
    cultureBuilder.RegionEnglishName = "Tagalog";
    cultureBuilder.RegionNativeName = "Tagalog";
    cultureBuilder.TwoLetterISOLanguageName = "tl";
    cultureBuilder.ThreeLetterISORegionName = "PH";
    cultureBuilder.Register();

    var cultureBuilder2 = new CultureAndRegionInfoBuilder(
                            "tl-PH", CultureAndRegionModifiers.None);

    cultureBuilder2.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder2.LoadDataFromRegionInfo(new RegionInfo("US"));
    cultureBuilder2.IsMetric = true;
    cultureBuilder2.CultureEnglishName = "Tagalog";
    cultureBuilder2.CultureNativeName = "Tagalog";
    cultureBuilder2.RegionEnglishName = "Tagalog";
    cultureBuilder2.RegionNativeName = "Tagalog";
    cultureBuilder2.TwoLetterISOLanguageName = "tl";
    cultureBuilder2.ThreeLetterISORegionName = "PH";
    cultureBuilder2.Register();

}

У меня также есть четыре файла ресурсов на моем тестовом сайте, расположенном в ~ / Views / Home / Resources:

  • Home.aspx.resx;
  • Home.aspx.tl.resx
  • Home.aspx.tl-PH.resx
  • Home.aspx.de.resx

При сборке я получаю три каталога с соответствующим именем в каталоге bin, каждый с соответствующим именем dll.

Поэтому, когда я захожу на домашнюю страницу своего веб-сайта http://localhost:1907, я получаю строки по умолчанию (на английском языке).

Когда я захожу на немецкую (де) домашнюю страницу http://localhost:1907/de, я получаю немецкую версию сайта.

Когда я перехожу к тагальской версии http://localhost:1907/tl или http://localhost:1907/tl-PH,, я получаю английскую версию вместо тагальской версии.

Я поместил точки останова в код выборки ресурсов и подтвердил, что культура текущего потока и культура интерфейса пользователя правильно установлены на культуру Tagalog, и что Tagalog - это культура, передаваемая в resourceManager.GetString (key, culture).

Есть мысли? Разве я не создал свои культуры правильно?

1 Ответ

1 голос
/ 20 декабря 2010

Я думаю, что ваши культуры никогда не регистрируются, по крайней мере, одна из них нет.

Приведенный ниже код вызовет исключение, поскольку вы не можете указать региональные значения для нейтральной культуры.Точно так же, как вы не можете создать объект DateTimeFormatInfo для нейтральной культуры.

var cultureBuilder = new CultureAndRegionInfoBuilder(
                        "tl", CultureAndRegionModifiers.Neutral);

cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US"));
cultureBuilder.IsMetric = true;
cultureBuilder.CultureEnglishName = "Tagalog";
cultureBuilder.CultureNativeName = "Tagalog";
cultureBuilder.RegionEnglishName = "Tagalog";
cultureBuilder.RegionNativeName = "Tagalog";
cultureBuilder.TwoLetterISOLanguageName = "tl";
cultureBuilder.ThreeLetterISORegionName = "PH";
cultureBuilder.Register();

Это должно быть что-то вроде этого

var cultureBuilder = new CultureAndRegionInfoBuilder(
                        "tl", CultureAndRegionModifiers.Neutral);

cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
cultureBuilder.CultureEnglishName = "Tagalog";
cultureBuilder.CultureNativeName = "Tagalog";
cultureBuilder.TwoLetterISOLanguageName = "tl";
cultureBuilder.Register();

Вторая специфическая культура выглядит хорошо.

...