【Salesforce】PageとComponentで異なる言語を使用する

【Salesforce】PageとComponentで異なる言語を使用する

Visualforceのページ内で、多言語の対応をするためにカスタム表示ラベルを使用しています。

また、コンポーネントの中でもカスタム表示ラベルを使用しています。

そのコンポーネントはページと別の言語を表示するために使用するのですが、思ったとおりの動作をしませんでした。

ソースのイメージとしてはこのような状態です。

<apex:page id="Page" controller="Controller" language="ja">
  
  <apex:outputText value="{!$Label.ABC}" />
  
  <apex:form id="Form" >
    <c:OtherLangComponent id="Component" />
  </apex:form>

</apex:page>
<apex:component language="en_US">
  
  <apex:outputText value="{!$Label.ABC}" />

</apex:component>

言語に日本語を設定しているページの中に、言語に英語を設定しているコンポーネントがあります。

このようにすれば、ページ内のカスタム表示ラベルに日本語が、コンポーネント内のカスタム表示ラベルには英語が表示されると考えました。

しかし、実際の動きとしてはページ側もコンポーネント側も日本語で翻訳が行われました。

ページとコンポーネントの両方に言語を指定すると、ページ側の言語によって翻訳が行われるようです。

ページとコンポーネントで異なる言語を使用するためには、少し工夫をする必要がありました。

ページに設定する言語を変数にした上で、コントローラ側にて言語を変更し、コンポーネントのみを更新するというものです。

イメージとしてはこんな感じです。

<apex:page id="Page" controller="Controller" language="{!lang}">
  
  <apex:outputText value="{!$Label.ABC}" />
  
  <apex:form id="Form" >
    <c:OtherLangComponent id="Component" />
    <apex:actionFunction name="changeLanguage" action="{!changeLanguage}" rerender="Component" oncomplete="return null;" />
  </apex:form>

  <script>
  $(document).ready(function(){
      // コンポーネント用の言語を設定する
      changeLanguage();
  });
  </script>
</apex:page>
<apex:component>
  
  <apex:outputText value="{!$Label.ABC}" />

</apex:component>
public class Controller {

    public String lang{get;set;}

    /**
     * コンストラクタ
     */
    public Controller(){

        // ページ側の言語を設定する
        this.lang = 'ja';
    }

    /**
     * コンポーネントの言語を設定する
     */
    public PageReference changeLanguage(){

        this.lang = 'en_US';
        return null;
    }
}

画面を表示した直後にjavascriptでchangeLanguageメソッドを呼んでいます。

さらに、changeLanguageのrerenderでコンポーネントのみを指定しています。

これにより、変更された言語でコンポーネントを再描画することができるようです。

Visualforce側のページのlanguageが変化していないため、このような動作は動かないと思いました。

しかし、内部的にページのlanguageが変化しているためなのか、コンポーネントは英語で翻訳されました。

サーバー側ではどのように処理を行っているのか、少し気になりますね。

思いつきで実行した割には動いたので良かったです。

もっと良い方法があるかもしれないので、知っている人がいれば教えてほしいですね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です