Локализация с WPF очень хлопотна из-за плохой документации. Я потратил часы на некоторые идеи.
Файл MainWindow.xaml всегда встроен в спутниковую сборку en-US. Если для UltimateResourceFallbackLocation задано значение MainAssembly, он никогда не найдет BAML окна, и я получаю исключение в вызове InitializeComponent (). Поэтому я вынужден установить UltimateResourceFallbackLocation в «Спутник».
Это связано с тем, что ваш файл project.vcproj, вероятно, содержит <UICulture>en-US</UICulture>
. Это, по сути, говорит VS генерировать стеллитовые сборки (вы видите, что папка en-US создается с соответствующим спутником в ней).
UltimateResourceFallbackLocation.MainAssembly
теперь говорит .net ускорить поиск информации о локализации, используя встроенную вместо соответствующей в каталоге. Если ваша системная культура - en-US, это прекрасно объяснит это поведение.
цитирование Ким Гамильтон :
... тогда ResourceManager ищет ресурсы «en-US» непосредственно в основной сборке, вместо поиска сначала в папке «en-US». Поскольку ресурсные зонды могут быть дорогими, этот атрибут может помочь улучшить производительность.
Поскольку вы нашли решение для своей второй точки, осталось только одно:
Если я полностью удаляю UICulture и NeutralResourcesLanguage - что заставляет данные XAML и RESX оба встраиваться в MainAssembly, то мои специфичные для культуры строки не работают.
На самом деле WPF все еще выполняет локализацию: если у вас нет записи типа <UICulture>en-US</UICulture>
в файле .vcproj, wpf все еще пытается найти спутник в каталоге, имя которого соответствует System.Threading.Thread.CurrentThread.CurrentUICulture
. Если оно найдено, оно используется. За исключением, конечно, если ваш нейтральный язык установлен на язык вашей системы, и вы используете стратегию восстановления основной сборки. Чтобы проверить локализацию в вашей системе en-US, вы должны выбрать другую культуру, например, ja-JP как нейтральный язык. Затем предоставьте папку en-US с соответствующим спутником.
Итак, что я использую для локализации и рекомендую:
- не имеют
<UICulture>en-US</UICulture>
в файле .vcproj
- использовать
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
- предоставить все каталоги целевой культуры с соответствующими спутниками.