Все, что я вижу о локализации 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
Вы можете обернуть, что в C++ класс/функции. – detunized
И зачем вам это нужно делать не один раз? – detunized
Когда я сказал, что хотел сделать это более одного раза? И да, я полагаю, я мог бы создать новый файл только с этим, используя Objective-C++, но он все еще грязный и раздражающий. –