Я просто не можу зробити локалізацію для роботи.
У мене є бібліотека класів. Тепер я хочу створити resx файли та повернути деякі значення на основі культури потоків.
Як я можу це зробити?
Я просто не можу зробити локалізацію для роботи.
У мене є бібліотека класів. Тепер я хочу створити resx файли та повернути деякі значення на основі культури потоків.
Як я можу це зробити?
Відповіді:
strings.resx
.System.Threading
іSystem.Globalization
Запустити цей код:
Console.WriteLine(Properties.strings.Hello);
На ній слід надрукувати "Привіт".
Тепер додайте новий файл ресурсу під назвою "strings.fr.resx" (зверніть увагу на частину "fr"; цей файл буде містити ресурси французькою мовою). Додайте рядовий ресурс з тим самим іменем, що і в strings.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.
Access Modifier
слід встановити Public
для класу ресурсів, який потрібно створити. Клас не обов'язково знаходиться в просторі імен властивостей, саме там ви розміщуєте файл .resx.
Насправді це досить просто. Наприклад, створіть новий файл ресурсів Strings.resx
. Набір Access Modifier
для Public
. Використовуйте шаблон файлу apprioriate, завдяки чому Visual Studio автоматично генерує клас аксесуара (ім'я Strings
в цьому випадку буде). Це ваша мова за замовчуванням.
Тепер, коли ви хочете додати, скажімо, німецьку локалізацію, додайте локалізований файл resx. Це, як правило, Strings.de.resx
в цьому випадку. Якщо ви хочете додати додаткову локалізацію для, скажімо, Австрії, ви додатково створите Strings.de-AT.resx
.
Тепер перейдіть до створення рядка - скажімо, рядок з назвою HelloWorld
. У ваших Strings.resx
, додайте цей рядок зі значенням «Hello, World!». В Strings.de.resx
додайте "Привіт, Вельте!". І в Strings.de-AT.resx
додайте "Сервус, Велт!". Ось це поки що.
Тепер у вас є цей згенерований Strings
клас, і він має властивість із getterHelloWorld
. Отримавши цю властивість, ви завантажите "Servus, Welt!" коли у вашому мові de-AT, "Здравствуйте, Welt! коли ваш локаль - це будь-який інший локальний статус (включаючи de-DE та de-CH), і" Hello, World! ", коли ваш локал є чимось іншим. Якщо рядок є відсутній у локалізованій версії, менеджер ресурсів автоматично піде вгору по ланцюгу, від найбільш спеціалізованого до інваріантного ресурсу.
Ви можете використовувати ResourceManager
клас для більшого контролю над тим, як саме ви завантажуєте речі. Створений Strings
клас також використовує його.
Крім того, чудова відповідь @Fredrik Mörk щодо рядків, щоб додати локалізацію до форми, зробіть наступне:
"Localizable"
дляtrue
Language
властивість форми на потрібну вам мову (з приємного спадного меню, у якому все це)Редагувати: Ця стаття MSDN про локалізацію форм Windows не є оригінальною, з якою я пов’язана ..., але може пролити більше світла при необхідності. (старого забрали)
Чудова відповідь Ф.Морка. Але якщо ви хочете оновити переклад або додати нові мови після виходу програми, ви застрягли, тому що вам завжди доведеться перекомпілювати його, щоб створити ресурси.dll.
Ось рішення вручну скласти ресурс dll. Він використовує інструменти resgen.exe та al.exe (встановлені за допомогою 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 .
strings.resx
файл ресурсу до проекту (або інше ім'я файлу)Access Modifier
на Public
(в розкритої strings.resx
вкладці файлу)Hello
, значення Hello
)Visual Studio автоматично генерує відповідний strings
клас, який фактично розміщений у strings.Designer.cs
. Клас знаходиться в тому ж просторі імен, в якому ви очікували б розміщення новоствореного .cs
файлу.
Цей код завжди друкується Hello
, тому що це ресурс за замовчуванням, і немає доступних ресурсів для мови:
Console.WriteLine(strings.Hello);
Тепер додайте новий ресурс, орієнтований на мову:
strings.fr.resx
(для французької)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 . Сюди:
Існує маловідомий інструмент під назвою LSACreator (безкоштовний для некомерційного використання або опції покупки), який дозволяє створювати локалізацію на основі файлів .dll / .exe. Насправді, внутрішньо (у довіднику мовного проекту) він створює / управляє локалізованими версіями resx-файлів та компілює збірку аналогічно описаному @Eric Bole-Feysot .
ResourceManager і .resx трохи безладно.
Ви можете використовувати Lexical.Localization ¹, яка дозволяє вбудовувати в код значення за замовчуванням та специфічні для культури, а також розширювати їх у зовнішні файли локалізації для більш сучасних культур (наприклад, .json або .resx).
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (я підтримую цю бібліотеку)
Як правило, ви перекладаєте свої файли у файли ресурсів, наприклад ресурси.resx.
Кожна конкретна культура має іншу назву, наприклад ресурси.nl.resx, resource.fr.resx, resources.de.resx,…
Тепер найважливішою частиною рішення є підтримка ваших перекладів. У Visual Studio встановіть інструмент Microsoft MAT: Багатомовний інструментарій додатків (MAT). Працює з winforms, wpf, asp.net (core), uwp,…
Загалом, наприклад, для рішення WPF, у проекті WPF
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Ви побачите, що буде створена нова папка під назвою "MultilingualResources", що містить ....nl.xlf
файл.
Єдине, що вам зараз потрібно зробити:
(файли .xlf повинні відкриватися за допомогою "Багатомовного редактора", якщо це не так, клацніть правою кнопкою миші на файл .xlf, виберіть "Відкрити за допомогою ..." та виберіть "Багатомовний редактор".
Весело! тепер ви також можете побачити те, що не було перекладено, експортуйте переклади у форматі xlf до зовнішніх перекладацьких компаній, знову імпортуйте їх, переробляйте переклади з інших проектів тощо ...
Більше інформації: