ちょっと書きたくなったので、18日に書いたApex開発で押さえておきたいポイントの続きです。Apexの多言語化対応についてまとめました。
#Apexと多言語化対応
##システム管理者プロファイルの判定
Salesforceではトランスレーションワークベンチの機能があり、簡単に多言語化対応が可能です。
この多言語化についての注意点です。Apexの処理でシステム管理者プロファイルの判定が必要な場合があると思います。そのときの判定方法をざっくり書くとこんな感じです。
public static Boolean isSystemProfile(Profile p) {
if (p.Name == 'システム管理者') {
return true;
}
return false;
}
テストを書くと正常に実行されます。
static testMethod void isSystemProfileTest() {
System.runAs(testAdminUser) {
Profile p = [SELECT Id,Name FROM Profile WHERE Id =: UserInfo.getProfileId() LIMIT 1];
Test.startTest();
Boolean result = CommonUtil.isSystemProfile(p);
Test.stopTest();
System.assertEquals(result, true);
}
}
ですがこの書き方だとユーザの言語が英語(別言語)になったときにエラーとなります。
原因は標準プロファイルの「システム管理者」のラベルが翻訳されて「System Administrator」に変更されるためです。
このトラブルに対応するにはカスタム表示ラベルが有効です。カスタム表示ラベルにも翻訳機能がついているため、別言語時に対象のラベルに切り替えてくれます。
先ほど『システム管理者』と固定文字列にしていたところを『System.Label.Profile_System_Admin』というようにカスタム表示ラベルに変更することでテストでエラーにならなくなります。
public static Boolean isSystemProfile(Profile p) {
if (p.Name == System.Label.Profile_System_Admin) {
return true;
}
return false;
}
このように標準のプロファイル名をApexで判定処理する場合はカスタム表示ラベルを利用しましょう。当初多言語化対応が必要でない組織でも後から必要になったときに切り替えるのは大変です。簡単に対応できるところは対応する準備をしておくと開発がやりやすくなると思います。
##選択リストの判定
多言語化対応で意識しておきたいことは他にもいくつかあります。例えば選択リストの値判定です。実は選択リスト値もトランスレーションワークベンチで翻訳できます。ですが、Apexの文字列判定を行うときの値はオリジナルの値で行われます。
選択リスト値の判定に関してはこのルールを意識しておきましょう。
詳細はこちらです。
上記のリスト値が翻訳されない原因の詳細ですが、通常SOQLクエリで取得できる値は翻訳されていないものとなります。翻訳後の値を取得したい場合はtoLabel()を利用することで対応可能です。
つまりtoLabel()関数を利用してクエリを実行すれば、翻訳後のリスト値を取得することが可能です。
選択リスト値の判定でそこまでの対応が必要かという点がありますが、こういった対応ができることを覚えておくといいと思います。
詳細はこちらです。
Dateクラスには文字列を日付に変換するためのDate.parse()が用意されています。これはユーザの地域情報によって対象のStringの形式が変更されます。
日本ユーザで次のように変換していたものが別地域のユーザだとエラーになってしまいます。
date mydate = date.parse('2015/10/15');
このトラブルを回避するためにも、特に理由がなければDate.valueOfを使用するのがおすすめです。
#さいごに
以上、Apex開発で押さえておきたいポイント - その2でした。想定していない他の言語でも必ず動く画面にする必要はないと思いますが、他の言語圏のSalesforce開発者がリリース作業などで組織のテストクラスを動かした際に、エラーにならないようにつくっておくとSalesforce開発が進めやすくなると思います。