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