使用C ++有一种简单可靠的方法来检测美式英语或英式英语拼写是否更符合用户的语言环境?我有一个简单的桌面C ++程序,我想执行这个第一个最小的国际化步骤。我的用户界面使用了很多颜色/颜色,我希望在没有大量火箭科学或明确的用户选项的情况下,在99%以上的情况下向用户提供正确的拼写。
编辑:下面接受的答案很好。只是为了提供一些额外的信息和一个完整的可用解决方案,这里可能是确定在C ++应用程序中使用美国英语还是英国英语的最简单方法。这是实现适当国际化的一个小但有用的步骤。这对于希望对美国以外的英语使用者具有文化敏感性的美国开发人员以及希望他们的产品在美国的家中看得更多的其他英语开发人员(我在后一阵营)非常有用。
这不是一个完美的解决方案,但显然标准化过程未能提供完美而简单的解决方案。假设您的产品被广泛使用,我希望至少使用此代码会使用户的一小部分颜色与颜色错误,而不是简单地随意选择其中一个。
#include <string>
#include <clocale>
setlocale(LC_MONETARY,"");
struct lconv * lc;
lc = localeconv();
std::string sym(lc->int_curr_symbol);
bool us_english = (sym=="USD" || sym=="PHP");
我基本上假设美国英语是美国和英国其他地方的偏好,虽然我已经对一个国家做了例外,我知道情况并非如此(菲律宾)。
在我的Windows系统上,此程序会立即反映由Windows设置或控制面板控制的默认语言的更改。这样做可以避免解析任何可能因操作系统而异的字符串,我希望它可以移植。
我不会使用我自己的解决方案,因为在我的特定情况下我使用wxWidgets,并且因为它发生了wxWidgets为这个问题提供了一个便携式包装器定制(我应该考虑过之前检查)。
#include "wx/intl.h"
int lang = wxLocale::GetSystemLanguage();
bool us_english = (lang == wxLANGUAGE_ENGLISH_US);
答案 0 :(得分:2)
C ++中有一个完整的本地化/本地化库http://en.cppreference.com/w/cpp/locale
您应该可以通过检查std::locale("").name()
答案 1 :(得分:2)
标准的限制
正如NeomerArcana正确指出的那样,标准的C ++方法是:
std::locale("")
locale
对象
std::locale("").name()
不幸的是,标准没有强制执行此名称的样子,并且MSVC实现只返回您在构造对象时给出的名称,即空字符串。
<强>变通方法强>
幸运的是,有一个C解决方法可以在MSVC中产生更好的结果:std::setlocale(LC_ALL, NULL);
。此函数返回指向空终止的C字符串的指针,该字符串包含环境的默认语言环境的全名。
但是,此字符串的格式可能取决于操作系统和版本。因此,您必须以灵活的方式解析它:它可以是正确的locale name(例如,对于Windows的"en-US"
与POSIX上的“en_US.UTF-8”或{{3} }(例如“English_United States.1252”,基于Windows specific format)。
或者,如果您只定位Windows,则可以考虑使用language table来简化您的生活。此函数返回二进制语言标识符,然后您可以检查语言LANG_ENGLISH
和区域变体SUBLANG_ENGLISH_UK