Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА:

Как использовать локализацию в C # 4 года 7 мес. назад #308

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
1. Добавьте в проект файл ресурсов (вы можете называть его "strings.resx" ), выполнив следующие действия:
2. Щелкните правой кнопкой мыши Свойства в проекте, выберите Добавить → Новый элемент... в контекстном меню, затем в списке Элементы Visual С# выберите " Файл ресурсов" и назовите его strings.resx.
3. Добавьте строку resouce в файл resx и дайте ему хорошее имя (пример: назовите его "Hello" with и дайте ему значение "Hello" )
4. Сохраните файл ресурса ( note:, это будет файл ресурсов по умолчанию, так как он не имеет двухбуквенного кода языка)

Добавьте ссылки в свою программу: System.Threading и System.Globalization

Запустите этот код:
Console.WriteLine(Properties.strings.Hello);
Он должен напечатать "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 ", которую он находит (и использует).

Следующий код напечатает "Hello" :
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.

.
Вместо того, чтобы создавать файлы вручную, попробуйте Zeta Resource Editor ( zeta-resource-editor.com/index.html ). Это бесплатно и поможет вам делать такие переводы НАМНОГО быстрее, чем просто в VS.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Как использовать локализацию в C # 4 года 7 мес. назад #309

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Это довольно просто, на самом деле. Создайте новый файл ресурсов, например 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 добавьте "Hallo, Welt!". И в Strings.de-AT.resx добавьте "Servus, Welt!". Это пока.

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

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


.
как установить локаль? – Matheus Simon 30 авг. 2018, в 12:55

@MatheusSimon: Вам не нужно. По умолчанию используется текущая локаль пользователя. Если вы хотите принудительно установить определенный языковой стандарт (например, чтобы позволить пользователям изменять язык вручную), вы должны установить System.Threading.Thread.CurrentCulture и CurrentUICulture в каждом потоке , вероятно, до того, как какие-либо ресурсы будут загружены в первый раз. Для этого проще перезапустить приложение, чем обновлять во время выполнения. – OregonGhost 10 сен. 2018, в 08:31

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Как использовать локализацию в C # 4 года 7 мес. назад #310

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
В дополнение, отличный ответ на строки, чтобы добавить локализацию в форму, выполните следующие действия:

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Как использовать локализацию в C # 4 года 7 мес. назад #311

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Отличный ответ. Но если вы хотите обновить перевод или добавить новые языки после того, как приложение будет выпущено, вы застряли, потому что вам всегда приходится перекомпилировать его для генерации файла resources.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" )


.
Winres.exe (редактор для локализации ресурсов Windows)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Как использовать локализацию в C # 4 года 7 мес. назад #312

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Ответ и уточнение ответа.

1. Добавьте файл проекта Strings.resx в ваш проект (или другое имя файла)
2. Установите Access Modifier для Public Access Modifier (в открытой вкладке файла Strings.resx)
3. Добавьте строку resouce в файл resx: (пример: name Hello, значение Hello)
4. Сохранить файл ресурса

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

Этот код всегда печатает Hello, потому что это ресурс по умолчанию, и не доступны языковые ресурсы:
Console.WriteLine(Strings.Hello);

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

1. Добавить Strings.fr.resx (для французского)
2. Добавьте строку с тем же именем, что и ранее, но другое значение: (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.

Строка, которая будет использоваться, определяется в этом порядке приоритета:

1. Из ресурсов, специфичных для конкретной страны, таких как Strings.fr-CA.resx
2. Из языкового ресурса, такого как Strings.fr.resx
3. По умолчанию Strings.resx

Обратите внимание, что ресурсы, специфичные для языка, генерируют спутниковые сборки.

Также узнайте, как CurrentCulture отличается от CurrentUICulture
===
В чем разница между свойствами CurrentCulture и CurrentUICulture для CultureInfo в .NET?

CurrentCulture является .NET-представлением локали пользователя системы по умолчанию. Это контролирует число по умолчанию, форматирование даты и тому подобное.

CurrentUICulture относится к языку пользовательского интерфейса по умолчанию - настройке, введенной в Windows 2000. Это в первую очередь относится к части локализации/перевода пользовательского интерфейса вашего приложения.

Независимо от региональных параметров, в которых настроена система, это будут «текущие» значения в вашем .NET-приложении.

Часто они оба одинаковы. Но в моей системе они были бы другими: я предпочитаю свои цифры и даты в немецком формате, поэтому CurrentCultureбудет немецкий, но я также предпочитаю все свои заявки на английском языке, поэтому CurrentUICulture будет английский.

Есть хорошая статья на эту тему: Сортировка всего: почему у нас есть как CurrentCulture, так и CurrentUICulture. (EN)


Хороший способ изменить ситуацию в дополнение к приятным объяснениям, сделанным другими пользователями, и важный аспект в разработке веб-приложений заключается в следующем:

1. CurrentCulture представляет настройку веб-сервера. Например, если ваше веб-приложение ASP.NET размещено в Германии, значение CutlureInfo.CurrentCulture, скорее всего, будет de-DE. Таким образом, стандартное .ToString()форматирование для IFormattableтипов будет использовать немецкое форматирование по умолчанию или те, которые были установлены в ОС сервера по умолчанию.

2. CurrentUICulture может быть получен от пользовательского агента и может представлять культуру пользовательского интерфейса клиента, подключающегося к веб-сайту. Например, если вы загрузите этот сайт из России, ваши локальные настройки настроены на использование русского языка, и ваш пользовательский агент отправляет региональные настройки на сервере (Opera и IE сделать это автоматически, не уверен , что для Chrome и FireFox), то CurrenUICultureбудет представлять ru-RU. Это приведет к тому, что любые ресурсы, такие как локализованные строки, полученные с помощью ResourceManager, или выражения локализации в ASP.NET-файлах aspx / ascx будут на русском языке (если доступны переводы).

Отличия:

CurrentCulture для форматирования дат и валюты, в то время как CurrentUICulture идет с языком/переводами. Он будет использоваться ResourceManager для поиска ресурсов по культуре.
Пространство имен CurrentCulture класса находится в System.Globalization в то время как CurrentUICulture приходит System.Threading.
CurrentCulture
сохраняется в разных запросах в сеансе, но CurrentUICulture должен быть установлен для каждого запроса.

Сходство:

Они оба являются System.Globalization.CultureInfo примерами.


Стоит отметить, что он CurrentUICulture поддерживает не специфичные для страны локали, такие как en (нейтральные культуры), тогда как CurrentCulture ТОЛЬКО поддерживает специфичные для страны локали, такие как en-GB. Настройка CurrentCulture на нейтральную культуру бросит ArgumentException.

Я предполагаю, что это потому, что форматы, такие как даты и валюта, более тесно связаны с самой страной, но отображаемый язык часто взаимозаменяемы между странами.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Модераторы: Дмитрий

О сайте

Строительство индивидуальных домов из лёгкого самана - опыт, советы, методика строительства и подробные инструкции. А также возможность применения альтернативных источников энергии.


Контакты

08340. ул.Салютная 17. с.Гнедын.
Киевская обл. Украина.

+38 067 492 4124.
+38 095 065 8860.

info@okwood.com.ua
www.okwood.com.ua

Местоположения


8PM2+7R Гнедин, Kyiv Oblast