【发布时间】:2011-01-27 18:54:43
【问题描述】:
不出所料,我所看到的有关 iPhone 本地化的所有内容都在 Objective-C 中。我正在处理的项目已经使用几乎完全 C++ 编写并在 iPhone 上运行,并且我们已经有了一些完整的翻译。我们现在需要的只是一种找出语言环境/语言代码的方法。在计算机上,这是使用getenv 完成的,检查“LANG”,或者如果没有设置“LC_ALL”。这似乎在 iPhone 上不起作用(两者都没有设置),所以我需要一些其他方法。
据我所知,使用 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++ 类/函数中。
-
你为什么需要多次这样做?
-
我什么时候说过我想做不止一次?是的,我想我可以使用 Objective-C++ 来创建一个新文件,但它仍然很麻烦。
-
我想如果你只做一次,那没什么大不了的。我无法想象你的 iPhone 应用程序有 Objective-C 到 C++ 层。在某些地方,它必须直接与 Cocoa 交互。我只是把它放在那里然后继续。
-
嗯,它主要使用 SDL,它完成了大部分工作。所以只有一些桥梁,用于音乐、获取屏幕尺寸等。
标签: iphone c++ objective-c ios internationalization