2011-01-27 2 views
1

Все, что я вижу о локализации iPhone, неудивительно, в Objective-C. Проект, над которым я работаю, уже написан и работает на iPhone, используя почти полностью C++, и у нас уже есть несколько полных переводов. Все, что нам нужно сейчас, это способ узнать код языка/языка. На компьютере это делается с использованием getenv, проверяя «LANG», или если это не установлено «LC_ALL». Это, похоже, не работает на iPhone (ни на что не установлено), поэтому мне нужен другой метод.Как получить локаль на iPhone в C++?

Насколько я могу сказать, лучший способ сделать это с Objective-C является:

NSString* languageCode = [[NSLocale preferredLanguages] objectAtIndex:0]; 

Но тогда я должен был бы преобразовать из NSString* в char*/std::string (что может быть сделано, но это обычно раздражает/беспорядочно). Поэтому мне интересно, есть ли более простой способ получить локаль от C++ напрямую?

Вот что я в конечном итоге делает:

#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 
     #include <CoreFoundation/CoreFoundation.h> 
#endif 
/* ... */ 
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 
     CFArrayRef localeIDs = CFLocaleCopyPreferredLanguages(); 
     if (localeIDs) 
     { 
      CFStringRef localeID = (CFStringRef)CFArrayGetValueAtIndex(localeIDs, 0); 
      char tmp[16]; 
      if (CFStringGetCString(localeID, tmp, 16, kCFStringEncodingUTF8)) 
       locale = std::string(tmp); //this is the std::string 
      CFRelease(localeIDs); 
     } 
#endif 
+0

Вы можете обернуть, что в C++ класс/функции. – detunized

+0

И зачем вам это нужно делать не один раз? – detunized

+0

Когда я сказал, что хотел сделать это более одного раза? И да, я полагаю, я мог бы создать новый файл только с этим, используя Objective-C++, но он все еще грязный и раздражающий. –

ответ

1

Возможно, вы хотите использовать CFLocaleGetValue()

Смежные вопросы