
When you translate a message it is uniquely defined by 4 parameters:
- locale (for example "ru_RU") - domain (for example "excel") - context(for example "File Menu") - id(for example "Open...")
So:
cout << translate("File Menu","Open...") << translate("Internet Connection","Open...") << translate("Open...") << translate("File Menu","Close") << translate("Internet Connection","Close") << translate("Close")
Require 6 different entries in the dictionary
In this example you're only using context parameters (where there is two parametters) right?
Locale is defined by imbuing it to the stream. i.e. std::cout.imbue(my_generator("ru_RU.UTF-8")); Now default domain is used, if you want to switch domain you use: cout << as::domain("excel") << translate("File Menu","Open...") And the string would be taken from, for example /usr/share/locale/ru_RU/LC_MESSAGES/foo.mo dictionary (of course if the dictionary for foo was loaded before when you defined domains) Of course you can specify all 4 parameters as: std::locale ru_RU_locale = my_generator("ru_RU.UTF-8"); std::string = translate("File Menu","Open...").str<char>(ru_RU_locale,"excel"); Or little bit simpler in gettext style: std::string translated_open = dpgettext("excel","File Menu","Open...",ru_RU_locale); But... Usually you don't want to :-) Artyom