У меня есть небольшое тестовое приложение, в котором есть 2 файла ресурсов (Resources.resx
и Resources.de-DE.resx
) с теми же точными именами строк, но у каждого есть строки, преобразованные в немецкий.
Для моей формы я устанавливаю свойство Localize.
В моем приложении я получаю строки как таковые:
this.Text = Properties.Resources.frmCaption;
В моей папке выпуска я получаю папку de-DE
с dll с именем International_test.resources.dll
.
Я пытаюсь распространить это на машину, установленную на немецкий язык, и все выталкиваемые строки по-прежнему остаются английскими.
Я попытался сохранить International_test.resources.dll
в папке de-DE
или просто вставить в мой каталог apps
.
Что я делаю неправильно или что мне нужно сделать, чтобы использовать немецкий файл ресурсов?
Как повезло, я использую проект прототипа hello world, чтобы протестировать целую кучу вещей в нашем конвейере сборки.
Предполагая, что вы правильно настроили файлы ресурсов, вот пример кода, который может помочь. Кодовая документация удалена для краткости.
public class HelloWorld
{
public CultureInfo CultureInfo { get; private set; }
public HelloWorld()
{
CultureInfo = CultureInfo.CurrentCulture;
}
public HelloWorld(string culture)
{
CultureInfo = CultureInfo.GetCultureInfo(culture);
}
public string SayHelloWorld()
{
return Resources.ResourceManager.GetString("HelloWorld", CultureInfo);
}
}
[TestFixture]
public class HelloWorldFixture
{
HelloWorld helloWorld;
[Test]
public void Ctor_SetsCultureInfo_ToCurrentCultureForParameterlessCtor()
{
helloWorld = new HelloWorld();
Assert.AreEqual(helloWorld.CultureInfo, CultureInfo.CurrentCulture,
"Expected CultureInfo to be set as CurrentCulture");
}
[Test]
public void Ctor_SetsCultureInfo_ToAustralianCulture()
{
helloWorld = new HelloWorld("en-AU");
Assert.AreEqual(helloWorld.CultureInfo.Name, "en-AU",
"Expected CultureInfo to be set to Australian culture");
}
[Test]
[ExpectedException(typeof(ArgumentException))]
public void Ctor_ThrowsException_InvalidCultureName()
{
helloWorld = new HelloWorld("Bogus");
}
[Test]
public void SayHelloWorld_ReturnsFallbackResource_OnUndefinedResource()
{
helloWorld = new HelloWorld("en-JM");
string result = helloWorld.SayHelloWorld();
Assert.AreEqual("Hello, World.", result, "Expected fallback resource string to be used");
}
[Test]
public void SayHelloWorld_ReturnsAustralianResource_OnAustralianResource()
{
helloWorld = new HelloWorld("en-AU");
string result = helloWorld.SayHelloWorld();
Assert.AreEqual("G'Day, World.", result, "Expected australian resource string to be used");
}
}
Этот проект имеет файл Resources.resx с элементом строкового ключа HelloWorld и значением "Hello, World" вместе с соответствующими Resources.en-AU.resx с элементом строкового ключа HelloWorld и значением "G'Day, World", а также другими таких как zh-CH (我 隻 氣墊船 裝滿 晒 鱔.) для проверки отображения неанглийских символов, поскольку он отображается в связанном с ним веб-проекте hello world.
Наконец, добавьте несколько журналов, чтобы показать используемую культуру (я взял ее из этого примера для краткости), а также проверьте выход вашего компилятора, чтобы убедиться, что AL.exe вызывается для связывания ваших сборок ресурсов (звучит так, как будто хотя).
благодаря тонне Si.
Наконец-то выяснилось, что моя проблема понятна.
Мои файлы ресурсов находятся в папке "Свойства", поэтому мне нужно поставить следующие
//using embedded resources
ResourceManager rm = new ResourceManager("International_test.Properties.Resources", Assembly.GetExecutingAssembly());
Я думаю, что моя проблема в том, что я использую американскую версию XP с ее языком, установленным на нем, а также другими настройками культуры. CurrentCulture и CurrentUICulture по-прежнему по-прежнему остаются "en-US"
Я думаю, что лучший способ проверить, это вручную установить культуры в начале программы, например:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture( "de-DE" ); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture( "de-DE" );