各国言語サポートのシステム・クラスの使用法
最新のアプリケーションは、余分なエンジニアリングなしにさまざまな言語や地域に適応できます。このプロセスはインターナショナライゼーションと呼ばれます。この目的のために、特定のコンポーネントを追加して、特定の地域や言語に対してアプリケーションを適応させるプロセスをローカライズといいます。
ユーザの言語、国、およびその他の特殊な可変情報を定義する一連のパラメータは、ロケールです。ロケールは、入力、出力、およびデータ処理に関する規約を指定します。これには以下が含まれます。
-
数の形式
-
日付と時刻の形式
-
通貨記号
-
文字のソート順
-
その他の文字セットへの文字列の自動変換
ロケールを指定する場合は、一般に、使用言語と地域 (あるいは他のバリエーション) を記述します。これらには、通常、ISO (International Standards Organization) の言語Opens in a new tabと地域Opens in a new tabの略称を指定します。例えば、en-us は米国で使用される英語を示し、en-gb は英国で使用される英語を示します。
1 つのミラーのすべてのメンバ上の InterSystems IRIS インスタンスは、同一のロケールと照合を持っている必要があります。詳細は、"高可用性ガイド" の “ミラーリング” の章を参照してください。
%SYS.NLS のクラス
InterSystems IRIS では、%SYS.NLS (NLS は各国言語サポートのことです) パッケージのクラスによるローカライズをサポートしています。これらのクラスには、インターナショナライズされたプログラムをその実行環境に適応させるために InterSystems IRIS が必要な情報が含まれます。このセクションでは、オプションを簡単に説明します。詳細は、各クラスのクラス・ドキュメントを参照してください。
これらのクラスを使用すると、システムまたはプロセスに現在設定されている値を取得できます。プロセスに関連付けられている値を変更すると、その変更は直ちに反映されます。システム設定を変更するには、アプリケーションで適切な値を指定して新しいロケールを定義し、そのロケールを使用して起動するよう InterSystems IRIS に指示する必要があります。
%SYS.NLS.Locale
%SYS.NLS.LocaleOpens in a new tab のプロパティには、参照が必要になる場合がある現在のロケールに関する情報があります。これらの値を変更しても、システムの動作には影響しません。
%SYS.NLS.Device
%SYS.NLS.DeviceOpens in a new tab クラスには、現在のデバイスのプロパティの一部が格納されます。ただし、対象となるデバイスが、オブジェクトをインスタンス化した際に使用していたデバイスであるとは限りません。
一般に、デバイスのプロパティは、そのデバイスが開いたときに設定されます。これにより正しい変換の使用が保証されます。変換テーブルは、デバイスが開いた後に変更することもできます。それには、このクラスのプロセス・インスタンスの XLTTable プロパティを変更しますが、明確な理由がない限り、このプロパティを変更することはお勧めできません。
%SYS.NLS.DeviceOpens in a new tab にある他のプロパティにより、変換中に発生したエラーを処理できます。既定では、現在のテーブルで文字を処理できない場合、エラーはトリガされず、問題の発生した文字が疑問符 (?) に変換されます。置換値または置換文字列と呼ばれるこの文字は、他の任意の文字列に変換できます。さらに、未定義の文字を暗黙的に変換する代わりに、エラーを発行させることもできます。この動作は 既定のアクション と呼ばれ、以下から選択できます。
-
0 — エラー生成
-
1 — 変換不能な文字を置換値に置換
-
2 — エラーを無視して変換不能な文字を渡す
このクラスのプロパティの入力および出力処理には、それぞれ次のような個別のプロパティがあります。
-
InpDefaultAction
-
InpReplacementValue
-
OutDefaultAction
-
OutReplacementValue
%SYS.NLS.Format
%SYS.NLS.FormatOpens in a new tab クラスには、$ZDATE() や関連する関数の動作に影響を与えるプロパティがあります。これらのプロパティの値は、現在のロケールに定義されている値から継承されますが、他のユーザに影響を与えずにプロセス・レベルで変更することも可能です。例えば、DateSeparator および TimeSeparator プロパティにはそれぞれ、日付項目と時間項目を区切る文字が保持されます。
これらの値を変更した場合の影響については、$ZDATE、$ZDATEH、および $FNUMBER のドキュメントの説明を参照してください。
%SYS.NLS.FormatOpens in a new tab クラスの Locale プロパティでは、現在のプロセスでの値の “外観” を制御できます。以下はその例です。
-
Locale が空の文字列の場合は、システムの既定の形式 (通常はアメリカ英語) が適用されます。
-
Locale がロケール名 (rusw や csy8 など) の場合は、指定したロケールの形式を使用します。
-
Locale が Current の場合は、システムの形式を使用します。
このプロパティは、オブジェクトをインスタンス化した後、または以下のように目的のロケールを %New() メソッドに渡すことにより変更できます。
Set fmt = ##class(%SYS.NLS.Format).%New("jpnw")
これらの変更は、現在のプロセスにのみ影響します。
%SYS.NLS.Table
%SYS.NLS.TableOpens in a new tab クラスは、システムの既定を示すオブジェクトや、テーブルのさまざまなカテゴリに対するプロセスの現在の設定を示すオブジェクトをインスタンス化します。NLS の基本的なメカニズムであるテーブルでは、アプリケーション・データを入力として受け入れ、順序付けして、指定のロケールに適した形式で表示することができます。%SYS.NLS.LocaleOpens in a new tab では、システム・オブジェクトのプロパティを変更してもシステムに影響を与えません。ただし、プロセス・オブジェクトからプロパティを変更すると、関連付けられている動作が直ちに変更されます。
NLS のテーブルは、入出力テーブルと内部テーブルに分類できます。各テーブル・タイプには、以下に示すような、独自の関連データがあります。
入出力テーブル (変換テーブルとも呼ばれる) は、システムが稼働する現在のロケールでサポートされている基本文字セットと、InterSystems IRIS 以外のエンティティでサポートされている他言語文字セットを変換します。例えば、ロケールの文字セットが Latin2 (より正確には ISO 8859-2) で、他言語文字セットが、ターミナルとの通信に一般に使用される UTF-8 だとします。この場合、出力には Latin2–to-UTF8 (Latin2 を UTF8 へ変換する) などのテーブルが使用され、入力には UTF8–to-Latin2 (UTF8 を Latin2 へ変換する) などの逆マッピング・テーブルが必要になります。
ここでは (入力用と出力用に) 2 つのテーブルを使用していますが、通常、これらのテーブルは互いを補完します。InterSystems IRIS では、処理を簡潔にするため、ロケール定義とシステムの既定については、1 組みの入出力テーブルに対して 1 つの名前を使用します。この名前には、通常、他言語文字セットの名前が使用されますが、暗黙の前提として、もう 1 つの名前はロケールの文字セットを使用した名前になります。ただし、カスタム・テーブルを作成する場合は、変換が行われることを示す任意の名前を選択することができます。
入出力テーブルはデバイスで使用されます。この場合、デバイスという単語は、InterSystems IRIS が外部とやり取りするインタフェースを示します。プロセス・インタフェースとシステム呼び出しインタフェースを含めて、このインタフェースでは変換が必要になります。
-
ターミナル
-
その他のターミナル接続
-
外部ファイル
-
TCP/IP 接続
-
プリンタ
-
InterSystems IRIS プロセス
-
システム呼び出し
詳細は、リファレンス・ページの "変換テーブル" を参照してください。
内部テーブルでも、現在のロケールの文字セットで構成される文字列を他の値にマップしますが、このテーブルは外部との通信を目的とはしていません。内部テーブルは、以下の文字を識別します。
-
パターン・マッチング
文字、数字、句読点など、特定のパターン・コードに一致する文字を識別します。
-
識別子
識別子テーブルは、識別子に使用できる文字を指定します。
-
大文字のアルファベット、小文字のアルファベット、およびタイトルで使用される大文字。
これらは構造的に入出力テーブルと似ています。このテーブルは、ある 1 つの文字セットを、偶然同じである別の文字セットにマップします。ただし、これらのテーブルは、入出力処理ではなく、$ZCONVERT() のコンテキストで使用されます。
-
照合順序
これらのテーブルは、ある文字列を、グローバル添え字での使用に適したその文字列の内部表現にマップします。言語が異なれば、ディクショナリ順序での照合ルールは異なります。これらのルールは照合テーブルにカプセル化されています。
-
$X/$Y アクション
これらのテーブルでは、文字を、特殊変数 $X および $Y とどのように関係するのかを示す値にマップします。文字を出力した後に $X および $Y を増分するのか、文字を印刷可能にするかどうかなど、$X/$Y テーブルにはこれらの答えが含まれます。
InterSystems IRIS のすべてのバージョンで使用可能な照合のリストは固定されています。既存の照合がニーズに適合しない場合は、インターシステムズのサポート窓口Opens in a new tabまでお問い合わせください。
%SYS.NLS の使用例
これらの例はすべて実行可能ですが、いずれの例にも [実行する] ボタンはありません。これらは現在のロケールに対するプロセス既定値を操作するからです。また、多くが管理特権や %SYS ネームスペースへの書き込みアクセス権を必要とします。これらの例を実行する場合は、インターシステムズのターミナル機能 (Windows) や TCP/IP 接続を介して、かつ適切な特権を持ったユーザとして、別のプロセスで実行してください。
現在のロケール情報の表示
この例では、現在のシステム・ロケールに関する情報が表示されます。
Set Info = ##class(%SYS.NLS.Locale).%New()
Set Items = "Name" _
"/Description" _
"/Country" _
"/CountryAbbr" _
"/Language" _
"/LanguageAbbr" _
"/Currency" _
"/CharacterSet"
Write !
For i = 1 : 1 : $LENGTH(Items, "/")
{
Set Item = $PIECE(Items, "/", i)
Write $JUSTIFY(Item, 15),": ", $PROPERTY(Info, Item), !
}
システムおよびプロセス・テーブル・データの表示
この例を実行する前に一部のプロパティが外部で変更されている場合を除き、この例では、システム・テーブルとプロセス・テーブルに同じ値が表示されます。
Set IOTables = "Process" _
"/IRISTerminal" _
"/OtherTerminal" _
"/File" _
"/TCPIP" _
"/SystemCall" _
"/Printer"
Set IntTables = "PatternMatch" _
"/Identifier" _
"/Uppercase" _
"/Lowercase" _
"/Titlecase" _
"/Collation" _
"/XYAction"
// iterate over the systems, and then the process data
For Type = "System", "Process"
{
Write !
Set Table = ##class(%SYS.NLS.Table).%New(Type)
Write "Type: ", Type, !
Write "I/O Tables", !
For i = 1 : 1 : $LENGTH(IOTables, "/")
{
Set PropName = $PIECE(IOTables, "/", i)
Write $JUSTIFY(PropName, 15), ": ", $PROPERTY(Table, PropName), !
}
Write "Internal Tables", !
For i = 1 : 1 : $LENGTH(IntTables, "/")
{
Set PropName = $PIECE(IntTables, "/", i)
Write $JUSTIFY(PropName, 15), ": ", $PROPERTY(Table, PropName), !
}
}
日付と時刻の表示の変更
%SYS.NLS.FormatOpens in a new tab クラスには、例えば日付項目と時間項目を区切る文字をそれぞれに保持する、DateSeparator および TimeSeparator プロパティが含まれます。米国の既定のロケールである enu8 (Unicode システムでは enuw) では、これらはそれぞれ、スラッシュ文字 (/) とコロン (:) になります。これらの変更方法について以下に例を示します。
// display the current defaults
// date is 10 April 2005
// time is 6 minutes 40 seconds after 11 in the morning
Write $ZDATE("60000,40000"), !
// now change the separators and display it again
Set fmt = ##class(%SYS.NLS.Format).%New()
Set fmt.DateSeparator = "_"
Set fmt.TimeSeparator = "^"
Write !, $ZDATE("60000,40000")
以下に示すこの例では、月の名前がアルファベットの連続する文字に変換されます (デモンストレーション用)。このためには、MonthName プロパティに、スペースで区切った月名一覧を設定します。リストの先頭文字はスペースです。
// get the format class instance
Set fmt = ##class(%SYS.NLS.Format).%New()
// define the month names
Set Names = " AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK LLL"
Set fmt.MonthAbbr = Names
Set rtn = ##class(%SYS.NLS.Format).SetFormatItem("DATEFORMAT", 2)
// show the result
Write $ZDATE(60000, 2)
数字の表示方法の変更
%SYS.NLS.FormatOpens in a new tab 内の一部のプロパティは、$Number() が数字を解釈する方法を制御します。英語のロケールでは、整数と小数点以下の数字の区切りに小数点が使用され、数字を 3 桁ずつ区切るためにコンマが使用されています。これも変更可能です。
// give the baseline display
Write $Number("123,456.78"), !
Set fmt = ##class(%SYS.NLS.Format).%New()
// use "/" for groups of digits
Set fmt.NumericGroupSeparator = "."
// group digits in blocks of 4
Set fmt.NumericGroupSize = 4
// use ":" for separating integer and fractional parts
Set fmt.DecimalSeparator = ","
// try interpreting again
Write $Number("12.3456,78"), !
ファイルの変換の設定
以下の例は、ファイルに書き込まれたデータ表現をアプリケーションで制御しています。
// show the process default translation (RAW, no translation performed)
Set Tbl = ##class(%SYS.NLS.Table).%New("Process")
Write "Process default translation: ", Tbl.File, !
// create and open a temporary file
// use XML for the translation
Set TempName = ##class(%Library.File).TempFilename("log")
Set TempFile = ##class(%Library.File).%New(TempName)
Do TempFile.Open("WSNK\XML\")
Write "Temp file: ", TempFile.CanonicalNameGet(), !
// write a few characters to show the translation
// then close it
Do TempFile.WriteLine(("--" _ $CHAR(38) _ "--"))
Do TempFile.Close()
// now re-open it in raw mode and show content
Do TempFile.Open("RSK\RAW\")
Do TempFile.Rewind()
Set MaxChars = 50
Set Line = TempFile.Read(.MaxChars)
Write "Contents: """, Line, """", !
// finish
Do TempFile.Close()
Do ##class(%Library.File).Delete(TempName)
Set TempFile = ""
変換テーブルの詳細は、$ZCONVERT 関数のドキュメントにある “3 つのパラメータ形式 : エンコード変換” のセクションを参照してください。
Config.NLS クラス
%SYS.NLS はあらゆる場所で使用可能であり、一般的な使用を目的としていますが、これとは対照的に、Config.NLS のクラスは、%SYS ネームスペースでのみ、管理者権限を持っているユーザのみが使用できます。通常、カスタムのロケールおよびテーブルを作成する必要がある管理者は、管理ポータルで NLS ページを使用します。特別な要求を持つユーザを除いては、Config.NLS を使用する必要はありません。
Config.NLS パッケージには、以下の 3 つのクラスがあります。
-
Locales – 国または地理的地域に対するすべての定義および既定値を格納します。
-
Tables – テーブルに関する高レベルの説明を格納しますが、マッピング自体は格納しません。
-
SubTables – 固有の文字のマッピングを格納します。複数のテーブルで共有することができます。
Tables クラスと SubTables クラスが分かれている主な理由は、データの重複を避けるためです。異なる文字セットに対する Tables が、同一のマッピングを共有する (したがって、同一の SubTable を共有する) こともあります。また、Tables のクラスでは既定のアクションと置換値を定義します (上記の %SYS.NLS 内のこれらのプロパティに関する説明を参照)。したがって、別個の Tables が、同一の SubTable を共有している場合でも、これらの属性が異なっている場合があります。このような柔軟性があるため、Tables と SubTables の間の関係を適切に管理することは多少複雑になりますが、メリットも大きいので無駄ではありません。すべてのハウスキーピング処理が行われている管理ポータルと %SYS.NLS クラスでは、Tables と SubTables が分かれていることはユーザからはわかりません。ただし、Config.NLS を使用する際には、これを明示的に行う必要があります。
ユーザ定義のロケールおよびテーブルの名前付け規約
カスタム項目とシステム項目とを区別して、アップグレードを簡単にするには、項目名の先頭に y を使用します。例えば、XLT-yEBCDIC-Latin1 や XLT-Latin1-yEBCDIC のようにします。
この規約に準拠しないユーザ定義のテーブル、サブテーブルおよびロケールは、システムのアップグレード時に削除される場合があります。これを避けるには、ユーザ定義のテーブルとロケールを XML ファイルにエクスポートし、アップグレード後に再インポートします。
インターシステムズの SubTable をコピーして、カスタムの SubTable を作成した場合、このタスクを実行するユーティリティは、自動的に同じ名前を使用し、数字の接尾辞を付加します。したがって、Latin2-to-Unicode SubTable のコピーの名前は、XLT-Latin2-Unicode.0001 および XLT-Unicode-Latin2.0001 のようになります。
Config.NLS の使用の例
このセクションでは、以下の例について説明します。
使用可能なロケールのリスト
この例では、Config.NLS.LocalesOpens in a new tab の List() クラス・クエリを使用し、使用可能なロケール識別子と説明のリストを表示します。
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}
特定のロケールのテーブルのリスト
以下の例では、米国の英語 (使用可能な場合) に対する Unicode ロケールを構成するテーブルを示します。
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))
}
カスタム・ロケールの作成
この例では、カスタム・テーブルでカスタム・ロケールを作成するためのテンプレートを提供します。このカスタム・テーブルでは、EBCDIC (米国で使用される一般的な形式) と Latin-1 (ISO-8859–1) の間の変換を実行します。詳細は、各クラスのドキュメントを参照してください。
その他のすべてのテーブルについては、最初に、文字のマッピングの定義を取得する必要があります。この例では、http://source.icu-project.orgOpens in a new tab (International Components for Unicode) の Web サイトのデータ・ファイルを使用します。該当するデータ・ファイルOpens in a new tabは、シャープ記号 (#) で始まるコメント行の後に、以下の形式の一連の変換定義行が続く、テキスト・ファイルです。
<Uuuuu> \xee |0
ファイルの抜粋を以下に示します。
# #UNICODE EBCDIC_US #_______ _________ <U0000> \x00 |0 <U0001> \x01 |0 <U0002> \x02 |0 <U0003> \x03 |0 <U0004> \x37 |0 <U0005> \x2D |0 ...
これらの行では、Unicode 文字 Uaaaa が EBCDIC 文字の \xbb にマッピングされることを示しています (ここで aaaa および bb は 16 進数の表現です)。このテーブルは逆変換が可能であり、EBCDIC 文字の \xbb を Unicode 文字の Uaaaa に再マッピングすることができると仮定しています。これにより、1 回のスキャンで、同じデータ・ファイルから両側 (つまり EBCDIC-to-Latin1 および Latin1-to-EBCDIC) を作成することができます。Unicode の範囲は 0 ~ 255 のみなので、これは実際には Latin-1 テーブルになります。
このプロセスでは、最初に SubTable オブジェクトを作成し、次に Table を作成し、最後に Locale を作成します。最初の手順として、このプロセスでは 2 つの SubTables オブジェクトを作成し、Name および Type プロパティを初期化して、定義ファイルから読み込んだデータで FromTo マッピング配列を埋めます。
SubTable の名前の形式は、Type–FromEncoding–ToEncoding です。通常の I/O 変換の Type は "XLT" であるので、SubTable の名前は XLT-yEBCDIC-Latin1 および XLT-yLatin1-EBCDIC になります。
以下のコードで SubTables オブジェクトを作成します。わかりやすくするために、ここでは省略していますが、実際のプログラムでは、何度もコードの整合性チェックが行われます。この例では、このサンプル・コードを何度も実行できるように、既存の以前のバージョンの同じオブジェクト (SubTables、Tables および Locales) を削除しています。厳密には、クラス・メソッド Exists() を使用して以前のオブジェクトの存在をチェックし、既に存在する場合は、別の処理を実行する必要があります。
// Names for the new SubTables (save for later)
Set nam1 = "XLT-Latin1-yEBCDIC"
Set nam2 = "XLT-yEBCDIC-Latin1"
// Delete existing SubTables instances with same ids
Do ##class(Config.NLS.SubTables).Delete(nam1)
Do ##class(Config.NLS.SubTables).Delete(nam2)
// Create two SubTable objects
Set sub1 = ##class(Config.NLS.SubTables).%New()
Set sub2 = ##class(Config.NLS.SubTables).%New()
// Set Name and Description
Set sub1.Name = nam1
Set sub1.Description = "ICU Latin-1->EBCDIC sub-table"
Set sub2.Name = nam2
Set sub2.Description = "ICU EBCDIC ->Latin-1 sub-table"
SubTables には、マルチバイトの変換を実行するかどうかを示す小さな整数である、type プロパティが含まれます。この例では、type は、シングルバイト・マッピングを示す 0 に設定されています。データ・ファイルに定義されていないコード・ポイント (文字) がそれ自体にマッピングされるように、このマッピングは初期化されています。
// Set Type (single-to-single)
Set sub1.Type = 0
Set sub2.Type = 0
// Initialize FromTo arrays
For i = 0 : 1 : 255
{
Do sub1.FromTo.SetAt(i, i)
Do sub2.FromTo.SetAt(i, i)
}
次に、アプリケーションがファイルを読み込みます。ファイルの定義が、既定のマッピングとして設定された定義をオーバーライドします。$ZHEX() 関数により、コードが 16 進数から 10 進数に変換されます。
// Assume file is in the mgr directory
Set file = "glibc-EBCDIC_US-2.1.2.ucm"
// Set EOF exit trap
Set $ZTRAP = "EOF"
// Make that file the default device
Open file
Use file
For
{
Read x
If x?1"<U"4AN1">".E
{
Set uni = $ZHEX($E(x,3,6)),ebcdic = $ZHEX($E(x,12,13))
Do sub1.FromTo.SetAt(ebcdic,uni)
Do sub2.FromTo.SetAt(uni,ebcdic)
}
}
EOF // No further data
Set $ZT = ""
Close file
// Save SubTable objects
Do sub1.%Save()
Do sub2.%Save()
これで文字のマッピングは完了です。次に、定義したばかりの SubTables オブジェクトを参照する Table オブジェクトを作成します。Table オブジェクトは実際には SubTables の記述子であり、プロパティはわずかしかありません。以下のコードによって、この 2 つが関連付けられます。
// Delete existing Tables instances with same ids
Do ##class(Config.NLS.SubTables).Delete("XLT", "Latin1", "yEBCDIC")
Do ##class(Config.NLS.SubTables).Delete("XLT", "yEBCDIC", "Latin1")
// Create two Table objects
Set tab1 = ##class(Config.NLS.Tables).%New()
Set tab2 = ##class(Config.NLS.Tables).%New()
// Set description
Set tab1.Description = "ICU loaded Latin-1 -> EBCDIC table"
Set tab2.Description = "ICU generated EBCDIC -> Latin-1 table"
// Set From/To encodings
Set tab1.NameFrom = "Latin1"
Set tab1.NameTo = "yEBCDIC"
Set tab2.NameFrom = "yEBCDIC"
Set tab2.NameTo = "Latin1"
// Set SubTable
Set tab1.SubTableName = nam1
Set tab2.SubTableName = nam2
// Set Type
Set tab1.Type = "XLT"
Set tab2.Type = "XLT"
// Set Default Action
// 1 = Replace with replacement value
Set tab1.XLTDefaultAction = 1
Set tab2.XLTDefaultAction = 1
// Set Replacement value of "?"
Set tab1.XLTReplacementValue = $ASCII("?")
Set tab2.XLTReplacementValue = $ASCII("?")
// Set Reversibility
// 1 = Reversible
// 2 = Generated
Set tab1.XLTReversibility = 1
Set tab2.XLTReversibility = 2
// Set Translation Type
// 0 = non-modal to non-modal
Set tab1.XLTType = 0
Set tab2.XLTType = 0
// Save Table objects
Do tab1.%Save()
Do tab2.%Save()
Tables が定義されたら、構築の最後の手順として、新しいテーブルを組み込むロケール・オブジェクトの定義を行います。アプリケーションで、空の Locale オブジェクトを作成し、各プロパティを埋め込みます。これは、Tables および SubTables の場合と同様です。ただし、Locale の場合はより大きく複雑です。このような単純な変更を行う最も簡単な方法は、既存のロケールをコピーして、必要箇所のみを変更することです。このプロセスでは、ソース・ロケールとして enu8 を使用し、yen8 という新しい名前を付けます。イニシャル y によって、これがカスタム・ロケールであることが明確になり、アップグレード時に削除されなくなります。
// Delete existing Locales instance with the same id
Do ##class(Config.NLS.Locales).Delete("yen8")
// Open source locale
Set oldloc = ##class(Config.NLS.Locales).%OpenId("enu8")
// Create clone
Set newloc = oldloc.%ConstructClone()
// Set new Name and Description
Set newloc.Name = "yen8"
Set newloc.Description = "New locale with EBCDIC table"
ロケールが適切に設定されると、プロセスでは、起動時にロードされる I/O テーブルのリストに EBCDIC テーブルを追加します。これは、以下のように、配列プロパティ XLTTables にノードを挿入することによって行われます。
XLTTables(<TableName>) = <components>
-
tableName により、このロケールの入力テーブルと出力テーブルのペアが特定されます。
この名前は y で始まる必要はないので、EBCDIC を使用します。
-
components は、以下のような 4 項目のリストです。
-
入力 “From” のエンコーディング
-
入力 “To” のエンコーディング
-
出力 “From” のエンコーディング
-
出力 “To” のエンコーディング
-
以下のコードで、使用可能なロケールのリストにテーブルを追加します。
// Add new table to locale
Set component = $LISTBUILD("yEBCDIC", "Latin1", "Latin1", "yEBCDIC")
Do newloc.XLTTables.SetAt(component, "EBCDIC")
InterSystems IRIS でロケールを使用できるようにするには、その内部形式にコンパイルする必要があります。これは、ロケールの検証と呼ばれることもあります。IsValid() クラス・メソッドは、詳細な分析を行い、ロケールが適切に定義されていない場合、人間が読むことのできるメッセージと共に、2 つの配列を返します。1 つはエラーの配列、もう 1 つは警告の配列です。
// Check locale consistency
If '##class(Config.NLS.Locales).IsValid("yen8", .Errors, .Warns)
{
Write !,"Errors: "
ZWrite Errors
Write !,"Warnings: "
ZWrite Warns
Quit
}
// Compile new locale
Set status = ##class(Config.NLS.Locales).Compile("yen8")
If (##class(%SYSTEM.Status).IsError(status))
{
Do $System.OBJ.DisplayError(status)
}
Else
{
Write !,"Locale yen8 successfully created."
}
%Library.GlobalEdit の使用によるグローバルの照合の設定
新規に作成された InterSystems IRIS グローバルの照合は、グローバルが作成されたデータベースの既定の照合に自動的に設定されます。InterSystems IRIS のインストールにより作成されたデータベースはすべて InterSystems IRIS 標準の照合に設定されます。ただし、USER は InterSystems IRIS と共にインストールされるロケールの既定の照合に設定されます
データベースの作成後、プロパティを編集してデータベースの既定の照合を変更することができます。InterSystems IRIS 標準、ロケールの既定の照合、またはインスタンスにロードされたその他の照合が選択可能です。データベースの既定の照合が一度設定されると、このデータベースで作成されたすべてのグローバルは、この既定の照合で作成されます。
また、InterSystems IRIS では、この動作をオーバーライドしてグローバルのカスタム照合を指定することもできます。これを行うには、%Library.GlobalEditOpens in a new tab クラスの Create() メソッドを使用して、希望の照合を指定します。
Set sc = ##class(%Library.GlobalEdit).Create(ns,
global,
collation,
growthblk,
ptrblock,
keep,
journal,
.exists)
以下はその説明です。
-
ns — ネームスペースを指定します。"" は現在のネームスペースを示し、^^directoryname は特定のディレクトリを参照します。
-
global — ^cz2 などの、先頭に ^ を含むグローバル名を指定します。
-
collation — 照合を指定します。照合は、サポート対象の照合のうちのどれか 1 つです。
-
growthblk — データの開始ブロックを指定します。
-
ptrblk — ポインタの開始ブロックを指定します。
-
keep — グローバルが削除されるときに、グローバルのディレクトリ・エントリを保持するかどうかを指定します。1 に設定すると、グローバルが削除されるときに照合、保護、およびジャーナル属性を保持します。
-
journal — この引数は関係がなくなったので、無視されます。
-
exists — グローバルが既に存在するかどうかを示す変数を、参照によって指定します。
グローバルが他のグローバルとは異なる照合を必要とする環境では、データベースを異なる照合ごとに設定し、グローバル・マッピングをネームスペースに追加して、各グローバルを必要な照合を持つデータベースにマップすることをお勧めします。このメソッドによって、特別に Create() メソッド呼び出しを使用したアプリケーション・コードを変更することなく、照合を混合して使用することができます。
サポート対象の照合
以下は、CreateGlobal^%DM サブルーチンの collation 引数で使用される、InterSystems IRIS でサポートされている照合です。
-
5 — InterSystems IRIS 標準
-
10 — German1
-
11 — Portuguese1
-
12 — Polish1
-
13 — German2
-
14 — Spanish1
-
15 — Danish1
-
16 — Cyrillic1
-
17 — Greek1
-
18 — Czech1
-
19 — Czech2
-
20 — Portuguese2
-
21 — Finnish1
-
23 — Cyrillic2
-
24 — Polish2
-
27 — French1
-
28 — Finnish2
-
29 — Hungarian1
-
30 — German3
-
31 — Polish3
-
32 — Spanish2
-
33 — Danish2
-
34 — Greek2
-
35 — Finnish3
-
36 — Lithuanian1
-
41 — Danish3
-
44 — Czech3
-
45 — Hungarian2
-
47 — Spanish3
-
49 — Spanish4
-
51 — Spanish5
-
52 — Finnish4
インスタンスにロードされた照合など、類似したリストを参照するには、ターミナル・ウィンドウを開き、%SYS% ネームスペースに変更して、DO ^COLLATE.コマンドを入力します。
インストール済みロケールの既定の照合
InterSystems IRIS の新規インストールのロケールでは、既定の照合は常に最新バージョンの照合です。つまり、数字の接尾語が最も大きい値のものになります (前のセクションのリスト参照)。例えば、スペイン語ロケールをインストールした場合、既定の照合は Spanish5 となります。照合の古いバージョンは既存のデータベースとの互換性のためにサポートされています。
InterSystems IRIS インスタンスがアップグレードされた場合、既定の照合は、更新済みロケールが新しい既定を使用しても保持されます。例えば、既存のインスタンスのロケールが既定の照合として Finnish3 を使用しており、更新済みインスタンスが Finnish4 を使用する場合、アップグレードは Finnish3 を既定として保存しますが、新規グローバルおよびデータベース用に Finnish4 を使用可能にします。