Интернационализация программы HelloWorld .NET - PullRequest
2 голосов
/ 15 июля 2009

У меня небольшое тестовое приложение, в котором есть 2 файла ресурсов (Resources.resx & Resources.de-DE.resx) с одинаковыми точными именами строк, но в одном из них строки переведены на немецкий язык.

Для своей формы я установил свойство Localize в значение ture.

В моем приложении я получаю строки следующим образом:

this.Text = Properties.Resources.frmCaption;

В моей папке выпуска я получаю папку de-DE с dll с именем International_test.resources.dll.

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

Я пытался сохранить International_test.resources.dll в папке de-DE или просто вставить в мою папку apps.

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

Ответы [ 3 ]

6 голосов
/ 15 июля 2009

По счастливой случайности, я использую проект-прототип 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 голосов
/ 15 июля 2009

спасибо за тонну Си.

Я наконец понял свою проблему.

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

//using embedded resources
ResourceManager rm = new ResourceManager("International_test.Properties.Resources", Assembly.GetExecutingAssembly());
0 голосов
/ 15 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...