美文网首页收藏
第五章 使用系统类提供国家语言支持 - Config.NLS 类

第五章 使用系统类提供国家语言支持 - Config.NLS 类

作者: Cache技术分享 | 来源:发表于2023-03-03 15:18 被阅读0次

第五章 使用系统类提供国家语言支持 - Config.NLS

Config.NLS

与随处可用且用于一般用途的 %SYS.NLS 不同,Config.NLS 中的类只能在 %SYS 命名空间中使用,并且只能由具有管理权限的用户使用。通常,需要创建自定义区域设置和表格的管理员会使用管理门户中的 NLS 页面。只有具有非常特殊要求的用户才需要使用 Config.NLS。

Config.NLS 包中包含三个类:

  • Locales——包含一个国家或地理区域的所有定义和默认值。
  • Tables——包含表的高级描述,但不包含映射本身。
  • SubTables——包含适当的字符映射,可以由多个表共享。

使用单独的 TablesSubTables 类的主要原因是为了避免数据重复。不同字符集的表可能会共享相同的映射,从而共享相同的子表。此外,表中的类定义了默认操作和替换值(请参阅上面 %SYS.NLS 中对这些属性的描述)。因此,即使它们共享同一个子表,也可能有单独的表,其中这些属性不同。这种灵活性在管理表和子表之间的正确关系方面增加了一些复杂性,但这样做的好处是值得的。表与子表的分离在管理门户和 %SYS.NLS 类中对用户隐藏,所有的内务处理都在这里完成。然而,当使用 Config.NLS 时,这需要明确地完成。

命名用户定义的语言环境和表的约定

为了区分自定义项目和系统项目,并简化升级,请在项目名称的开头使用 y;例如:XLT-yEBCDIC-Latin1XLT-Latin1-yEBCDIC

注意:不遵循此约定的用户定义表、子表和区域设置可能会在系统升级期间被删除。避免这种情况的方法是将用户定义的表和区域设置导出到 XML 文件,并在升级后重新导入它们。

当从某个子表的副本创建自定义子表时,执行此任务的实用程序会自动使用相同的名称并附加一个数字后缀。因此,Latin2-to-Unicode 子表的副本将被命名为 XLT-Latin2-Unicode.0001XLT-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))
  }

相关文章

网友评论

    本文标题:第五章 使用系统类提供国家语言支持 - Config.NLS 类

    本文链接:https://www.haomeiwen.com/subject/ixteldtx.html