1

私の職場では、以下のスタンドアロン コードに従って、

#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]);  
    }   
}  
4

1 に答える 1

1

間違った値を取得していた理由は、アプリが想定したロケールにローカライズされていなかったためですruru.lprojアプリのディレクトリに空のディレクトリを追加することでこれを修正しContents/Resources、API が正しい答えを返し始めました。

于 2017-08-07T11:40:30.750 に答える