Как использовать локализацию в C#

Я просто не могу заставить локализацию работать.

У меня есть библиотека классов. Теперь я хочу создать resx файлы там и возвращают некоторые значения, основанные на культуре потока.

Как я могу это сделать?

7 ответов


  • добавьте файл ресурсов в свой проект (вы можете назвать его "strings.resx"), выполнив следующие действия:
    щелкните правой кнопкой мыши свойства в проект, выберите Добавить -> Новый Элемент... в контекстном меню, затем в списке Элементы Visual C# выберите "ресурсы" и имя strings.resx.
  • добавьте строку resouce в файл resx и дайте ему хорошее имя (пример: назовите его "Hello" и дайте ему значение "Привет")
  • сохранить файл ресурсов (Примечание: это будет по умолчанию файл ресурсов, так как он не имеет двухбуквенный код языка)
  • добавить ссылки на программы: System.Threading и System.Globalization

запустить этот код:

Console.WriteLine(Properties.strings.Hello);

он должен напечатать "Hello".

теперь добавьте новый файл ресурсов с именем " strings.fr.resx "(обратите внимание на часть" fr"; этот будет содержать ресурсы на французском языке). Добавить string ресурс с тем же именем, что и в строках.resx, но со значением на французском языке (Name="Hello", Value="Salut"). Теперь, если вы запустите следующий код, он должен напечатать Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

происходит то, что система будет искать ресурс для "fr-FR". Он не найдет его (так как мы указали "fr"В вашем файле"). Затем он вернется к проверке "fr", который он находит (и использует).

следующий код будет печатать "Привет":

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

это потому, что он не находит никакого ресурса "en-US", а также никакого ресурса "en", поэтому он вернется к умолчанию, который мы добавили с самого начала.

при необходимости вы можете создавать файлы с более конкретными ресурсами (например, строки.фр-фр.resx и строки.фр-ка.resx для французского языка во Франции и Канаде соответственно). В каждом таком файле вам нужно будет добавить ресурсы для тех строк, которые отличаются от ресурсов, которые он упадет обратно. Поэтому, если текст одинаков во Франции и Канаде, вы можете поместить его в строки.fr.resx, в то время как строки, которые отличаются в канадском французском языке, могут входить в строки.фр-ка.resx.


это довольно просто, на самом деле. Создайте новый файл ресурсов, например Strings.resx. Set Access Modifier to Public. Используйте шаблон файла apprioriate, поэтому Visual Studio автоматически создаст класс доступа (имя будет Strings в данном случае). Это ваш язык по умолчанию.

теперь, когда вы хотите добавить, скажем, немецкую локализацию, добавьте локализованный файл resx. Это будет типично Strings.de.resx в этом случае. Если вы хотите добавить дополнительную локализацию, скажем, для Австрии, вы дополнительно создадите Strings.de-AT.resx.

Теперь перейдите к созданию строки-скажем, строки с именем HelloWorld. В Strings.resx, добавьте эту строку со значением " Hello, world!". В Strings.de.resx, добавить " Привет, Welt!". И в Strings.de-AT.resx, добавить " Servus, Welt!". Пока все.

теперь у вас есть это генерируется Strings класса, и он имеет свойство с геттером HelloWorld. Получение этого свойства загрузит " Servus, Welt!"когда ваш локаль де-АТ", Привет, Welt! когда ваш язык любой другой de locale (включая de-DE и de-CH) и "Привет, Мир!- когда твое место-что-то другое. Если в локализованной версии отсутствует строка, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

можно использовать ResourceManager класс для большего контроля о том, как именно вы загружаете вещи. Созданный Strings класс также использует его.


отличный ответ Ф. во. Но если вы хотите обновить перевод или добавить новые языки после выпуска приложения, вы застряли, потому что вам всегда нужно перекомпилировать его для создания ресурсов.файл DLL.

вот решение для ручной компиляции библиотеки dll ресурсов. Он использует сведения.exe и al.exe tools (устанавливается вместе с sdk).

скажем, у вас есть строки.fr.файл ресурсов resx, вы можете скомпилировать dll ресурсов со следующим партия:

resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources 
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause

Не забудьте сохранить исходное пространство имен в именах файлов (здесь "WpfRibbonApplication1")


кроме того @Fredrik Mörk отличный ответ на строки, чтобы добавить локализация в форму сделать следующее:

  • установить формав собственность "Localizable" до true
  • изменить форму Language свойство языка, который вы хотите (из хорошего раскрывающегося списка с ними всеми)
  • перевести элементы управления в этой форме и перемещать их, если нужно (сквош эти действительно длинные полные французские предложения в!)

этой статья MSDN о локализации Windows Forms дает дополнительную информацию об этом.


исправление и разработки @Fredrik Mörk ответ.

  • добавить Strings.resx файл ресурсов для вашего проекта (или другое имя файла)
  • Set Access Modifier to Public (В открывшемся файл)
  • добавить строку resouce в файл resx: (пример: name Hello, стоимостью Hello)
  • сохранить файл ресурсов

Visual Studio автоматически генерирует соответствующий Strings класс, который на самом деле помещено в Strings.Designer.cs. Класс находится в том же пространстве имен, что и созданный поместить.

этот код всегда выводит Hello, потому что это ресурс по умолчанию и никакие языковые ресурсы не доступны:

Console.WriteLine(Strings.Hello);

теперь добавьте новый языковой ресурс:

  • добавить Strings.fr.resx (по-французски)
  • добавьте строку с тем же именем, что и раньше, но с другим значением: (name Hello, значение Salut)

следующий код выведет Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Strings.Hello);

какой ресурс используется, зависит от Thread.CurrentThread.CurrentUICulture. Он устанавливается в зависимости от параметра языка пользовательского интерфейса Windows или может быть установлен вручную, как в этом примере. Узнайте больше об этом здесь.

вы можете добавить ресурсы конкретной страны, такие как Strings.fr-FR.resx или Strings.fr-CA.resx.

используемая строка определяется в следующем порядке приоритетов:

  • от страновой ресурс, такой как Strings.fr-CA.resx
  • из языкового ресурса, такого как Strings.fr.resx
  • по умолчанию Strings.resx

обратите внимание, что языковые ресурсы создания спутниковые сборки.

также узнаете, как CurrentCulture отличается от CurrentUICulture здесь.


кроме @Eric Bole-Feysot ответ:

благодаря спутниковым сборкам локализация может быть создана на основе .файл DLL./exe файлы. Таким образом:

  • исходный код (VS project) может быть отделен от языкового проекта,
  • добавление нового языка не требует перекомпиляции проекта,
  • перевод может быть сделан даже конечных пользователей.

есть малоизвестный инструмент под названием LSACreator (бесплатно для некоммерческого использования или купить вариант), который позволяет создавать локализацию на основе.файл DLL./файл EXE. Фактически, внутренне (в каталоге языкового проекта) он создает/управляет локализованными версиями файлов resx и компилирует сборку аналогично @Eric Bole-Feysot описал.


в моем случае

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

в AssemblyInfo.cs помешал вещам работать как обычно.