В FarNet я не изобретал велосипед. Используются обычные ресурсные файлы, можно прямо в студии, а можно пониже уровнем, примеры:
FarNet.Demo.restext
FarNet.Demo.ru.restext
Генератором ресурсов эти файлы преобразуются в стандартныe файлы ресурсов (.resources). Модуль имеет несколько таких .resources, по одному на каждый язык (один из них считается дефолтным). Менеджер ресурсов устроен так, что .resources файлы можно и потом добавлять, новый язык будет задействован, даже если его не было в поставке.
Что мне понравилось больше, чем подход с Lng:
- идентификаторы строк, а не индексы.
- "главный" файл может содержать строки, общие для всех, пример - строка SomeInvariantString входит только в FarNet.Demo.restext
Достаются строки с помощью стандартного .NET API для работы с ресурсами. Наверное, Win32 API что-то подобное тоже имеет, но я никогда не использовал сам в C/C++ приложениях, не знаю, как это удобно. В .NET удобно. Ну и FarNet, конечно, все это еще обернул так, что модули в детали вдаваться не должны.