2016-10-02 80 views
1

使用C++有一种简单而可靠的方法来检测美式英语或英式英语拼写是否与用户的语言环境更好地匹配?我有一个简单的桌面C++程序,我想执行这个第一个最小的国际化步骤。我的用户界面使用了很多颜色/颜色这个词,我希望在没有大量火箭科学或明确的用户选项的情况下,在99%以上的情况下向用户展示正确的拼写。使用C++检测美式英语或英式英语拼写是否适用于C++

编辑:下面接受的答案是好的。为了提供一些额外的信息和完整的可用解决方案,这里可能是确定在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

返回的标准

为限制字符串使用它NeomerArcana正确指出,标准的C++方法是:

不幸的是locale对象,标准不强制这个名字应该看起来怎么样,和MSVC实施只是返回您在构建对象时给出的名称,即一个空字符串。

解决办法

不过还好,有一个C变通产生与MSVC一个更好的结果:std::setlocale(LC_ALL, NULL);。该函数返回一个指向空字符C字符串的指针,该字符串包含环境默认语言环境的全名。

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

或者,如果您只定位到Windows,则可以考虑使用GetSystemDefaultLangID(void)来简化您的生活。此函数返回一个二进制语言标识符,然后您可以检查语言LANG_ENGLISH和区域变体SUBLANG_ENGLISH_UK

+1

这比我自己的答案要好得多。我觉得有点令人惊讶的是,没有真正的跨平台方式来获取语言环境信息。 – NeomerArcana

+1

感谢您接受这个优秀的答案。我根据你的回答做了一些额外的实验,我将把结果报告为我的问题的编辑,因为我可以更容易地在那里放置一些代码。 –

+1

@BillForster对于跨操作系统的语言环境,仍然没有标准的表示方式确实令人伤心。感谢您在问题中发布的更新:使用货币的想法是实用方法的绝佳范例! – Christophe

2

有一个在C++整个本地化/的本地化库http://en.cppreference.com/w/cpp/locale

您应该能够通过检查

+0

不幸的是,在我的Windows测试程序(使用Visual Studio 2015)中,std :: locale(“”)。name()返回的字符串只是“”。我希望这不是Windows和标准C++都提供庞大,复杂和完全不兼容的设施的领域。 –

+0

我不确定,从来没有使用它,但http://en.cppreference.com/w/cpp/locale/locale/name似乎让我觉得它应该提供一些有用的东西。 – NeomerArcana

+1

@NeomerArcana在理论上应该是有用的。但理论上,理论和实践之间没有区别;-) – Christophe