.NET — локализация без боли. (N)gettext + poedit

в 10:33, , рубрики: .net, C#, gettext, локализация, Локализация продуктов

.NET — локализация без боли. (N)gettext + poedit - 1

Создавая новый проект, мне приходилось использовать либо *.resx для WinForms, либо I2Localization для Unity, либо другие решения для локализации приложений. Все эти решения похожи тем, что приходится придумывать ключ-локализации, вставлять его в код и в словарь. Поначалу все хорошо, но со временем этот процесс начинает раздражать. Вместе с тем, смотря на ключ в коде не всегда понятно о чем речь.

О ситуации когда нужно добавить локализацию в большой проект где её вообще не было, я даже говорить не буду как это сложно.

Не знаю почему, но оказывается существует уже давно такое готовое решение как gnu/gettext. Расспрашивая своих знакомых и коллег (тех кто работает с .NET), большинство даже и не слышал о таком. Поэтому решил поделиться с этим удобным инструментом.

Принцип прост. Вы пишите код со строками на английском языке, запускаете утилиту, которая сканирует исходники и предоставляет вам возможность перевода. Никаких ключей придумывать не надо. Текст на английском и есть ключ.

Приступим

1) Устанавливаем пакет NGettext через Nu-get:

PM> Install-Package NGettext

NGettext – кроссплатформенная реализация GNU/Gettext для .NET.

2) Добавляем в свой проект дополнительный файл, который немного упростит синтаксис:
https://github.com/neris/NGettext/blob/master/doc/examples/T.cs

Также добавляем директорию в проект, где будут хранится переводы:

MyProjLocru-RULC_Messages

В моем случае получается такая картина:

.NET — локализация без боли. (N)gettext + poedit - 2

3) Добавляем пути в файл T.cs:

static T()
{
    var localesDir = Path.Combine(Directory.GetCurrentDirectory(), "Loc");
    _Catalog = new Catalog("Test", localesDir, new CultureInfo("ru-RU"));
}

Упрощено. Для примера только русский. (Есть возможность считывать словари из самой сборки)

4) Пишем свой код с использованием локализации. Вместо “text” пишем T._(“text”)

namespace TestCode
{
    static class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(T._("Hello, World!"));
            Console.WriteLine(T._("Cat"));
            Console.ReadKey();
        }
    }
}

5) Теперь нам необходимо перевести весь наш текст. Качаем PoEdit. Создаем файл перевода:

Файл → Создать → папка LC_MESSAGES → Test.po

.NET — локализация без боли. (N)gettext + poedit - 3

Указываем папку, в которой находятся наши исходники. Их программа будет сканировать:

.NET — локализация без боли. (N)gettext + poedit - 4

Так же необходимо указать ключевое слово, которое будет искать poEdit для перевода:

.NET — локализация без боли. (N)gettext + poedit - 5

Добавляем нужный нам перевод и сохраняем.

.NET — локализация без боли. (N)gettext + poedit - 6

Добавляем файлы перевода в проект. Делаем их Copy always:
(Есть возможность встраивать их в саму сборку)

.NET — локализация без боли. (N)gettext + poedit - 7

Готово. Запускаем:

.NET — локализация без боли. (N)gettext + poedit - 8

Настройка готова. Далее все просто. Пишите код – правите перевод

Также можно найти готовые библиотеки для локализации интерфейсов:

WPF
Дополнительная информация об использовании NGettext
Информация о GNU/Gettext

Автор: GLeBaTi

Источник


* - обязательные к заполнению поля