Итак, я хочу локализовать свое приложение, но не могу найти никаких новых руководств или документации, обычно это руководства для .NET Framework, написанные примерно в 2015 году, или руководства, использующие RESX, нет ли другого способа локализации? приложение вместо использования RESX и привязки {x:Static}
. Я знаю, что есть RESW, но похоже, что RESW поддерживается только в UWP.
@Джо, так что, по сути, я не могу избежать использования RESX? Я просто думаю, что это своего рода обходной путь.
Есть ли что-нибудь особенно сложное или неправильное в .RESX? Я не знаком с .RESW, поэтому не понимаю проблемы.
Если это поможет, я мог бы рассказать вам, как я это сделал с файлами .RESX. Наше приложение поддерживает несколько языков и форматирует числа/даты в соответствии с культурой/региональным стандартом соответствующего языка без особых усилий. Мы не можем менять языки на лету (необходимо перезапустить приложение), но в остальном оно работает вполне хорошо. Мы просто извлекаем строки из одного и того же файла RESX независимо от текущего языка, и получается правильно переведенная строка.
Раньше я использовал словари ресурсов вместо resx. Объедините английский, а затем, если необходимо, добавьте к нему другой язык. Используйте динамический ресурс для ссылки на все ваши строки. Затем вы можете локализовать и брендировать с помощью того же механизма. Словари ресурсов можно даже объединять из некомпилированных файлов .xaml, что позволяет настраивать их. Вы можете предоставить его третьей стороне, которая добавит свой собственный словарь ресурсов.
@Джо, у меня все в порядке с перезапуском приложения, поэтому мне просто нужно хорошее руководство по его реализации, например, у WinForms был свой собственный метод локализации с использованием RESX, у UWP были RESW и файл .strings, как насколько я помню, но простой WPF и WinUI 3, я не очень знаю, как правильно реализовать локализацию, потому что LocBaml устарел, насколько мне известно (по крайней мере, он не работает на .NET 6 и выше согласно MSDN), а RESX мне кажется устаревшим, поэтому я спрашиваю о новых инструментах: если RESX все еще используется официальным SDK, то я тоже буду его использовать.
Хорошо, я опубликовал ответ, показывающий, что я делаю. Я удваиваю это лучший способ, но он работает хорошо.
Я не могу дать вам подробное руководство, но вот простой способ локализовать строки и форматирование чисел и дат в WPF. Это подход, который я собрал из различных ответов здесь и других поисков в Интернете.
Обратите внимание: как мы обсуждали в этом примере, у пользователя нет возможности менять язык на лету; После изменения языка приложение необходимо перезапустить.
Предположим, ваше приложение представляет собой один модуль с именем MyCompany.MyApp
. Вы помещаете все свои строки в файл RESX с именем MyStrings.resx
. Когда вы создадите его, выходная папка может выглядеть так
\net8.0-windows
MyCompany.MyApp.exe
MyCompany.MyApp.dll
Это отлично работает для английского языка, но вы хотите добавить... французский и японский. Вы хотите, чтобы не только строки были переведены на любой из этих языков, но вы также хотите, чтобы форматирование чисел и дат соответствовало культурным параметрам этого языка по умолчанию.
Сначала создайте два новых файла RESX. MyStrings.fr.resx
и MyStrings.ja.resx
, рядом с основным MyStrings.resx
. Ключевым моментом является использование двухбуквенного языкового кода в названии. Вы можете удалить резервный файл .CS из этих новых файлов; Он нужен только для основного.
Каждый из них будет содержать переводы каждой строки в MyStrings.resx
для этого языка.
Далее придумайте какой-нибудь способ сохранить в настройках идентификатор настроенного языка.
При запуске приложения, прежде чем делать что-либо еще, получите этот сохраненный код языка из своих настроек, а затем получите (из системы) CultureInfo
для этого языка. Используйте его для установки культуры потока. Вы можете использовать ResourceManager.GetResourceSet
, чтобы получить различные культуры. После того, как вы получили CultureInfo
для языка, который будет использоваться, установите таким образом язык и региональные параметры потока.
System.Threading.Thread.CurrentThread.CurrentUICulture = languageCulture;
CultureInfo.DefaultThreadCurrentUICulture = languageCulture;
Вышеупомянутое дает вам автоматический выбор соответствующей строки из соответствующего файла .RESX на основе языковой культуры, которую вы выбрали при запуске. Итак, если ваш код C# ссылается на строковый ресурс в MyStrings.resx
вот так
var str = MyStrings.SomeStringResource
...или если ваш XAML ссылается на него вот так
<TextBlock Text = "{x:Static res:MyStrings.SomeStringResource}"/>
Выбранная строка будет автоматически выбрана из соответствующего файла .RESX. Если текущий язык, который вы настроили, — японский, он будет выбран из MyStrings.ja.resx
. Если это французский язык, он будет выбран из MyStrings.fr.resx
. если это английский язык или это какая-то культура, для которой у вас нет файла .RESX, она будет выбрана из MyStrings.resx
Наконец, чтобы иметь дело с форматированием чисел и дат, вам необходимо установить этот язык в метаданных класса FrameworkElement. Для иллюстрации предположим, что languageCulture
ниже — это CultureInfo
текущего настроенного языка, который вы получили при запуске.
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(languageCulture.Name)));
Опять же, это должно быть заблаговременно, прежде чем появится какой-либо пользовательский интерфейс. Но как только вы это сделаете, каждый вызов IValueConverter.Convert
или IMultiValueConverter.Convert
будет получать CultureInfo, соответствующий настроенному языку, независимо от конфигурации ОС.
Когда вы создадите свой проект, вы увидите новые подкаталоги в результатах сборки. В каждом подкаталоге хранятся библиотеки DLL ресурсов для одного языка. Так
\net8.0-windows
MyCompany.MyApp.exe
MyCompany.MyApp.dll
\fr
MyCompany.MyApp.Resources.dll
\ja
MyCompany.MyApp.Resources.dll
Вы захотите отправить их вместе с установленным проектом.
Каждый раз, когда вам нужно добавить новый язык, все, что вам нужно, это новый файл .RESX, вы получите новый подкаталог.
Я уверен, что есть способы получше, более изощренные. Но это соответствует нашей цели. Наши строки переведены, и форматирование числа/даты выглядит хорошо.
Я не думаю, что локализация сильно изменилась с 2015 года.