Создать собственную культуру в 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.
- Создайте консольное приложение.
- Добавить ссылку на sysglobl (C:\Windows\Microsoft.NET\Framework\v2.0.50727\sysglobl.dll)
- Добавьте код ниже к нему.
- Запустите его на веб-сервере (ах) и на компьютере (ах) разработчика в качестве администратора.
Это создаст культуру, основанную на том, что я нашел, чтобы быть его самым близким соответствием (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();
}