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 beta 上为我们提供了不同的输出。

简而言之,这就是我们所做的。

在 10.12 机器上

1) 将偏好语言设置为 ru,区域设置为 RU

2)重启机器

3) 获取“defaults read -g AppleLocale”的输出,确保输出为 { ru_RU }

4)编译代码,运行exe。我们得到的输出为 { ru_RU }。

然后我们在 OS X 10.13 (beta) 机器上重复步骤 1) 到 3) 然后在 10.13 机器上运行相同的 exe(在 10.12 创建,你可能会问为什么,这是因为我们内部构建系统的一些限制)和输出我们得到的是“en_RU”,这是不正确的。

我们在这里遗漏了什么吗?或者这是 OS X 10.13 (beta) 中的一个已知问题?如果是这样,我们如何解决这个问题?

更新

我们还编写了以下 Objective-C 代码来使用 NSLocale 接口,这也给了我们相同的结果,即 10.12 上的 ru_RU 和 10.13(测试版)上的 en_RU

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

1 回答 1

1

我们得到错误值的原因是因为我们的应用程序没有本地化到我们期望的语言环境中,例如ru. 我们通过在我们的应用程序目录中添加一个空ru.lproj目录来纠正这个问题, Contents/ResourcesAPI 开始为我们提供正确的答案。

于 2017-08-07T11:40:30.750 回答