2016-12-08 26 views
3

SAPUI5コントロールで言語の問題が発生しました。 SAPUI5の言語切り替え

私は例えば:私の国際化ファイルが正しくロードされ、すべてのラベルがドイツ語に翻訳され

sap.ui.getCore().getConfiguration().setLanguage("de"); 

実行した場合

。しかし、コントロールはまだ英語です。

ドイツのコントロールを取得する唯一の方法は、urlパラメータである:

sap-ui-language=DE 

しかし、私は私の場合には、パラメータを使用することはできません。何か案が?

+0

コントロールはまだ英語で何を意味していますか? – matbtt

+0

私の場合、FacetFilter。プレースホルダはドイツ語ではなく英語で表示されます。しかし、すべてのラベルはドイツ語です。 i18nで翻訳されたすべての要素はドイツ語です。 – alexP

+0

どのバックエンドを使用していますか?すべてのテキスト/ラベルはi18nファイルから来ますか?あなたのアプリにはどんなi18n言語ファイルがありますか?アプリケーションでODataを使用していますか、おそらく$ metadataのテキストですか?より多くの情報をお知らせください。私はあまりにも多くの仮定をしたので私の答えを削除しました... – Nabi

答えて

1

Explored App Exampleをテストすることで、説明した動作を簡単に確認できます。そこでコンソールを開いてヒットしてください。sap.ui.getCore().getConfiguration().setLanguage("de");

また、implementation of the FacetFilterもチェックしましたが、これはコントロールの実装ではバグです。これは、テキストがコントロール内にどのようにロードされるかに由来します。念のためにあなたが興味を持っている:

  • FacetFilter hidden aggregation called SummaryBarがあります。 SummaryBarには、表示されるテキストが含まれています。もちろん、これはtext comes from a bundleです。

  • ただし、バンドルはinitialized exactly once in init()で、sap.ui.getCore().getLibraryResourceBundle("sap.m");と呼びます。 APIドキュメントでは、次のようになります。

    引数が1つのみ与えられた場合は、libraryNameとみなされます。 ロケールは、現在のセッションロケールに戻ります。

  • これは、バンドルがキャッシュされているため、ローカライズ(言語など)が変更されても、バンドルが新しい翻訳ファイルを読み込むことはありません。したがって、私たちが何を試しても(いつでもrerendering()が役に立たない)、最初の言語が常に表示されます。

  • ソリューションは、バンドルがINITの内側にロードされた直後に次のコードを追加してコントロールを修正するために、次のようになります。

    sap.ui.getCore().attachLocalizationChanged(function(oEvent){ 
        var oChanges = oEvent.getParameter("changes");  
        if (oChanges && oChanges.language){ 
         this._bundle = sap.ui.getCore().getLibraryResourceBundle("sap.m", oChanges.language); 
         this.rerender(); 
        } 
    }.bind(this)); 
    

    あなたは上記のリンク探求のアプリでこれを試してみることができ、それは私のためにうまくいった...

    私はちょうどissue on githubを開いた。

    4

    sap.ui.getCore().setLanguage()が明示的枠組みがすでに作成され、言語依存オブジェクトは、この呼び出しによって更新されることを保証するものではありません

    を述べていることに注意してください。したがって、アプリケーションが早い段階で言語を切り替えるのがベストプラクティスです。言語依存オブジェクトが作成される前に言語のより動的な変更をサポートする必要があるアプリケーションでは、localizationChangedイベントをリッスンし、使用するすべての言語に依存するオブジェクトを調整する必要があります(UIを再構築するなど)。

    さらに、私はナビの答えを完全にサポートしています(しかし、私はそれを投票することはできません)。

    私はちょうど(FilterBarのような)を制御し、より良いフックアプローチを使用する必要があることを追加したいと思います:コントロール内のフックを使用して

    FilterBar.prototype.onlocalizationChanged = function(oEvent) { 
        // .. same bundle update code as in Nabi's proposal 
    } 
    

    は、init /終了のコールを切り離し+添付し続けて追加することの必要性を回避イベントレジストリは小さいです。

    +0

    さて、あなたの答えを投票させてください! – Nabi

    関連する問題