Создать собственную культуру в ASP.NET

Я хочу создать файл ресурсов для сингапурского английского языка (en-sg) с именем "shopping.en-sg.resx" в папке App_GlobalResources.

Я получаю ошибку во время компиляции.

Ошибка 1 Пространство имен "Ресурсы" уже содержит определение для "покупки" c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ Временные файлы ASP.NET \web\2cd6afe9\737b0a13\App_GlobalResources.vomuzavz.1.cs 26

После поиска в Google я обнаружил, что "en-sg" не является культурой по умолчанию, и мне нужно создать собственную культуру для него. Я не знаю подробных шагов этого.

Что я должен сделать, чтобы создать культуру и убрать ошибку компиляции?

Я следую примеру в MSDN, создаю файл "shopping.x-en-US-sample.resx" и помещаю следующий код в функцию BasePage (protected override void InitializeCulture()):

CultureAndRegionInfoBuilder cib = null;

cib = new CultureAndRegionInfoBuilder(
  "x-en-US-sample", CultureAndRegionModifiers.None);

CultureInfo ci = new CultureInfo("en-US");
cib.LoadDataFromCultureInfo(ci);
RegionInfo ri = new RegionInfo("US");
cib.LoadDataFromRegionInfo(ri);

cib.Register();

ci = new CultureInfo("x-en-US-sample");

Тем не менее, ошибка компиляции все еще существует.

ОБНОВЛЕНО:

Вы можете легко воспроизвести проблему, создав пустой веб-сайт и два файла "shopping.en-sg.resx" и "shopping.resx" в папке app_globalresources.

3 ответа

Решение

Вы можете создать новую культуру на основе существующей культуры:

string culture = "en-sg";
string name = "Singaporean English";

CultureInfo cultureInfo = new CultureInfo("en-GB");
RegionInfo regionInfo = new RegionInfo(cultureInfo.Name);

CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder(culture, CultureAndRegionModifiers.None);

cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo);
cultureAndRegionInfoBuilder.LoadDataFromRegionInfo(regionInfo);

// Custom Changes
cultureAndRegionInfoBuilder.CultureEnglishName = name;
cultureAndRegionInfoBuilder.CultureNativeName = name;

cultureAndRegionInfoBuilder.Register();

Добавлено: Только что проверил ссылки: У меня есть:

using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;

Добавлено (обновлено, на основе комментариев):

Что касается сообщения об ошибке:

Ошибка, которую вы видите, является результатом конфликта именования ресурсов. Проверьте имена ресурсов, они скомпилированы в dll, и вам нужно убедиться, что имена пространств имен не конфликтуют. Вы можете проверить это, используя отражатель: http://www.red-gate.com/products/reflector/

Вот шаги и код, необходимые для создания культуры en-sg.

  1. Создайте консольное приложение.
  2. Добавить ссылку на sysglobl (C:\Windows\Microsoft.NET\Framework\v2.0.50727\sysglobl.dll)
  3. Добавьте код ниже к нему.
  4. Запустите его на веб-сервере (ах) и на компьютере (ах) разработчика в качестве администратора.

Это создаст культуру, основанную на том, что я нашел, чтобы быть его самым близким соответствием (en-au). Затем я переопределил имена и т.д., чтобы сделать его уникальным.

Вы должны запустить это только один раз. Он удаляет все существующие перед созданием, на тот случай, если вы захотите внести какие-либо изменения после его запуска.

public static void Main()
    {
        CultureAndRegionInfoBuilder cib = null;

        try
        {
            Console.Clear();
            Console.WriteLine("Unregister the \"en-SG\" " + "custom culture if it already exists...");
            CultureAndRegionInfoBuilder.Unregister("en-SG");
            Console.WriteLine("The custom culture was unregistered successfully.");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error while unregistering...");
            Console.WriteLine(e);
        }

        try
        {
            cib = new CultureAndRegionInfoBuilder("en-SG", CultureAndRegionModifiers.None);

            // Populate the new CultureAndRegionInfoBuilder object with culture information.
            CultureInfo ci = new CultureInfo("en-AU");
            cib.LoadDataFromCultureInfo(ci);

            // Populate the new CultureAndRegionInfoBuilder object with region information.
            RegionInfo ri = new RegionInfo("SG");
            cib.LoadDataFromRegionInfo(ri);

            cib.CultureEnglishName = "English (Singapore)";
            cib.CultureNativeName = "English (Singapore)";
            cib.IsMetric = true;

            // Display some of the properties of the CultureAndRegionInfoBuilder object.
            Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName);
            Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName);
            Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName);
            Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId);
            Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric);
            Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol);
            Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName);
            Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName);
            Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName);
            Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName);
            Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName);
            Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName);
            Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName);
            Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName);
            Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName);
            Console.WriteLine();

            // Register the custom culture.
            Console.WriteLine("Register the custom culture...");
            cib.Register();

            // Display some of the properties of the custom culture.
            ci = new CultureInfo("en-SG");

            Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name);
            Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName);
            Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName);
            Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName);
            Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName);
            Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName);

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        Console.ReadKey();
    }
Другие вопросы по тегам