国際化

1. 定義の多言語化

iPLAssの各種定義の内、ブラウザに表示される内容については、ユーザーの言語に合わせて表示する言語を切り替えることができます。 切り替えが可能な言語の種類はテナントの多言語設定に依存します。

1.1. 項目の多言語設定

各種定義の表示名といったラベル項目は、デフォルトのラベルの他に言語毎のラベルを設定できます。 設定可能な項目の場合、以下のように「Languages」ボタンが表示されます。

definition label button

クリックすると以下のダイアログが表示されます。 右上のボタンで言語毎のラベル設定の追加・削除ができます。 表をダブルクリックすると編集モードになり、言語の選択と文言の設定ができます。

definition label dialog

iPLAss標準の画面では使用言語に合わせたラベルを表示します。 独自の画面等で利用する場合、ユーティリティクラスを使うことで対象となる言語の文言を簡単に取得できます。

使用例
String displayName = TemplateUtil.getMultilingualString(
    definition.getDisplayName(),
    definition.getLocalizedDisplayNameList());

1.2. テンプレートの多言語設定

テンプレートや通知機能(メール、SMS、Push通知)のテンプレートは、内容自体を言語毎に設定できます。 設定画面内の「Multilingal Attribute」セクションなどで多言語設定を管理しています。

definition template

「Add」ボタンをクリックすると、テンプレートに合わせた設定画面(JSPテンプレートならパスの設定、メールならテキストメッセージとHTMLテキストメッセージ等)が表示されます。 対象とする言語と合わせて設定を行います。

テンプレートの多言語設定は利用時(Actionの戻り先、メール作成時等)に自動的に読み込まれます。 開発者が意識して呼び出す必要はありません。

1.3. メッセージの多言語設定

以下の二つのメッセージの定義方法を利用することでEntityのValidatorのメッセージや、テンプレートに埋め込む文言等を外部に定義しながら多言語設定を管理することもできます。

  1. メッセージカテゴリ

  2. リソースバンドル

メッセージカテゴリ

メッセージ管理ではメッセージカテゴリと呼ばれるグループと、各メッセージカテゴリ内に設定されるメッセージアイテム(メッセージの本文)を管理しています。 多言語による定義が可能で、ユーティリティ等を利用することで、使用言語に合わせたメッセージを簡単に表示することも出来ます。 EntityのValidationでの入力エラーメッセージにも利用することが出来ます。 また、独自テンプレートを利用した画面にて、テキストをメッセージで管理することで多言語に対応するといった利用方法も可能です。

Messageの作成

Messageアイコンを右クリックして「メッセージカテゴリを作成する」を選択してください。

設定

メッセージカテゴリの編集画面は以下のような構成になっています。
共通定義のCommon Attributeと、各メッセージアイテムを管理するMessage Attributeに分かれています。

messageitem edit
Save

メッセージカテゴリ全体の内容を保存します。 「Cancel」を行うと、編集した内容は全て破棄されます。

Cancel

編集した内容を破棄します。

Show History

編集履歴を参照できます。

Name

メッセージカテゴリの定義名

Display Name

メッセージカテゴリの表示名

Description

メッセージカテゴリの説明文

メッセージアイテムの検索

メッセージアイテムのデータを絞り込むことができます。
Message AttributeのセクションにあるFilter項目に検索条件を入力し、「View Language」項目にチェックをいれて「Apply」ボタンをクリックします。
「Reset」ボタンをクリックすると、検索条件がクリアされてすべてのメッセージアイテムが表示されます。

メッセージアイテムの追加

Message Attributeのセクションにある「Add」ボタンをクリックします。新規メッセージアイテムが一覧に追加されます。
新規レコードの各項目にデータを入力した後に「Save」を実行してください。
「Save」を実行しないと入力内容がそのまま破棄されますので注意してください。

メッセージアイテムの編集

編集したいメッセージアイテムの項目をダブルクリックします。
編集用のテキストボックスが表示されます。
「Save」を実行しないと編集内容がそのまま破棄されますので注意してください。

メッセージアイテムの削除

