[Locale] Getting correct system locale under Mac OS X
I am using boost 1.55.0.rc2. I am running 10.8.5 and when I select "Norway (Norwegian Bokmal)" (nb_NO) as the region, LANG env. variable is undefined, making boost::locale::generator("") to generate a "C" locale. I can of-course get the locale identifier from NSLocale (or CFLocale) and initialize the boost::locale::generator with "nb_NO" which seems to be working, but with Mavericks things got even more interesting. It looks like, in 10.9 you can mix and match language with a country anyway you like i.e. I can select "Norway" as my region and "English" as my language and again LANG is empty but NSLocale returns "en_NO". But this time when I use boost::locale::generator("en_NO"), boost::locale::as::number uses "." (dot) as decimal separator, although NSLocale reports "," (comma). 1. Can boost::locale handle such combinations (en_NO, en_TR, etc)? (I am using ICU backend, others are explicitly turned off). a. for number formatting? b. for messages formatting (translations)? which mo will it pick for en_TR ? 2. How can I 'customize' locale generated by boost::locale to reflect the changes user might do in system locale settings (i.e. select en_US but change the decimal symbol)? Thanks. -- Orhun Birsoy
On Mon, 11/11/13, Orhun Birsoy
wrote: I am running 10.8.5 and when I select "Norway (Norwegian Bokmal)" (nb_NO) as the region, LANG env. variable is undefined, making boost::locale::generator("") to generate a "C" locale. I can of-course get the locale identifier from NSLocale (or CFLocale) and initialize the boost::locale::generator with "nb_NO" which seems to be working, but with Mavericks things got even more interesting.
The boost locale uses LANG, LC_ALL, and LC_CTYPE to detect the locale, this is how the locale is defined on POSIX systems and on Mac OS X (at least on my copy IIRC) ICU uses internally the same way to do it.
It looks like, in 10.9 you can mix and match language with a country anyway you like i.e. I can select "Norway" as my region and "English" as my language and again LANG is empty but NSLocale returns "en_NO".
Boost.Locale supports a single locale, it does not allow "combining" different types of locale.
But this time when I use boost::locale::generator("en_NO"), boost::locale::as::number uses "." (dot) as decimal separator, although NSLocale reports "," (comma).
The problem en_NO is not standard locale like there is no ru_US. I.e. it is not a part of CLDR. http://demo.icu-project.org/icu-bin/locexp#region So it does some fallbacks.
1. Can boost::locale handle such combinations (en_NO, en_TR, etc)? (I am using ICU backend, others are explicitly turned off). a. for number formatting? b. for messages formatting (translations)? which mo will it pick for en_TR ? 2. How can I 'customize' locale generated by boost::locale to reflect the changes user might do in system locale settings (i.e. select en_US but change the decimal symbol)?
The setup is defined by CLDR or by the database of the specific backend. Now, about mo-translation it is little bit different. It tries to match the best. If there is en_TR/LC_MESSAGES/app.mo and the locale is en_TR it would try to load it, afterwards it would try to load en/LC_MESSAGES/app.mo
Thanks. Orhun Birsoy
Regards Artyom Beilis -------------- CppCMS - C++ Web Framework: http://cppcms.com/ CppDB - C++ SQL Connectivity: http://cppcms.com/sql/cppdb/
participants (2)
-
Artyom Beilis
-
Orhun Birsoy