A mon lieu de travail, nous sommes dans une situation où le code suivant autonome ci-dessous,API CFLocaleCopyCurrent valeur de retour incorrecte
#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;
}
nous donne une autre sortie sur OS X 10.12 et 10.13 beta.
Voici ce que nous faisons en un mot.
Sur 10,12 Machine
1) Définir la langue de préférence comme ru et région RU
2) Redémarrez la machine
3) Obtenez la sortie de "defaults read AppleLocale -g" à assurez-vous que la sortie est { ru_RU }
4) compiler le code, exécutez l'exe. Nous obtenons la sortie comme {ru_RU}. Nous répétons ensuite les étapes 1) à 3) sur la machine OS X 10.13 (bêta), puis exécutons le même exe (créé le 10.12, vous pourriez vous demander pourquoi, en raison de certaines de nos restrictions de système de construction interne) le 10.13 machine et la sortie que nous obtenons est "en_RU" ce qui n'est pas correct.
Avons-nous oublié quelque chose ici? Ou est-ce un problème connu sous OS X 10.13 (beta)? Si oui, comment réparons-nous cela?
MISE À JOUR
Nous avons également écrit un code suivant Objective-C à utiliser l'interface NSLocale et cela nous a donné mêmes résultats iE ru_RU sur 10,12 et en_RU sur 10.13 (beta)
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool
{
NSLog(@"localeIdentifier: %@", [[NSLocale currentLocale] localeIdentifier]);
}
}