削除したいメッセージアイテムを選択し、Message Attributeで「Remove」ボタンをクリックします。 メッセージアイテムを削除します。

元に戻す

編集を行ったメッセージアイテムを選択し、「Undo」ボタンをクリックしてメッセージアイテムを元に戻します。

利用方法

使い方のサンプルコード
TemplateUtilとかtaglib辺りのメッセージがらみのユーティリティも併せて紹介

MessageManager

MessageManagerを利用してメッセージを取得することができます。 以下のようにメッセージカテゴリ名とメッセージアイテム名を指定します。

MessageManager manager = ManagerLocator.manager(MessageManager.class);
String tempMessage = manager.getMessageItem("User", "Sub01").getMessage();
String message = MessageFormat.format(tempMessage, "ユーザー名");
TemplateUtil

TemplateUtilの以下のメソッドを利用することで、使用言語に合わせたメッセージを取り出すことができます。

String getMessageString(String categoryName, String messageId, Object…​ args)

String getMessageString(MessageItem message, Object…​ args)

JSP

JSPからメッセージを利用する場合、<%@ taglib prefix="m" uri="http://iplass.org/tags/mtp"%> のタグライブラリに定義されている以下の関数が利用できます。

String msg(String categoryName, String messageId)

String msgp(String categoryName, String messageId, Object params)

GroovyTemplate

GroovyTemplateからメッセージを利用する場合、共通関数として定義されている以下の関数が利用できます。

String msg(String categoryName, String messageId, Object params)

詳細はGroovyTemplateを参照してください。

リソースバンドル

メッセージプロパティファイルの作成

言語毎にプロパティファイルを作成する場合、クラスパスが通っているディレクトリにプロパティファイルを配置してください。
多言語プロパティファイルの命名ルールは以下です。

{ResourceBundleのbaseName}_{言語}

利用方法
ResourceBundleUtil

ResourceBundleUtilを利用してメッセージを取得することができます。 以下のようにリソースバンドル名、ロケール、キーなどを指定できます。

String resourceString(String key, Object…​ arguments)

String resourceString(Locale langLocale, String key, Object…​ arguments)

String resourceString(ResourceBundle resource, String key, Object…​ arguments)

String resourceString(String bundleBaseName, Locale langLocale, String key, Object…​ arguments)

TemplateUtil

TemplateUtilの以下のメソッドを利用することで、使用言語に合わせたメッセージを取り出すことができます。

String getResourceString(String key, Object…​ arguments)

String getResourceString(ResourceBundle resource, String key, Object…​ arguments)

JSP

JSPからメッセージを利用する場合、<%@ taglib prefix="m" uri="http://iplass.org/tags/mtp"%> のタグライブラリに定義されている以下の関数が利用できます。

String rs(String baseName, String key)

String rsp(String baseName, String key, Object params)

GroovyTemplate

GroovyTemplateからメッセージを利用する場合、共通関数として定義されている以下の関数が利用できます。

String rs(baseName, key, params)

詳細はGroovyTemplateを参照してください。

※独自で言語切替の実装をする際の注意点
言語切替をする場合は、セッション情報( SessionContext )に language というキー名で言語コード「 ja(日本語) , en(English) , zh-CN(简体中文) , zh-TW(繁體中文) , th(ภาษาไทย) 」のいずれかをStringで設定してください。ただし、セッション情報に設定するだけでは、ResourceBundleUtilや、TemplateUtil等で表示される結果は、切り替わりません。実際に切り替わるのは、その後に何かしらのコマンドが呼び出された後からとなります。
独自で言語切替を実装する場合は、上記内容を理解した上で設計してください。

2. データの多言語化

Entity定義の設定により、Entityデータ自体に対する多言語設定が行えます。 Data Localizationセクションから多言語化の方法と言語を設定します。

data localization setting
項目 設定値

Data Localize Type

データ多言語化の方法を設定します。

Not Localize

多言語化を行わない

Each Instance

レコード単位の多言語化

Each Property

プロパティ単位の多言語化

Language Property

Each Instance の場合にレコードの言語を判別するプロパティを設定します。

Support Languages

