私の職場では、以下のスタンドアロン コードに従って、
#include <CoreFoundation/CoreFoundation.h>
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <boost/cast.hpp>
// Reference release
struct reference_close
{
void operator()(const void *ref) const
{
CFRelease(static_cast<CFTypeRef>(ref));
}
}; // end of reference_close structure
typedef std::unique_ptr<const void, reference_close> reference_uptr;
std::string get_user_locale()
{
reference_uptr ref_ptr(CFLocaleCopyCurrent());
CFLocaleRef locale_ref(static_cast<CFLocaleRef>(ref_ptr.get()));
if (locale_ref == nullptr)
{
return std::string();
}
const size_t default_size(128);
std::vector<char> buff(default_size);
CFStringRef str_ref(CFLocaleGetIdentifier(locale_ref));
// CFStringRef str_ref((CFStringRef)CFLocaleGetValue(locale_ref,kCFLocaleLanguageCode));
if (str_ref != nullptr)
{
CFIndex len(CFStringGetLength(str_ref) + 1);
if (len > boost::numeric_cast<CFIndex>(default_size))
{
buff.resize(len);
}
buff[0] = 0;
if (!CFStringGetCString(str_ref, &buff[0], len, kCFStringEncodingISOLatin1))
{
return std::string();
}
}
return std::string(&buff[0]);
} // end of get_user_locale()
int main()
{
std::cout << "get_user_locale() : "<<get_user_locale() << std::endl;
return 0;
}
OS X 10.12 と 10.13 ベータ版では異なる出力が得られます。
これが私たちがしていることです。
10.12 マシン上
1)優先言語をru、地域をRUとして設定します
2) マシンを再起動します
3) "defaults read -g AppleLocale" の出力を取得して、出力が { ru_RU } であることを確認します。
4) コードをコンパイルし、exe を実行します。{ ru_RU } として出力を取得します。
次に、OS X 10.13 (ベータ) マシンで手順 1) から 3) を繰り返し、10.13 マシンで同じ exe (10.12 で作成されたもの。理由はビルド システムの内部制限によるもの) を実行し、出力します。取得するのは「en_RU」ですが、これは正しくありません。
ここで何か不足していますか? それとも、これは OS X 10.13 (ベータ) の既知の問題ですか? もしそうなら、どうすればこれを修正できますか?
アップデート
NSLocale インターフェイスを使用する次の Objective-C コードも作成しましたが、これも同じ結果 (10.12 では ru_RU、10.13 (ベータ) では en_RU) が得られました。
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool
{
NSLog(@"localeIdentifier: %@", [[NSLocale currentLocale] localeIdentifier]);
}
}