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

ちょっと書きたくなったので、18日に書いた<a href="http://qiita.com/tyoshikawa1106/items/64e1dde75de245018647">Apex開発で押さえておきたいポイント</a>の続きです。Apexの多言語化対応についてまとめました。

#Apexと多言語化対応
##システム管理者プロファイルの判定
Salesforceではトランスレーションワークベンチの機能があり、簡単に多言語化対応が可能です。
<img width="1277" alt="スクリーンショット 2015-12-20 12.54.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/a5ef437a-aab1-a1bf-8dcf-bb5562669274.png">


この多言語化についての注意点です。Apexの処理でシステム管理者プロファイルの判定が必要な場合があると思います。そのときの判定方法をざっくり書くとこんな感じです。

```java
public static Boolean isSystemProfile(Profile p) {
    if (p.Name == 'システム管理者') {
        return true;
    }
    
    return false;
}
```

テストを書くと正常に実行されます。

```java
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);
    }
}
```

<img width="1014" alt="スクリーンショット 2015-12-20 13.17.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/ce73f1da-65a9-bb9a-3a08-c4121d5d6a83.png">


ですがこの書き方だとユーザの言語が英語(別言語)になったときにエラーとなります。
<img width="1273" alt="スクリーンショット 2015-12-20 13.19.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/6973f3f6-0fa4-e27d-cb27-eab7ed903adb.png">

原因は標準プロファイルの「システム管理者」のラベルが翻訳されて「System Administrator」に変更されるためです。
<img width="1060" alt="スクリーンショット 2015-12-20 13.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/fee16572-92b9-26a0-adf5-38eb1b75bda2.png">

このトラブルに対応するにはカスタム表示ラベルが有効です。カスタム表示ラベルにも翻訳機能がついているため、別言語時に対象のラベルに切り替えてくれます。
<img width="1007" alt="スクリーンショット 2015-12-20 13.25.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/39964e0d-a207-c7b4-09b2-32268e1db7a4.png">


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

```java
public static Boolean isSystemProfile(Profile p) {
    if (p.Name == System.Label.Profile_System_Admin) {
        return true;
    }
    
    return false;
}
```

<img width="1058" alt="スクリーンショット 2015-12-20 13.30.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/8031db4e-6b2b-ce6e-7336-515cb7c74921.png">


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

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

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

詳細はこちらです。

><a href="http://tyoshikawa1106.hatenablog.com/entry/2014/03/08/120938">SFDC：多言語化対応と選択リストの文字列判定</a>


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

つまりtoLabel()関数を利用してクエリを実行すれば、翻訳後のリスト値を取得することが可能です。
<img width="400" alt="20140913131423.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/f8545958-482b-213a-d59b-9e45b4d175ef.png">

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

詳細はこちらです。

><a href="http://tyoshikawa1106.hatenablog.com/entry/2014/09/13/131917">SFDC：トランスレーションワークベンチによる翻訳とSOQLのtoLabel</a>


##日付の変換
最後に多言語化対応と日付変換についてです。
<img width="1275" alt="スクリーンショット 2015-12-20 13.52.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/f5c4d3c4-0670-1c71-cb02-7024ac43568e.png">

Dateクラスには文字列を日付に変換するためのDate.parse()が用意されています。これはユーザの地域情報によって対象のStringの形式が変更されます。
<img width="928" alt="スクリーンショット 2015-12-20 13.54.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/f52381e7-f772-22df-7272-0e19c38fb304.png">

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

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

このトラブルを回避するためにも、特に理由がなければDate.valueOfを使用するのがおすすめです。
<img width="946" alt="スクリーンショット 2015-12-20 13.57.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/0174512b-945b-0da8-5f5d-3c017ea05f01.png">


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