多言語化対象の言語を選択します。

この機能を利用する場合、EntityManagerからEntityに対する検索・更新を行う際に、Queryやオプションにlocalizedフラグを設定する必要があります。 汎用画面では、画面定義(検索、詳細どちらも)の「データを多言語化」を有効にすることで、自動的にフラグを設定します。 「データを多言語化」が有効になっていない場合は、通常のレコード及びプロパティとして扱われます。

2.1. レコード単位の多言語化

言語毎にレコードを分ける方法です。 Entity定義に「多言語判別用プロパティ」及び「対応言語」を設定することにより、 Entityデータ検索時に自動的に検索条件に「多言語判別用プロパティ=ユーザーの言語」を追加します。

例えば、Entity定義で以下のような設定をした場合、

多言語判別用プロパティ 対応言語

lang

en,ja

利用ユーザーの言語が en の場合、検索時のEQLに lang='en' という条件を自動的に付与します。 利用ユーザーの言語が zh_cn の場合、対応言語にないので、検索時のEQLには lang is null といった条件(デフォルトを取得するように)が付与されます。 主に言語毎に対象とするデータの件数が異なる場合での利用を想定しています。

なお、レコード単位の多言語化を行う場合、ユニークIndexの利用に制限がつきます。 言語単位でレコードができるので、論理的なデータ単位でユニークIndexが設定できないためです。 また、言語単位で複数レコードが生成されるので、oid、AutoNumber型ではそれぞれ別のIDが割り振られます。

2.2. プロパティ単位の多言語化

同一のEntity内に多言語用ラベルのプロパティを持つ方法です。 多言語用プロパティの命名ルールは以下の通りです。

{property名}_{言語}

例えば、Entity定義に「propA」というString型プロパティに対応する多言語用のプロパティを設定する場合、以下のようになります。

言語 プロパティ名

propA

en

propA_en

ja

propA_ja

langが en のユーザーの場合、「propA」に対する操作が「propA_en」に反映されます。 「propA_en」が存在しない場合は「propA」を利用します。

画面定義では「propA」のみ配置します。 上記の動きにより、画面上の「propA」に表示される値は多言語化用プロパティの値になり、更新された値も多言語化用プロパティに反映されます。

3. テナント単位でのロケール、タイムゾーン定義

デフォルトのロケール、タイムゾーンはテナント単位で設定ができます。 テナントにロケール、タイムゾーンが設定されていない場合、テナントはシステムのデフォルトロケール、タイムゾーン(javaVMのデフォルト)で動作します。

3.1. ロケールの設定

ロケールを設定した場合、次のものに影響を与えます。

  • 日付の表示形式
    ロケール単位に日付入力時/出力時のフォーマットが定義されています。

    ja_JP:yyyy/MM/dd
    en_US:MM/dd/yyyy
  • 数値の表示形式
    ロケール単位に数値入力時/出力時のフォーマットが定義されています。

    ja_JP:小数点が"." 桁数区切りが","
    fr_FR:小数点が"," 桁数区切りが" "

3.2. タイムゾーンの設定

タイムゾーン設定をした場合、ローカル時間(テナントに設定されたタイムゾーン)とシステム時間(システムデフォルトのタイムゾーン)を考慮する必要があります。 テナントのタイムゾーン設定とシステムデフォルトのタイムゾーン設定が異なる場合、それぞれの型に対して次のように考えます。

  • 日付型(DateProperty、java.sql.Date)
    日付自体はタイムゾーン情報を持ちません。 iPLAss上、現在日付を取得した場合はローカル日付を表すものとします。 java.sql.Dateのlong値としては、1970-01-01 00:00:00からのミリ秒の値ですが、厳密にはその値はUTC時間を表すものではなく、あくまで日付を指し示すための値を表します。

    システム:UTC、テナント:Asia/Tokyoの場合
    2013-12-31 20:00:00Z(UTC時間)での現在日付は2014-01-01(日本時間)
  • 時間型(TimeProperty、java.sql.Time)
    時間自体はタイムゾーン情報を持ちません。 iPLAss上、現在時刻を取得した場合はローカル時刻を表すものとします。 java.sql.Dateのlong値としては、1970-01-01 00:00:00から1970-01-02 00:00:00未満のミリ秒の値を表します。

    システム:UTC、テナント:Asia/Tokyoの場合
    2013-12-31 20:00:00Z(UTC時間)での現在時刻は05:00:00(日本時間)
  • 日時型(DateTimeProperty、java.sql.Timestamp)
    日時型はタイムゾーン情報を持ちます。 iPLAss上、現在時刻はテナントのタイムゾーン定義によらず、一意の時刻を指し示します。 java.sql.Timestampのlong値としては、UTC時間を表します。

    システム:UTC、テナント:Asia/Tokyoの場合
    2013-12-31 20:00:00Z(UTC時間)での現在日時は2014-01-01 05:00:00+09:00(=2013-12-31 20:00:00Z)

