19

Windows Vista 引入了三个伪语言环境的概念:

Pseudo Locale        Locale Name  LCID           
===================  ===========  ======
Base                 qps-ploc     0x0501
Mirrored             qps-mirr     0x09ff
East Asian-language  qps-asia     0x05fe

启用Base区域设置很有用,因为您可以检查您的应用程序是否使用当前区域设置来格式化日期、时间、数字、货币等项目。

例如,当当前语言环境设置为Base时,日期将被格式化为:

[Шěđлеśđαỳ !!!], 8 ōf [Μäŕςћ !!] ōf 2006

Windows 的构建实际上是用 pseudo 完成的,然后本地化为英文:

为全球市场设计 Windows 7

伪本地化

为了防止常见的全球化错误,创建了伪本地化构建。伪本地化是用人工语言创建本地化产品的过程。该语言与英语相同,只是每个字符都用不同的字符书写,在视觉上类似于英语字符。除了完全由机器生成之外,我们创建伪本地化构建的方式与创建本地化构建的方式完全相同。因为即使是单语的美国软件开发人员也可以阅读伪本地化文本,它已被证明是在开发周期早期发现全球化问题的绝佳方法。在 Windows 7 测试版中,一些 UI 元素仍处于其伪本地化形式,从而引发了一些关于其含义的有趣理论。我们希望我们已经通过这篇博文解决了这个谜团。:-)

伪定位控制面板

伪本地化 Windows 7 中的控制面板对话框

使用这些语言环境的另一个价值:它测试您的应用程序不假设 16 位PRIMARYLANGID由以下内容组成:

  • 8 位主要语言 ID
  • 8 位子语言 ID

实际上,PRIMARYLANGID 是

  • 一个 10 位的主要语言 ID
  • 一个 6 位的子语言 id

或以图形方式:

+-----------------------+-------------------------+
|     Sublanguage ID    |   Primary Language ID   |
+-----------------------+-------------------------+
 15                   10 9                       0   bit

这三个伪语言环境终于离开了第 8 位的末尾(微软已经厌倦了破坏有缺陷的应用程序)。

如何在 Windows 中启用伪语言环境?

也可以看看

4

4 回答 4

22

如何在 Windows 中启用伪语言环境?

最初,四个伪语言环境在控制面板中不可见archive.org

请注意,NLS 不会自动枚举伪语言环境或在控制面板的区域和语言选项部分中公开它们。只有在注册表中设置了值时,它们才是可枚举的。

您可以通过添加一些注册表项来启用它们:

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Nls\Locale]
"00000501"="1" // qps-ploc (Windows Vista and later)
"000005fe"="7" // qps-ploca (Windows Vista and later)
"00000901"="1" // qps-Latn-x-sh (Windows 10 and later)
"000009ff"="d" // qps-plocm (Windows Vista and later)

这可以在 RegEdit 中完成:

在此处输入图像描述

然后您可以转到控制面板中的区域和语言选项:

在此处输入图像描述

并选择伪语言环境:

在此处输入图像描述

三种不同的伪语言环境用于测试 3 种语言环境:

Baseqps-ploc语言环境用于类似英语的伪本地化。它的字符串是英文字符串的较长版本,使用非拉丁语和重音字符而不是普通脚本。此外,简单的拉丁字符串应该使用此语言环境以相反的顺序排序。

Mirrored qpa-mirr用于从右到左的伪数据,这是另一个值得测试的领域。

东亚语 qps-asia旨在利用大型 CJK 字符库,这对于测试也很有用。


警告:不要尝试更改“系统区域设置”

在此处输入图像描述

到一个新的伪语言环境:

在此处输入图像描述

否则重启后:

在此处输入图像描述

Windows 将无法启动:

在此处输入图像描述

唯一的解决办法是从故障恢复控制台手动编辑注册表;恢复旧的en-US语言环境。


警告

使用伪语言环境用于查找软件中的本地化错误。不幸的是,这也会让您在其他人的软件中发现错误;包括微软的:

  • SQL Server Management Studio 1在出现其他语言环境 ( Microsoft Connect ) 时崩溃:

    在此处输入图像描述
    在此处输入图像描述 在此处输入图像描述

  • Microsoft Excel 将不再允许您输入函数(用于分隔参数的逗号不再起作用)

  • Visual Studio 将不再允许您编辑逗号分隔的属性

  • SQL Server Management Studio 图表设计器报告错误

  • .NET 在日期和时间格式上有一个错误,显示22////11////2011 4::::42::::53 P̰̃M]

  • Windows 事件查看器:

    在此处输入图像描述

  • 任务调度器:

    在此处输入图像描述

  • SQL Server 管理工作室:

    在此处输入图像描述

祝微软能够测试他们自己的产品。

1 10.50.1617.0


2012 年 4 月 10 日更新:

尝试在 SQL Server Management Studio 中编辑表的前 200 行:

在此处输入图像描述

执行的 SQL 语句 SELECT TOP (200) ...
错误来源:Microsoft.SqlServer.Management.DataTools
错误消息:对象引用未设置为对象的实例

通过将负号符号从更改为--来修复-

奖金阅读

于 2011-08-12T16:02:13.407 回答
5

您还可以更改 Internet Explorer 的Accept-Languages请求qps-ploc语言:

在此处输入图像描述

您可以使用它来测试您的网站是否支持伪语言环境,并检查任何缺少的本地化:

在此处输入图像描述

您可以看到我在这个示例网站中遗漏了两段文字。

于 2011-10-06T13:44:18.113 回答
2

看起来微软没有修复 .NET、SQL Server、Excel 等中的本地化错误,而是更改了 Windows 10 中的伪语言环境以掩盖错误:

物品 Windows 7的 视窗 10
语言环境标识符 0x0501 (1281) 0x0501 (1281)
语言环境名称 qps-ploc qps-ploc
示例编号 --123,,4567,,8901 -123,,4567,,8901
示例货币 --$123,,4567,,8901..00 -$123,,4567,,8901.000
示例浮点数 --123,,4567,,8901..00 -123,,4567,,8901.000
示例日期 9//08//2015 2015 年 9 月 8 日
示例时间 9::51::17 АΜ 9:45:09
示例日期时间 9//08//2015 9::51::17 АΜ 2015 年 9 月 8 日 9:45
LOCALE_SLANGUAGE 伪语言(伪) 伪(伪)
LOCALE_SENGLANGUAGE 伪语言
LOCALE_SDECIMAL .. .
LOCALE_SCURRENCY $$ $
LOCALE_SMONDECIMALSEP .. .
LOCALE_SDATE // /
LOCALE_STIME ::
LOCALE_SSHORTDATE d//MM//yyyy 日/月/年
LOCALE_STIMEFORMAT h::mm::ss tt 高度:毫米:秒
LOCALE_ITIME 0 1
LOCALE_ICENTURY 1 0
LOCALE_SNEGATIVESIGN -- -

我可以理解不想修复你的错误,因为你很懒,这太难了。但是你应该被迫让所有人都看到你的耻辱。

相反,你逃避并试图隐藏你的失败。那很糟糕。

于 2015-08-09T18:37:06.607 回答
1

视窗 10 1803

不幸的是,从 Windows 10 1803 开始​​,似乎不再可以启用这些语言环境:

对于 Windows 10 版本 1803,像这样编辑 Windows 注册表无效。但是您仍然可以使用伪语言环境的名称调用非枚举 NLS API(参见上面的代码示例)来填充您的用户界面 (UI)。

根据Unable to use psuedo locales after 1803 Win 10 update archive

大家好,我打破了伪语言环境的枚举方式,我的错,对此非常抱歉:(

请注意,它们仍然可以工作,因为它们是 Windows 内置的,“只是”它们不会出现在枚举中 - 所以它们不会出现在下拉列表中 - 这使得它们使用起来有点棘手。我正在努力寻找解决方法。

基本上,如果您使用适当的伪语言环境从计算机复制计算机\HKEY_CURRENT_USER\Control Panel\International(不是子项)的注册表值,那么即使它没有被枚举,也应该用于进一步的进程。

肖恩·斯蒂尔 (MSFT)
[Шěđлеśđαỳ !!!],18 岁 [Јúłў !!] 2018 年

手动配置的注册表值

这是从 1607 系统导出的值。可以将它们放入.reg文件中以便于导入。

如果使用.reg文件,则需要以下标头:

Windows Registry Editor Version 5.00

伪(伪)[qps-ploc]

[HKEY_CURRENT_USER\Control Panel\International]
"Locale"="00000501"
"LocaleName"="qps-ploc"
"s1159"="АΜ"
"s2359"="P̰̃M]"
"sCountry"="Pseudo"
"sCurrency"="$"
"sDate"="/"
"sDecimal"="."
"sGrouping"="4;0"
"sLanguage"="ENU"
"sList"=",,"
"sLongDate"="dddd, d 'ōf' MMMM 'ōf' yyyy"
"sMonDecimalSep"="."
"sMonGrouping"="4;0"
"sMonThousandSep"=",,"
"sNativeDigits"="0123456789"
"sNegativeSign"="-"
"sPositiveSign"="++"
"sShortDate"="d/MM/yy"
"sThousand"=",,"
"sTime"=":"
"sTimeFormat"="H:mm:ss"
"sShortTime"="h:mm tt"
"sYearMonth"="MMMM yyyy"
"iCalendarType"="1"
"iCountry"="61"
"iCurrDigits"="3"
"iCurrency"="0"
"iDate"="1"
"iDigits"="3"
"NumShape"="1"
"iFirstDayOfWeek"="0"
"iFirstWeekOfYear"="0"
"iLZero"="1"
"iMeasure"="1"
"iNegCurr"="1"
"iNegNumber"="1"
"iPaperSize"="1"
"iTime"="1"
"iTimePrefix"="0"
"iTLZero"="0"

伪(伪亚洲)[qps-ploca]

[HKEY_CURRENT_USER\Control Panel\International]
"Locale"="000005FE"
"LocaleName"="qps-ploca"
"s1159"="午前"
"s2359"="午後"
"sCountry"="Pseudo Asia"
"sCurrency"="¥"
"sDate"="/"
"sDecimal"="."
"sGrouping"="3;0"
"sLanguage"="JPN"
"sList"=","
"sLongDate"="yyyy'年'M'月'd'日'"
"sMonDecimalSep"="."
"sMonGrouping"="3;0"
"sMonThousandSep"=","
"sNativeDigits"="0123456789"
"sNegativeSign"="-"
"sPositiveSign"=""
"sShortDate"="yyyy/MM/dd"
"sThousand"=","
"sTime"=":"
"sTimeFormat"="H:mm:ss"
"sShortTime"="H:mm"
"sYearMonth"="yyyy'年'M'月'"
"iCalendarType"="1"
"iCountry"="81"
"iCurrDigits"="0"
"iCurrency"="0"
"iDate"="2"
"iDigits"="2"
"NumShape"="1"
"iFirstDayOfWeek"="6"
"iFirstWeekOfYear"="0"
"iLZero"="1"
"iMeasure"="0"
"iNegCurr"="1"
"iNegNumber"="1"
"iPaperSize"="9"
"iTime"="1"
"iTimePrefix"="0"
"iTLZero"="0"

伪(伪镜像)[qps-plocm]

[HKEY_CURRENT_USER\Control Panel\International]
"Locale"="000009FF"
"LocaleName"="qps-plocm"
"s1159"="ص"
"s2359"="م"
"sCountry"="Pseudo Mirrored"
"sCurrency"="ر.س.‏"
"sDate"="/"
"sDecimal"="."
"sGrouping"="3;0"
"sLanguage"="ARA"
"sList"=";"
"sLongDate"="dd/MMMM/yyyy"
"sMonDecimalSep"="."
"sMonGrouping"="3;0"
"sMonThousandSep"=","
"sNativeDigits"="٠١٢٣٤٥٦٧٨٩"
"sNegativeSign"="-"
"sPositiveSign"=""
"sShortDate"="dd/MM/yy"
"sThousand"=","
"sTime"=":"
"sTimeFormat"="hh:mm:ss tt"
"sShortTime"="hh:mm tt"
"sYearMonth"="MMMM, yyyy"
"iCalendarType"="23"
"iCountry"="966"
"iCurrDigits"="2"
"iCurrency"="2"
"iDate"="1"
"iDigits"="2"
"NumShape"="0"
"iFirstDayOfWeek"="5"
"iFirstWeekOfYear"="0"
"iLZero"="1"
"iMeasure"="0"
"iNegCurr"="3"
"iNegNumber"="3"
"iPaperSize"="9"
"iTime"="0"
"iTimePrefix"="0"
"iTLZero"="1"

伪(伪 Selfhost)[qps-Latn-x-sh]

[HKEY_CURRENT_USER\Control Panel\International]
"Locale"="00000901"
"LocaleName"="qps-Latn-x-sh"
"s1159"="AM"
"s2359"="PM"
"sCountry"="Pseudo Selfhost"
"sCurrency"="J$"
"sDate"="/"
"sDecimal"="."
"sGrouping"="3;0"
"sLanguage"="ENJ"
"sList"=","
"sLongDate"="dd MMMM, yyyy"
"sMonDecimalSep"="."
"sMonGrouping"="3;0"
"sMonThousandSep"=","
"sNativeDigits"="0123456789"
"sNegativeSign"="-"
"sPositiveSign"=""
"sShortDate"="dd/MM/yyyy"
"sThousand"=","
"sTime"=":"
"sTimeFormat"="HH:mm:ss"
"sShortTime"="HH:mm"
"sYearMonth"="MMMM, yyyy"
"iCalendarType"="1"
"iCountry"="1"
"iCurrDigits"="2"
"iCurrency"="0"
"iDate"="1"
"iDigits"="2"
"NumShape"="1"
"iFirstDayOfWeek"="6"
"iFirstWeekOfYear"="0"
"iLZero"="1"
"iMeasure"="0"
"iNegCurr"="1"
"iNegNumber"="1"
"iPaperSize"="1"
"iTime"="1"
"iTimePrefix"="0"
"iTLZero"="1"
于 2020-06-09T03:09:13.540 回答