Не могу найти новых руководств и документации по локализации WPF

Итак, я хочу локализовать свое приложение, но не могу найти никаких новых руководств или документации, обычно это руководства для .NET Framework, написанные примерно в 2015 году, или руководства, использующие RESX, нет ли другого способа локализации? приложение вместо использования RESX и привязки {x:Static}. Я знаю, что есть RESW, но похоже, что RESW поддерживается только в UWP.

Я не думаю, что локализация сильно изменилась с 2015 года.

Joe 01.03.2024 08:16

@Джо, так что, по сути, я не могу избежать использования RESX? Я просто думаю, что это своего рода обходной путь.

craftersmine 01.03.2024 08:39

Есть ли что-нибудь особенно сложное или неправильное в .RESX? Я не знаком с .RESW, поэтому не понимаю проблемы.

Joe 01.03.2024 08:52

Если это поможет, я мог бы рассказать вам, как я это сделал с файлами .RESX. Наше приложение поддерживает несколько языков и форматирует числа/даты в соответствии с культурой/региональным стандартом соответствующего языка без особых усилий. Мы не можем менять языки на лету (необходимо перезапустить приложение), но в остальном оно работает вполне хорошо. Мы просто извлекаем строки из одного и того же файла RESX независимо от текущего языка, и получается правильно переведенная строка.

Joe 01.03.2024 16:46

Раньше я использовал словари ресурсов вместо resx. Объедините английский, а затем, если необходимо, добавьте к нему другой язык. Используйте динамический ресурс для ссылки на все ваши строки. Затем вы можете локализовать и брендировать с помощью того же механизма. Словари ресурсов можно даже объединять из некомпилированных файлов .xaml, что позволяет настраивать их. Вы можете предоставить его третьей стороне, которая добавит свой собственный словарь ресурсов.

Andy 01.03.2024 17:58

@Джо, у меня все в порядке с перезапуском приложения, поэтому мне просто нужно хорошее руководство по его реализации, например, у WinForms был свой собственный метод локализации с использованием RESX, у UWP были RESW и файл .strings, как насколько я помню, но простой WPF и WinUI 3, я не очень знаю, как правильно реализовать локализацию, потому что LocBaml устарел, насколько мне известно (по крайней мере, он не работает на .NET 6 и выше согласно MSDN), а RESX мне кажется устаревшим, поэтому я спрашиваю о новых инструментах: если RESX все еще используется официальным SDK, то я тоже буду его использовать.

craftersmine 02.03.2024 13:46

Хорошо, я опубликовал ответ, показывающий, что я делаю. Я удваиваю это лучший способ, но он работает хорошо.

Joe 03.03.2024 05:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу дать вам подробное руководство, но вот простой способ локализовать строки и форматирование чисел и дат в 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, вы получите новый подкаталог.

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

Другие вопросы по теме