Как использовать локализацию в C#
Я просто не могу заставить локализацию работать.
У меня есть библиотека классов. Теперь я хочу создать resx файлы там, и возвращают некоторые значения, основанные на культуре потока.
Как я могу это сделать?
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
toPublic
. Используйте шаблон файла 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 описал.