2017-07-19 9 views
0

については、我々は以下のスタンドアロンのコードを以下、私の職場でCFLocaleCopyCurrentのAPI間違った戻り値

#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

2として嗜好Ruなどの言語と地域を設定)は

3マシンを再起動)の出力に "デフォルトはAppleLocaleを-g読み出す" GET出力が { ru_RU }

であることを確認してください。4)コードをコンパイルし、exeを実行します。出力は{ru_RU}となります。

次に、OS X 10.13(ベータ)マシンの手順1)〜3)を繰り返して、同じexeを実行します(10.12で作成したものです。私たちが得る出力は "en_RU"ですが、これは正しくありません。

ここに何か不足していますか?またはこれはOS X 10.13(ベータ版)の既知の問題ですか?もしそうなら、私たちはこれをどのように修正するのですか?我々はまた、NSLocaleインタフェースを使用するには、次のObjective-Cのコードを書いたし、あまりにも10.13(ベータ版)

#import <Foundation/Foundation.h> 
int main() 
{ 
    @autoreleasepool 
    { 
     NSLog(@"localeIdentifier: %@", [[NSLocale currentLocale] localeIdentifier]); 
    } 
} 

答えて

0

に10.12とen_RU上すなわちru_RU私たちに同じ結果が得られたこと

UPDATE

私たちが間違った価値を得た理由は、私たちのアプリが期待したロケールにローカライズされていなかった、例えばruです。 空のru.lprojディレクトリをアプリのContents/Resourcesディレクトリに追加すると、これが解決され、APIが正解を返すようになりました。

関連する問題