Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров10K


Создавая новый проект, мне приходилось использовать либо *.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

Также добавляем директорию в проект, где будут хранится переводы:
MyProj\Loc\ru-RU\LC_Messages

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



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



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



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



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



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



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



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


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

WPF
Дополнительная информация об использовании NGettext
Информация о GNU/Gettext
Теги:
Хабы:
Всего голосов 22: ↑20 и ↓2+18
Комментарии28

Публикации

Истории

Работа

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург