第五章 使用系统类提供国家语言支持 - Config.NLS
类
Config.NLS
类
与随处可用且用于一般用途的 %SYS.NLS
不同,Config.NLS
中的类只能在 %SYS
命名空间中使用,并且只能由具有管理权限的用户使用。通常,需要创建自定义区域设置和表格的管理员会使用管理门户中的 NLS
页面。只有具有非常特殊要求的用户才需要使用 Config.NLS。
Config.NLS
包中包含三个类:
-
Locales
——包含一个国家或地理区域的所有定义和默认值。 -
Tables
——包含表的高级描述,但不包含映射本身。 -
SubTables
——包含适当的字符映射,可以由多个表共享。
使用单独的 Tables
和 SubTables
类的主要原因是为了避免数据重复。不同字符集的表可能会共享相同的映射,从而共享相同的子表。此外,表中的类定义了默认操作和替换值(请参阅上面 %SYS.NLS
中对这些属性的描述)。因此,即使它们共享同一个子表,也可能有单独的表,其中这些属性不同。这种灵活性在管理表和子表之间的正确关系方面增加了一些复杂性,但这样做的好处是值得的。表与子表的分离在管理门户和 %SYS.NLS
类中对用户隐藏,所有的内务处理都在这里完成。然而,当使用 Config.NLS
时,这需要明确地完成。
命名用户定义的语言环境和表的约定
为了区分自定义项目和系统项目,并简化升级,请在项目名称的开头使用 y
;例如:XLT-yEBCDIC-Latin1
和 XLT-Latin1-yEBCDIC
。
注意:不遵循此约定的用户定义表、子表和区域设置可能会在系统升级期间被删除。避免这种情况的方法是将用户定义的表和区域设置导出到 XML
文件,并在升级后重新导入它们。
当从某个子表的副本创建自定义子表时,执行此任务的实用程序会自动使用相同的名称并附加一个数字后缀。因此,Latin2-to-Unicode
子表的副本将被命名为 XLT-Latin2-Unicode.0001
和 XLT-Unicode-Latin2.0001
,等等。
使用 Config.NLS
的示例
列出可用的语言环境
new $namespace
set $namespace="%SYS"
set stmt=##class(%SQL.Statement).%New()
set status=stmt.%PrepareClassQuery("Config.NLS.Locales","List")
if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}
set locales=stmt.%Execute("*")
if (locales.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", locales.%SQLCODE, ": ", locales.%Message quit}
while locales.%Next()
{
write locales.%Get("Name"), " - ", locales.%Get("Description"), !
}
if (locales.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", locales.%SQLCODE, ": ", locales.%Message quit}
列出特定语言环境中的表
new $namespace
set $namespace="%SYS"
// establish the locale identifier, try
// United States - English - Unicode
// United States - English - 8-bit
Set Loc = "enuw"
Do ##class(Config.NLS.Locales).Exists(Loc, .Ref, .Code)
If (##class(%SYSTEM.Status).IsError(Code))
{
Set Loc = "enu8"
Do ##class(Config.NLS.Locales).Exists(Loc, .Ref, .Code)
If (##class(%SYSTEM.Status).IsError(Code))
{
Do ##class(%SYSTEM.Status).DisplayError(Code)
Quit
}
}
// get the local array of table names
Write "Tables for locale: ", Loc, !
Do Ref.GetTables(.Tables)
Set Type = $ORDER(Tables(""))
While (Type '= "")
{
Set Name = $ORDER(Tables(Type, ""))
While (Name '= "")
{
Set Mod = $ORDER(Tables(Type, Name, ""))
While (Mod '= "")
{
Write Type, " - ", Name, " - ", Mod, !
Set Mod = $ORDER(Tables(Type, Name, Mod))
}
Set Name = $ORDER(Tables(Type, Name))
}
Set Type = $ORDER(Tables(Type))
}
网友评论