6.6. 国際化情報入力項目¶
本章では、国際化入力について、記載します。
項目
6.6.1. 国際化情報の入力・登録・更新について¶
ここでは入力・登録・更新する場合の国際化情報についてを説明します。
intra-mart Accel Platform でもこの処理例を利用しています。
6.6.1.1. 入力項目の表示に関して¶
6.6.1.1.1. 国際化入力項目の仕様¶
- 国際化入力項目が必須入力の場合、標準表示名 とシステムにインストールしているロケール分の入力項目を用意します。
例: 日本語ロケール、英語ロケールに対応する場合標準表示名、日本語、英語の 3 つの入力項目が表示されます。
- 項目の表示順
- 標準表示名、テナントのデフォルトロケール、その他のロケールの順番に表示します。
- テナントのデフォルトロケール以外の並び順は、 SystemLocale#getLocaleInfos() が返した順になります。
- テナントのデフォルトロケールが設定されていない場合は、システムデフォルトのロケールになります。
- 標準表示名 を必須項目とします。
- 各ロケールは、任意入力項目とします。
- 各ロケールが未入力の場合、標準表示名が、有効になります。
6.6.1.1.2. 入力項目が、「全て必須」 かつ 「項目数が少ない」場合¶
- 標準表示名とシステムにインストールしているロケール分、入力項目をすべて表示します。
- デフォルトロケール以外の言語ロケールを、あらかじめ隠しておくなどの処理は、一切しません。
6.6.1.1.3. 入力項目が、「一部必須」、または 「項目数が多い」 場合¶
標準表示名のみ表示し、サーバ側のロジックで各ロケールに何を登録するか決定します。
コラム
国際化情報の対応を行う場合は、表示する文字列をプロパティファイルで管理します。 入力項目と同様に、標準表示名とロケール毎に管理します。 詳細は、 スクリプト開発モデル プログラミングガイド の 多言語対応 を参照してください。
6.6.1.2. 画面からの入力、および、登録・更新処理に関して¶
- 国際化入力項目が必須入力の場合、 標準表示名は必須入力 、 各ロケールは任意入力 とします。任意入力の項目に何も入力されなかった場合は、標準表示名の項目値と同じ値が入力されたものとみなします。
- 登録・更新時、任意項目が未入力の場合、標準表示名より該当する項目の内容をコピーします。
- コピー処理は、サーバサイド JavaScript 側で行います。API 内部でコピーは、行ってはなりません。
- 任意入力の国際化入力項目値を補完は、サーバサイド JavaScript 側で行います。
6.6.1.3. バリデーションチェック¶
- 国際化入力項目等、動的に変化する項目に関しては、 クライアントサイド JavaScript とサーバサイド JavaScript で独自チェックします。それ以外の固定的な項目は、通常どおり JS Validation を利用したチェックをします。
6.6.1.4. 実装例¶
6.6.1.4.1. validator.js ( サーバサイド JavaScript )¶
- バリデーションルールを記述します。
- 国際化入力項目は required = true に設定しておきます。
1 2 3 4 5 6 7 8 9 10 11 | var init = {
dataId : {
caption: MessageManager.getMessage("CAP.UI.DEFAULT.LABEL"),
required: true,
maxlength: 256
},
dataName : {
caption: MessageManager.getMessage("CAP.UI.FACILITY.CATEGORY.NAME"),
maxlength: 256
}
};
|
6.6.1.4.2. page.js(サーバサイド JavaScript )¶
テナントデフォルト言語、または、システムデフォルト言語が上に来るように調整します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | var $result = {};
function init(request) {
getLocaleInfo($result);
}
function getLocaleInfo(obj) {
var tenantInfoManager = new TenantInfoManager();
obj.defaultLocaleId = tenantInfoManager.getTenantInfo(true).data.locale;
if (isBlank(obj.defaultLocaleId)) {
obj.defaultLocaleId = SystemLocale.getDefaultLocaleInfo().data.locale;
}
obj.locales = [];
var localeInfos = SystemLocale.getLocaleInfos().data;
for (var i = 0; i < localeInfos.length; i++) {
if (obj.defaultLocaleId == localeInfos[i].locale) obj.locales.push({
id:localeInfos[i].locale,
name:localeInfos[i].displayName
});
}
for (var i = 0; i < localeInfos.length; i++) {
if (obj.defaultLocaleId != localeInfos[i].locale) obj.locales.push({
id:localeInfos[i].locale,
name:localeInfos[i].displayName
});
}
}
|
6.6.1.4.3. page.html (クライアントサイド JavaScript、HTML)¶
バリデーションルール、メッセージの読み込みと動的バリデーションの設定をします。
サーバ側に国際化項目を送る場合は、ベースとなる値(デフォルト言語)と、全言語分を個別で送ります。
これにより、デフォルト言語の必須と長さを自動でチェックできます。
<imart type="head">
<script src="ui/libs/jquery-validation-1.9.0/jquery.validate.js"></script>
<imart type="imuiValidationRule" rule="sample/validator#init" rulesName="validateRules" messagesName="validateMessages" />
<script type="text/javascript">
jQuery(function() {
// 生成されたテキストボックスに name 属性を付与します
jQuery("#input_form [name=dataNames] input").each(function() {
var newName = "dataName_" + jQuery(this).attr("locale");
var caption = jQuery(this).parent().prev().text();
jQuery(this).attr("name", newName);
// 付与した name 属性に対するバリデーションを追加します
validateRules[newName] = {caption:caption,__caption__:caption,maxlength: 256};
});
jQuery("#submit-button").click(function() {
// クライアントサイドのバリデーションチェックを行います
if (imuiValidate("#input_form", validateRules, validateMessages)) {
var names = {};
jQuery("#input_form [name=dataNames] input").each(function() {
names[jQuery(this).attr("locale")] = jQuery(this).val();
});
jQuery.ajax({
type: "POST",
url: "sample/ajax",
dataType: "json",
data: {
dataId: jQuery("#input_form [name=dataId]").val(),
dataName: jQuery("#input_form [name=dataNames] input:first").val(),
dataNames: ImJson.toJSONString(names)
},
success: function(result) {
if (result.error) {
imuiShowErrorMessage(result.errorMessage, result.detailMessages);
return;
} else {
imuiShowSuccessMessage(result.successMessage);
}
},
error: function(request, textStatus, errorThrown) {
imuiShowErrorMessage(request.statusText + "(" + request.status + ")", "");
}
});
}
});
});
</script>
</imart>
<form id="input_form" onsubmit="return false;" class="imui-form-container">
<table class="imui-form">
<tbody>
<tr>
<th class="wd-20"><label><imart type="message" id="CAP.UI.FACILITY.CATEGORY.NAME" escapeXml="true" escapeJs="false" /></label></th>
<td>
<table class="imui-form" >
<tbody>
<tr>
<th class="wd-20"><label class="imui-required" data-locale="<imart type="string" value=$bind.defaultLocaleId escapeXml="true" escapeJs="false" />"><imart type="message" id="CAP.UI.DEFAULT.LABEL" escapeXml="true" escapeJs="false" /></label></th>
<td><imart type="imuiTextbox" name="dataId" style="width: 400px;"/></td>
</tr>
<tr>
<td colspan="2"><imart type="message" id="CAP.UI.DESCRIPTION.LOCALE.SETTING" escapeXml="true" escapeJs="false" /></td>
</tr>
</tbody>
</table>
<table class="imui-form" name="dataNames">
<tbody>
<imart type="repeat" list=$result.locales item="record">
<tr>
<th class="wd-20"><label><imart type="string" value=record.name /></label></th>
<td><imart type="imuiTextbox" locale=record.id style="width: 400px;" /></td>
</tr>
</imart>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<div class="imui-operation-parts">
<imart type="imuiButton" id="submit-button" value="%CAP.UI.ACT.REGISTRATION" class="imui-large-button" />
</div>
</form>
6.6.1.4.4. ajax.js (サーバサイド JavaScript )¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /**
* @param request
* @validate sample/validator#init
* @onerror handleErrors
*/
function init(request) {
// 国際化項目のみ追加チェック(必須チェック済なので長さチェックのみ)
var dataNames = isBlank(request.dataNames) ? {} : ImJson.parseJSON(request.dataNames);
for (var localeId in dataNames) {
var dataName = dataNames[localeId];
var result = {};
if (isString(dataName) && dataName.length > 256) {
// バリデーションエラー
result = {
error: true,
successMessage: "",
errorMessage: MessageManager.getMessage('MSG.E.IWP.ASYNC.TASKQUE.ADD.SERIESQUEUE.INPUT'),
detailMessages: MessageManager.getMessage("MSG.W.IWP.JSSP.VALIDATION.MAXLENGTH", MessageManager.getMessage("CAP.UI.FACILITY.CATEGORY.NAME"), "256")
};
sendJSONString(result, result.errorMessage, result.detailMessages);
return;
}
}
result.error = false;
sendJSONString(result, MessageManager.getMessage('CAP.UI.SUCCESS.MESSAGE'));
}
function handleErrors(request, validationErrors) {
let result = {
error: true,
successMessage: '',
errorMessage: MessageManager.getMessage('MSG.E.IWP.ASYNC.TASKQUE.ADD.SERIESQUEUE.INPUT'),
detailMessages: validationErrors.getMessages()
};
sendJSONString(result, result.errorMessage, result.detailMessages);
}
function sendJSONString(result, message, detailMessages) {
message = (message == null) ? '' : message;
detailMessages = (detailMessages == null) ? '' : detailMessages;
var response = Web.getHTTPResponse();
response.setContentType('application/json; charset=utf-8');
response.sendMessageBodyString(ImJson.toJSONString({
error: result.error,
successMessage: result.error ? '' : message,
errorMessage: result.error ? message : '',
detailMessages: result.error ? detailMessages : ''
}));
}
|