Интернационализация программы HelloWorld .NET

2

У меня есть небольшое тестовое приложение, в котором есть 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.

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

Теги:
winforms
internationalization

3 ответа

6

Как повезло, я использую проект прототипа 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 вызывается для связывания ваших сборок ресурсов (звучит так, как будто хотя).

0

благодаря тонне Si.

Наконец-то выяснилось, что моя проблема понятна.

Мои файлы ресурсов находятся в папке "Свойства", поэтому мне нужно поставить следующие

//using embedded resources
ResourceManager rm = new ResourceManager("International_test.Properties.Resources", Assembly.GetExecutingAssembly());
0

Я думаю, что моя проблема в том, что я использую американскую версию XP с ее языком, установленным на нем, а также другими настройками культуры. CurrentCulture и CurrentUICulture по-прежнему по-прежнему остаются "en-US"

Я думаю, что лучший способ проверить, это вручную установить культуры в начале программы, например:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture( "de-DE" ); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture( "de-DE" );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню