четверг, 23 июня 2016 г.

Небольшой FAQ про локализацию текста в приложениях при разработке в C# Mono на Linux

1. Текущий язык зависит от языка MonoDevelop, если у вас настроен анлгийский, то и язык приложений будет по умолчанию английским. Даже если сама система на русском (как и наоборот).

2. По умолчанию тип проекта "Translation Project" в списке не отображается, чтобы он появился надо включить его в Tools - Add-in Manager - Gettext Translation Support.

3. То что указано в Mono.Unix.Catalog.GetString("Hello World!") является одновременно и именем, и значением по умолчанию (которое используется, если в переводе не найдено)

4. При разработке в GTK# и использовании графической разработки, дизайнер автоматически подставляет GetString, вместо отображаемого значения.

5. По умолчанию имя ВСЕХ проектов переводов - "i8n1", можете поменять в свойствах Translation Project. Также в опциях можно указать в какой католог кидать переводы + увидеть строку для инициализации

6. Для указания где брать переводы используется команда
Mono.Unix.Catalog.Init ("i8n1", "./locale");

7. Чтобы указать в приложении конкретный язык нужно до инициализации (и назначения значений переменных) выполнить
Environment.SetEnvironmentVariable ("LANGUAGE", "ru");

8. Можно сменить язык во время работы приложения. Но для этого нужно заново указать все компоненты (для примера у нас есть три элемента label)


protected void OnButtonRUClicked (object sender, EventArgs e)
{
 Environment.SetEnvironmentVariable ("LANGUAGE", "ru");
 Mono.Unix.Catalog.Init ("i8n1", "./locale");
 nameUpdate ();
}

protected void OnButtonENClicked (object sender, EventArgs e)
{
 Environment.SetEnvironmentVariable ("LANGUAGE", "en");
 Mono.Unix.Catalog.Init ("i8n1", "./locale");
 nameUpdate ();
}

void nameUpdate()
{
 label1.LabelProp = global::Mono.Unix.Catalog.GetString ("label1");
 label2.LabelProp = global::Mono.Unix.Catalog.GetString ("label2");
 label3.LabelProp = global::Mono.Unix.Catalog.GetString ("label3");
}

9. Если после создания проекта перевода в основном проекте были добавлены компоненты которые нужно переводить, то чтобы они появились в ранее созданом проекте перевода нужно просто щелкнуть правой кнопкой на нём и выбрать "Update Translations"

10. На текст перевода распространяются ограничения обычного текста в коде. То есть спецсимволы, такие как "\" или сами кавычки нужно экранировть.

11. Вы можете в любом месте проекта сделать
string str = global::Mono.Unix.Catalog.GetString ("TestMessage");
затем сделать Update Translations и новое сообщение появится для перевода

12. В переводах допустима подстановка -
string str = global::Mono.Unix.Catalog.GetString ("Hello {0}!");
string str2 = string.Format (str, "World");

Комментариев нет:

Отправить комментарий