3.3. 汎用画面の動作

  • 日付/時間/日時のフォーマット
    画面上での日付/時間/日時の入力・出力のフォーマットはロケールごとに異なります。 CSV出力もロケールに依存した出力形式となります。 ただし、日付項目をサーバ側(Command)で受け取る際のフォーマットは yyyyMMddHHmmssSSS 形式固定とします。

    基本的に入力フォーマットと出力フォーマットは同一の形式となります。 ただし、 ja_JP ロケールのみ既存との整合性を確保するため、日付フォーマットは以下となります。

    • 入力フォーマット: yyyyMMdd

    • 出力フォーマット: yyyy/MM/dd

  • 数値のフォーマット
    画面上での数値の入力・出力のフォーマットはロケールごとに異なります。 ただし、数値フォーマットを画面定義にて明示的に指定した場合は、その指定に従います。 CSV出力は、ロケール非依存の出力形式(小数点は".")となります。 また、サーバ側(Command)で受け取る際のフォーマットもロケール非依存の固定形式となります。

3.4. ロケール、タイムゾーン関連API(Java)

ロケール、タイムゾーン設定が影響するapiは以下になります。

  • org.iplass.mtp.util.DateUtil
    日付系のユーティリティクラス。 現在日付/時間/日時を取得するメソッドや、テナントのロケール・タイムゾーン設定を反映させたDateFormat・Calendarクラスのインスタンスの取得メソッドを提供。 このクラスを利用しないで生成した、DateFormat、Calendar、現在日付(new Date()等)は、テナントのロケール・タイムゾーンが反映されず、システムデフォルトの設定が適用されている状態なので注意してください。

  • org.iplass.mtp.web.template.TemplateUtil
    テンプレートでプレゼンテーションロジックを実装する際のユーティリティ。 以下のメソッドを提供し、それぞれテナントに設定されているロケール・タイムゾーンを取得します。 設定されていない場合はシステムデフォルトの値が返却されます。

    • getLocale()

    • getTimeZone()

3.5. EQL

