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


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

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

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

7 240

7 ответов:

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

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

Console.WriteLine(Properties.strings.Hello);

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

теперь добавьте новый файл ресурсов с именем "strings.fr.resx" (обратите внимание на часть "fr"; этот будет содержать ресурсы на французском языке). Добавить строковый ресурс с тем же именем, что и в строках.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", поэтому он вернется к умолчанию, который мы добавили с самого начала.

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

это довольно просто, на самом деле. Создайте новый файл ресурсов, например Strings.resx. Набор 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).

скажем, у вас есть файл ресурсов Strings.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 отличный ответ на строки, чтобы добавить локализация в форму сделать следующее:

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

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

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

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

Visual Studio автоматически создает соответствующий Strings класс, который на самом деле помещается в Strings.Designer.cs. Класс находится в том же пространстве имен, что и недавно созданный .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.КС предотвратить, чем работать как обычно.