12
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Apex開発で押さえておきたいポイント - その2

Posted at

ちょっと書きたくなったので、18日に書いたApex開発で押さえておきたいポイントの続きです。Apexの多言語化対応についてまとめました。

#Apexと多言語化対応
##システム管理者プロファイルの判定
Salesforceではトランスレーションワークベンチの機能があり、簡単に多言語化対応が可能です。
スクリーンショット 2015-12-20 12.54.12.png

この多言語化についての注意点です。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);
    }
}
スクリーンショット 2015-12-20 13.17.26.png

ですがこの書き方だとユーザの言語が英語(別言語)になったときにエラーとなります。
スクリーンショット 2015-12-20 13.19.07.png

原因は標準プロファイルの「システム管理者」のラベルが翻訳されて「System Administrator」に変更されるためです。
スクリーンショット 2015-12-20 13.22.13.png

このトラブルに対応するにはカスタム表示ラベルが有効です。カスタム表示ラベルにも翻訳機能がついているため、別言語時に対象のラベルに切り替えてくれます。
スクリーンショット 2015-12-20 13.25.54.png

先ほど『システム管理者』と固定文字列にしていたところを『System.Label.Profile_System_Admin』というようにカスタム表示ラベルに変更することでテストでエラーにならなくなります。

public static Boolean isSystemProfile(Profile p) {
    if (p.Name == System.Label.Profile_System_Admin) {
        return true;
    }
    
    return false;
}
スクリーンショット 2015-12-20 13.30.23.png

このように標準のプロファイル名をApexで判定処理する場合はカスタム表示ラベルを利用しましょう。当初多言語化対応が必要でない組織でも後から必要になったときに切り替えるのは大変です。簡単に対応できるところは対応する準備をしておくと開発がやりやすくなると思います。

##選択リストの判定
多言語化対応で意識しておきたいことは他にもいくつかあります。例えば選択リストの値判定です。実は選択リスト値もトランスレーションワークベンチで翻訳できます。ですが、Apexの文字列判定を行うときの値はオリジナルの値で行われます。

選択リスト値の判定に関してはこのルールを意識しておきましょう。

詳細はこちらです。

SFDC:多言語化対応と選択リストの文字列判定

上記のリスト値が翻訳されない原因の詳細ですが、通常SOQLクエリで取得できる値は翻訳されていないものとなります。翻訳後の値を取得したい場合はtoLabel()を利用することで対応可能です。

つまりtoLabel()関数を利用してクエリを実行すれば、翻訳後のリスト値を取得することが可能です。
20140913131423.png

選択リスト値の判定でそこまでの対応が必要かという点がありますが、こういった対応ができることを覚えておくといいと思います。

詳細はこちらです。

SFDC:トランスレーションワークベンチによる翻訳とSOQLのtoLabel

##日付の変換
最後に多言語化対応と日付変換についてです。
スクリーンショット 2015-12-20 13.52.36.png

Dateクラスには文字列を日付に変換するためのDate.parse()が用意されています。これはユーザの地域情報によって対象のStringの形式が変更されます。
スクリーンショット 2015-12-20 13.54.01.png

日本ユーザで次のように変換していたものが別地域のユーザだとエラーになってしまいます。

date mydate = date.parse('2015/10/15');

このトラブルを回避するためにも、特に理由がなければDate.valueOfを使用するのがおすすめです。
スクリーンショット 2015-12-20 13.57.20.png

#さいごに
以上、Apex開発で押さえておきたいポイント - その2でした。想定していない他の言語でも必ず動く画面にする必要はないと思いますが、他の言語圏のSalesforce開発者がリリース作業などで組織のテストクラスを動かした際に、エラーにならないようにつくっておくとSalesforce開発が進めやすくなると思います。

12
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?