EQL上におけるロケール、タイムゾーンに関する事項は以下になります。

  • EQLで提供される関数

    関数 返却型(javaクラス) 説明 利用例

    CURRENT_DATE()

    date型(java.sql.Date)

    現在の(テナントローカルな)日付を取得する

    CURRENT_DATE()

    CURRENT_TIME()

    time型(java.sql.Time)

    現在の(テナントローカルな)時間を取得する

    CURRENT_TIME()

    CURRENT_DATETIME()

    datetime型(java.sql.Timestamp)

    現在の(グローバルな、一意な)日時を取得する。 EQL内でこの値を操作する際は、タイムゾーンはシステムのデフォルトとして扱われる。

    HOUR (CURRENT_DATETIME () ) : システムデフォルトのタイムゾーンの時が取得される

    LOCALTIME(datetime)

    datetime型(java.sql.Timestamp)

    datetimeで渡される日時をテナントに設定されたローカル時間を示す値に変換する

    HOUR (LOCALTIME (CURRENT_DATETIME () ) ) : テナントローカルのタイムゾーンの時間を取得

  • EQLリテラル文字列(datetime型)
    EQLのdatetime型の文字列表現でタイムゾーンを明示的に指定することができます。 タイムゾーン指定がない場合は、テナントローカルのタイムゾーンとみなされます。

    テナントローカル:Asia/Tokyo、システム:UTCとした場合
    select oid from AEntity
    where createDate >= '2010-01-30 00:00:00.000'm
    ->東京時間"2010-01-30 00:00:00.000"以降のデータを検索
    
    select oid from AEntity
    where createDate >= '2010-01-30 00:00:00.000+09:00'm
    ->UTC時間"2010-01-29 15:00:00.000"以降のデータを検索
     (=東京時間"2010-01-30 00:00:00.000")
    
    select oid from AEntity
    where createDate >= '2010-01-30 00:00:00.000Z'm
    ->UTC時間"2010-01-30 00:00:00.000"以降のデータを検索
     (=東京時間"2010-01-30 09:00:00.000")
  • PreparedQueryのバインド変数
    PreparedQueryを用いてバインドする際のバインド変数を以下のように定義します。

    バインド変数 説明 変換例(変換前) (変換後)

    sysdate

    現在日付(時間含まず)の文字列。テナントローカルなタイムゾーンの日付。

    dateProp >= '${sysdate}'

    dateProp >= '2013-08-30’d

    systime

    現在時刻の文字列。テナントローカルなタイムゾーンの時刻。

    timeProp >= '${systime}'

    timeProp >= '14:00:00’t

    sysdatetime

    現在日時の文字列。テナントローカルなタイムゾーンの日時。

    datetimeProp >= '${sysdatetime}'

    datetimeProp >= '2013-08-30 14:00:00.000’m

3.6. WebApi

  • SOAPおよび、REST/XML
    日付項目はそれぞれ、XMLSchemaのdate、time、dateTime型として出力されます。 それぞれの値にはタイムゾーンが出力されます。

    出力例
    "2013-08-30+09:00"
    "14:00:00+09:00"
    "2013-08-30 14:00:00.000000000+09:00"
  • REST/JSON
    日付項目はそれぞれ、次の固定形式として出力されます。

    形式

    date

    yyyy-MM-dd

    "2013-08-30"

    time

    HH:mm:ss

    "14:00:00"

    datetime

    long値(UTCミリ秒)

    1377842646073

3.7. AdminConsole

  • 日付項目の表示
    AdminConsole上の日付項目の出力は汎用画面同様、テナントローカルに設定されたロケール、タイムゾーンで表示されます。

  • EntityデータのExport/Import
    EntityExplorerPackagingのように、EntityのデータのExport/Importに使用されるCSVの日付項目のフォーマット、タイムゾーンは固定です。 システムデフォルトのロケール、タイムゾーンが使用されます。

    以下の固定形式になっています。

    FormatStyle(SimpleDateFormat) 出力例

    DateTimeProperty

    yyyy-MM-dd HH:mm:ss.SSSXXX

    2012-03-28 10:25:49.000+09:00

    DateProperty

    yyyy-MM-dd

    2012-03-28

    TimeProperty

    HH:mm:ss

    10:25:49

    ロケールに依存する出力形式の差異を上記のように書式を固定して回避します。 DateTimeのTimeZoneについてはエクスポートするテナント側のTimeZone設定値を利用してエクスポート時にCSVに出力します。 インポート時はCSVに出力されたTimeZone値(上の例では+09:00)をもとにTimeStamp型に変換を行います。

3.8. 環境設定/設定ファイル

iPLAssを動作させる環境におけるロケール、タイムゾーンに関する事項を以下に示します。

  • システムデフォルトの統一
    システムデフォルトのLocale/TimezoneはjavaVM、RDB(のセッション)で統一するものとします。 Oracle/postgresqlでは、自動的にjavaVMのロケール/タイムゾーンが設定されますが、MySQLの場合は、明示的に設定する必要あります。

  • iPLAss上で適用可能な言語、ロケールの定義
    適用可能な言語、ロケールはmtp-service-config.xml上に定義しています。 追加が必要な場合はorg.iplass.mtp.impl.i18n.I18nServiceを変更してください。