c++ - 使用 C++ 检测美式英语或英式英语拼写是否合适

标签 c++ localization

使用 C++ 是否有一种简单可靠的方法来检测美式英语或英式英语拼写是否更适合用户的语言环境?我有一个简单的桌面 C++ 程序,我想执行第一个最小国际化步骤。我的用户界面经常使用 color/colour 这个词,我希望在 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");

我基本上假设在美国首选美国英语,在其他地方首选英式英语,尽管我对一个我知道情况并非如此的国家/地区(菲律宾)进行了异常(exception)处理。

在我的 Windows 系统上,此程序会立即反射(reflect)默认语言的更改,由 Windows 设置或控制面板控制。这样做可以避免解析任何可能因操作系统而异的字符串,我希望它是可移植的。

我不打算使用我自己的解决方案,因为在我的特定情况下我使用的是 wxWidgets,而且碰巧 wxWidgets 提供了一个针对这个问题量身定制的可移植包装器(我之前应该考虑过检查)。

#include "wx/intl.h"
int lang = wxLocale::GetSystemLanguage();
bool us_english = (lang == wxLANGUAGE_ENGLISH_US);

最佳答案

标准的局限性

正如 NeomerArcana 正确指出的那样,标准的 C++ 方法是:

不幸的是,标准并没有强制规定这个名字应该是什么样子,MSVC 实现只返回你在构造对象时给出的名字,即一个空字符串。

解决方法

幸运的是,有一个 C 变通方法可以使用 MSVC 产生更好的结果:std::setlocale(LC_ALL, NULL); .此函数返回指向空终止 C 字符串的指针,其中包含环境默认语言环境的全名。

但是,此字符串的格式可能取决于操作系统和版本。所以你必须以灵活的方式解析它:它可以是一个合适的 locale name (例如,Windows 的 “en-US” 与 POSIX 上的“en_US.UTF-8”)或 Windows specific format (例如“English_United States.1252”,基于 language table )。

或者,如果您只针对 Windows,您可以考虑使用 GetSystemDefaultLangID(void) 来简化您的生活。 .此函数返回二进制语言标识符,然后您可以根据语言 LANG_ENGLISH 和区域变体 SUBLANG_ENGLISH_UK

进行检查

关于c++ - 使用 C++ 检测美式英语或英式英语拼写是否合适,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813808/

相关文章:

c++ - 在 glOrtho 和 gluPerspective 之间切换

c# - 使用 ResourceWrapper 在 Silverlight 4 中进行本地化

ios - 在设备当前区域设置后格式化日期和时间

c++ - utfcpp 和 Win32 宽 API

windows - psql shell 使用代码页 850,windows 使用 1252。如何解决更改控制台代码页?

swift - Xcode 10 中图像资源的本地化

asp.net - Request.UserLanguages 数组是如何排序的 - 按优先级还是按字母顺序?

c++ - 错误 C2679 : binary '<<' : no operator found which takes a right-hand operand of type 'void' (or there is no acceptable conversion)

c++ - 如何设置枚举类型变量的默认值?

c++ - 从 C/C++ 发送 http 和 https 请求