- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

Приступим

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

PM> Install-Package NGettext

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

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

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

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 [3]. Создаем файл перевода:

Файл → Создать → папка 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 [4]
Дополнительная информация об использовании NGettext [1]
Информация о GNU/Gettext [5]

Автор: GLeBaTi

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/301879

Ссылки в тексте:

[1] NGettext: https://github.com/neris/NGettext

[2] https://github.com/neris/NGettext/blob/master/doc/examples/T.cs: https://github.com/neris/NGettext/blob/master/doc/examples/T.cs

[3] PoEdit: https://poedit.net

[4] WPF: https://github.com/robert-j-engdahl/ngettext-wpf

[5] Информация о GNU/Gettext: https://en.wikipedia.org/wiki/Gettext

[6] Источник: https://habr.com/post/432786/?utm_campaign=432786