2015-04-15 6 views
0

Я написал небольшое приложение, которое автоматически запускается на английском или немецком языке. Английский язык по умолчанию, и немецкий язык будет использоваться на немецкой Windows.Локализация не работает должным образом

Проблема:

Немецкие строки не загружаются на немецкой Windows, хотя программа распознает клиента, как немецкий. Явная настройка текущей культуры (в коде) на немецкий язык приведет к созданию немецкого пользовательского интерфейса.

Что я сделал:

Я после этого руководства: http://www.codeproject.com/Articles/299436/WPF-Localization-for-Dummies

  • я создал копию Resources.resx в разделе Свойства
  • Сейчас есть: Resources.resx, Resources.en -US.resx, Resources.de-DE.resx
  • Я поместил все строки в три файла ресурсов. Resources.resx и * .en-US.resx содержат точно такие же строки
  • Название строк согласовано, модификатор доступа для всех файлов, установленных в общедоступные
  • Свойства файла ресурсов: Build Action: Embedded Resource; Не копировать; Пользовательские Инструмент: PublicResXFileCodeGenerator

Код:

private void InitLocalization() // Executed on startup 
    { 

    if (CultureInfo.CurrentCulture.Name != "de-DE") // only use german on german systems. Otherwise use english 
    { 
     CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US"); 
    } 
    else 
    { 
     CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE"); 
    } 

    rm = new ResourceManager("SaveEye.Properties.Resources", Assembly.GetExecutingAssembly()); 

    // Manually assign the correct text to XAML-elements 
    _SettingsTextBlock.Text = rm.GetString("Settings"); 
    _StartWithWindowsCheckBox.Content = rm.GetString("Startup"); 
    _SaveButton.Content = rm.GetString("SaveAndClose"); 
    } 

В принципе, я просто хочу, чтобы убедиться, что либо Resources.en-US.resx или Resources.de-DE.resx загружается из ResourceManager ,

В остальной части кода я беру строки, которые мне нужны, с rm.GetString ("").

Это прекрасно работает с английским. Я могу даже вручную установить CurrentCulture на de-DE в начале метода InitLocalization, а затем загружаются все немецкие строки. Но, как я уже сказал, на других системах, де-DE по умолчанию, немецкие строки не загружаются.

Что я делаю неправильно?

С уважением

+0

Вы используете метод InitLocalization в своем приложении appStart или основном методе.? – JSJ

+0

CurrentUICulture можно изменить в панели управления Windows. Таким образом, это может быть «en-us», даже если у вас установлена ​​немецкая Windows. Может быть так? –

ответ

3

Это CurrentUICulture, что будет влиять на какие ресурсы загружены, и CurrentCulture, которые будут влиять на дату и номер форматирования. Многие из них сбиты с толку.

Возможно, вы должны тестировать CurrentUICulture, если вы пытаетесь либо установить, либо определить, какие строки нужны для извлечения. Существует большая разница между машиной, работающей с немецкими форматами даты и числа (CurrentCulture), и машиной, работающей с полным пакетом немецкого языка, установленным и активированным (CurrentUICulture).

Ваш пример кода с использованием CultureInfo.DefaultThread (UI) CurrentCulture который будет контролировать поведение всех новых потоков, созданных, но это будет по умолчанию к тому, что основной поток используется в любом случае, так что если она уже была на немецком языке, вы не должны 't нужно явно установить его как таковое.

Вы можете протестировать поведение загрузки ресурсов, обновив метод InitLocalization() и настроив Thread.CurrentThread.CurrentUICulture явно на «de-DE», чтобы узнать, начнут ли загружаться немецкие ресурсы.Затем убедитесь, что CurrentUICulture действительно настроен на «de-DE», а не только на CurrentCulture. Возможно, немецкая машина имеет немецкий формат даты/номера (CurrentCulture), но не использует немецкий языковой пакет (CurrentUICulture).

EDIT: В ответ на ваш комментарий, если вы уже используете CurrentUICulture правильно, и у машины действительно есть полный немецкий интерфейс, но немецкие ресурсы все еще не появляются, вы должны проверить, что немецкий файл спутниковых ресурсов на самом деле развертывается.

Германские ресурсы содержатся в отдельной сборке с именем de-DE \ MyApp.resources.dll и должны находиться в той же папке, что и исполняемый файл, и находиться в папке de-DE (так что у вас есть \ Folder \ MyApp. exe и \ Folder \ de-DE \ MyApp.resources.dll). Ресурсы по умолчанию (те, что находятся в Resource.resx, остаются в основном исполняемом файле и являются ресурсами, которые ResourceManager возвращается, если не найден более подходящий ресурс).

Вы не указали, как вы развертывали приложение, но если вы запустите, вы можете использовать функцию «Открыть в проводнике» (или Dateipfad Öffnen на немецкой машине) диспетчера задач, чтобы отправить вас в развернутую папку поэтому вы можете проверить, есть ли папка de-DE (я упоминаю об этом так, потому что если вы нажмете ClickOnce для развертывания приложения, сложно найти папку установки).

Если вы используете ClickOnce и публикуете в Visual Studio, вы можете управлять файлами, включенными во время публикации, щелкнув правой кнопкой мыши проект и выбрав свойства, а затем перейдите на вкладку «Публикация». Кнопка «Файлы приложений» покажет вам список всех файлов, включенных при публикации. Ваш файл спутникового ресурса de-DE должен быть установлен в «Включить».

+0

Я нашел проблему. Когда я вручную устанавливаю CurrentUICulture в указанном выше методе, я получаю немецкие строки, но только в отладчике. Когда я публикую и начинаю опубликованную версию, я также получаю английские строки. – zuckerthoben

+0

установите CurrentUICulture на немецкий язык по вышеуказанному методу * // Это означает, что в опубликованной версии отсутствуют немецкие строки. Каковы результаты этого поведения? @ScheuNZ – zuckerthoben

+0

@zuckerthoben, я обновил свой ответ с одной потенциальной причиной. – ScheuNZ

Смежные вопросы