2012-05-30 3 views
0

Я пытаюсь использовать спутниковые сборки для локализации в приложении WinForms. Структура каталогов выглядит следующим образом:Локализация со спутниковыми сборками

  • бин
    • Program.exe
    • де
      • Program.resources.dll

В программе. exe, этот код выполняется в Main метод:

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de"); 

Application.Run(new Form()); 

Я проверил выход FUSLOGVW.exe:

 
*** Assembly Binder Log Entry (5/30/2012 @ 5:19:37 PM) *** 

The operation failed. 
Bind result: hr = 0x80070002. The system cannot find the file specified. 

Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
Running under executable D:\tmp\bin\Program.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = paulius_l 
LOG: DisplayName = Program.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=... 
(Fully-specified) 
LOG: Appbase = file:///D:/tmp/bin/ 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = NULL 
LOG: AppName = Program.exe 
Calling assembly : Program, Version=1.0.0.0, Culture=neutral, PublicKeyToken=.... 
=== 
LOG: Start binding of native image Program.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=.... 
WRN: No matching native image found. 
LOG: IL assembly loaded from D:\tmp\bin\de\Program.resources.dll. 

Это выглядит хорошо, однако строки просто не локализованы - по умолчанию строки из program.exe все еще используются.

Чтобы получить строки, я использую класс Visual Studio Res из Res.resx.

Что мне здесь не хватает?

Редактировать: добавлен полный вывод FUSLOGVW, для тех, кто его понимает лучше, чем я.

+0

Вы пытались настроить UICulture в Form-Constructor? – Jobo

+0

Да, у меня есть, перед вызовом InitializeComponent(). Эффект тот же. То есть никакого эффекта. –

+0

Вы проверили (возможно, с рефлектором), что в вашей спутниковой сборке есть разные струнные ресурсы? – MerickOWA

ответ

0

Это была моя огромная ошибка, когда я написал сценарий автоматической сборки, который создавал бы спутниковые сборки извне. Проблема заключалась в том, что при создании классов в спутниковых сборках я пропустил класс Res. Неудивительно, что это не сработало.

После долгих часов работы я нашел проблему сегодня утром.

-1

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

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de"); 

идентификаторы культуры для CultureInfo принимают форму «LanguageCode-COUNTRYCODE». Например. «en-US» для американского английского и «en-GB» для английского/британского английского.

Попробуйте "de-DE".

Для получения списка идентификаторов культуры доступно еще http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.name%28v=vs.95%29.aspx и http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx.

+0

«de» является допустимым идентификатором. «de-DE» будет более конкретным для немецкого языка Германии. Тем не менее, я пробовал их обоих - никто не работает. На самом деле, если у меня есть оба параметра: «de» и «de-DE» одновременно, загружаются только ресурсы «de», поскольку, насколько я понимаю, это более общий идентификатор культуры. –

+0

На веб-сайте со списком идентификаторов культуры «de» также отображается как действительный идентификатор. –

+1

Даже пример на MSDN дает возможность «en» как возможность в своем примере приложения. Код страны является необязательным. – MerickOWA

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