2017-07-19 3 views
0

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

Répondre

0

Le raison pour laquelle nous obtenions une valeur incorrecte est parce que notre application n'a pas été localisée dans la locale, nous nous attendions par exemple ru. Nous avons corrigé cela en ajoutant un répertoire ru.lproj vide dans le répertoire Contents/Resources de notre application et l'API a commencé à nous donner la bonne réponse.