Принципы и примеры локализации в проекте Janus

Локализация софта

Автор: Andrew, The RSDN Group

Источник

Введение

В проекте Janus при отображении пользовательского интерфейса возможно выбрать язык, на котором оно будет происходить. Для обеспечения этого существует внутрипрограммный механизм локализации. Он основан на механизме локализации .NET Framework. Этот механиз подразумевает наличие так называемого языка по умолчанию и набора языков локализации. Константы варианта по умолчанию находятся в основной сборке, константы других вариантов в специальных сборках-сателлитах. Эти сборки создаются автоматически компилятором, если компилятор обнаруживает в проекте resx-файлы с именем такого формата: ИмяФайла.ИмяЛокали.resx. Для русского языка ИмяЛокали равно ru-RU.

Однако в каждом конкретном случае механика создания и использования этих файлов различна.

Локализация форм

Этот вид локализации поддерживается редактором Visual Studio. Порядок создания локализованной формы такой:

Создаем форму, заполняя свойства на английском языке.


После создания формы в ее свойствах устанавливаем Localizable в true


После этого в свойстве Language выбираем Russian (Russia)


После этого перебиваем все строковые свойства на русский язык. Допускается так же изменение размеров и позиций элементов, если русский текст не влезает в элемент управления.

ПРЕДУПРЕЖДЕНИЕ
Будьте внимательны – изменения формы, не относящиеся к локализации необходимо производить только при установленном в (Default) свойстве Language.

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

Теперь осталось сделать еще небольшое дополнительное действие. Необходимо избавится от лишней сателлитной сборки. Для этого необходимо переключиться в Solution Explorer и нажать в его панели инструментов кнопку Show All Files. После этого в подчиненных форме файлах нужно найти файл ИмяФормы.ru.resx и удалить его. Должны остаться файлы ИмяФормы.cs, ИмяФормы.resx и ИмяФормы.ru-RU.resx.


Локализация строковых констант

Не все выводимые в пользовательском интерфейсе строки создаются в дизайнере форм. Для таких строк предназначен механизм локализации, находящийся в сборке Rsdn.Localization.

Главный класс этой сборки, LocalizationManager, является синглтоном и облегчает выбор локализованных строк из сборок-сателлитов.

Для выборки строк предназначен метод GetResourceString. Этот метод имеет несколько вариантов.

/// <summary>
/// Возвращает локализованную строку ресурсов
/// </summary>
/// <param name="resAsm">сборка с ресурсами</param>
/// <param name="resFileName">имя файла ресурса</param>
/// <param name="resName">имя ресурса</param>
/// <returns>локализованную строку</returns>
public string GetResourceString(Assembly resAsm, string resFileName, string resName)

/// <summary>
/// Возвращает локализованную строку ресурсов из вызвавшей сборки
/// </summary>
/// <param name="resFileName">имя файла ресурса</param>
/// <param name="resName">имя ресурса</param>
/// <returns>локализованную строку</returns>
public string GetResourceString(string resFileName, string resName)

/// <summary>
/// Возвращает локализованную строку ресурсов из вызвавшей сборки, из файла
/// &lt;namespace класса&gt;.LocStringsResource
/// </summary>
/// <param name="resName">имя ресурса</param>
/// <param name="resClass">класс</param>
/// <returns>локализованную строку</returns>
public string GetResourceString(Type resClass, string resName)

/// <summary>
/// Возвращает локализованную строку ресурсов из вызвавшей сборки, из файла
/// &lt;namespace вызвавшего класса&gt;.LocStringsResource
/// </summary>
/// <param name="resName">имя ресурса</param>
/// <returns>локализованную строку</returns>
public string GetResourceString(string resName)

Первый вариант возвращает ресурс из указанной сборки, указанного имени файла ресурсов с указанным именем. Это самый сложный и наиболее гибкий вариант метода. Во втором варианте отсутствует имя сборки. В этом случае будет использована та сборка, которая вызвала этот метод. В третьем варианте вместо сборки указывается класс из этой сборки, а в качестве имени ресурсного файла используется комбинация из пространства имен переданного класса и имени LocStringResource. В четвертом варианте указывается только имя ресурса. Этот метод аналогичен предыдущему, но в качестве класса используется вызвавший.

ПРЕДУПРЕЖДЕНИЕ
Не пытайтесь добавлять локализационные ресурсы в resx-файлы форм. При каждом редактировании дизайнер уничтожит все ваши исправления.

Порядок использования строковых ресурсов в проекте следующий:

  1. В файлы LocStringResource.*.resx в корне проекта добавляется переменная с одинаковым во всех файлах именем, но с разным содержанием, локализованным в зависимости от локализации файла. Например:
  2. LocStringResource.resx
<data name="ForumLoadAllMsg">
<value>Load all message</value>
</data>
  1. LocStringResource.ru-RU.resx
<data name="ForumLoadAllMsg">
<value>Загрузить все сообщения форума</value> 
</data>

Для облегчения совместного редактирования файлов в проекте есть утилитка, находящаяся в каталоге LocalizationUtil. Эта утилита считывает все локализационные файлы и позволяет редактировать все варианты в одной строке грида.


ПРЕДУПРЕЖДЕНИЕ
Не пытайтесь отредактировать при помощи этой утилиты resx-файлы форм. Она не рассчитана на такое применение и испортит все бинарные ресурсы.

Далее, в том месте кода, где необходимо использовать строковую константу, вызываете метод GetResourceString

_button.Text = LocalizationManager.Instance.GetResourceString("ForumLoadAllMsg");

Локализация меню и панелей инструментов

В проекте Janus меню и панели инструментов создаются на основе специальных xml-файлов. В этих файлах подразумевается использование не самих строк, а идентификаторов ресурсов. Поэтому для добавления своего элемента необходимо создать локализованный ресурс, как это описано в предыдущей части и указать его имя в xml-файле.

<bar>
	<items>
		<button text="ForumReplyMessage" event-id="reply" small-image="reply"/>
		<button text="SearchClearList" event-id="clear" small-image="clear"/>
		<separator/>
		<button text="ForumSaveMessage" event-id="savemsg" small-image="save"/>
	</items>
</bar>

Локализация класса конфигурации

В этом классе строковые константы задаются в атрибутах, поэтому описанные выше способы к нему не применимы. Для локализации этого файла предназначены специальные версии атрибутов – JanusDisplayNameAttribute, JanusCategoryAttribute и JanusDescriptionAttribute. Они ни чем не отличаются от прототипов, однако в качестве параметра требуют не саму строку, а имя ресурса, ее содержащее.

[JanusDisplayName("DisplayNameQueryBeforeExit")]
[JanusDescription("DescriptionQueryBeforeExit")]
[JanusCategory("CategoryNameCommon")]
[DefaultValue(true)]
[SortIndex(1)]
public bool ConfirmClosing
{
	get {return confirmClosing;}
	set {confirmClosing = value;}
}

Оцените статью