デバイスのローカリゼーション設定を変更せずに、アプリケーション内でアプリのローカリゼーションを切り替える独自の手動の方法を実装しました。ユーザーは、iOSデバイスの一連の右ナビゲーションボタンを介してタブ付きバーをクリックするか、Androidデバイスのネイティブメニューを使用して目的の言語を選択します。
この方法は、iOSデバイスでうまく機能します。ユーザーが選択するとすぐにすべてのテキストラベルがそれぞれの言語に設定されるという点で、Androidデバイスでほぼうまく機能します。ただし、AndroidデバイスではネイティブのTabGroupタブのタイトルが変更されていません。それらは私のiOSデバイスですぐに変わります。
私はこれを回避するために多くの異なる方法を試しました。TabGroupから既存のタブを削除しようとしましたが、Androidは、少なくともTitaniumを使用している間は、これをサポートしていません。tabGroupを閉じてから再度開いてみましたが、これによりアプリがロックされます。また、すべてのタブをループして、タイトルを無駄に設定してみました。また、tabGroupのtabs配列でsplice()コマンドを使用しようとしましたが、オブジェクトのデフォルト値が見つからないことを訴えるTypeErrorがスローされます。
これは非常に苛立たしいものになりつつあります。Tabulousと呼ばれるTitaniumMarketplaceモジュールを含む、利用可能なカスタムタブオプションを見てきました。私はこれらの選択肢のどれにもわくわくしていません。特に、水平方向のレイアウトのパフォーマンスが低いことや、画像とテキストの組み合わせではなく画像を使用することに依存していることです。
私が知っていることの1つは、Androidデバイスでは、タブタイトルが変更されていることです。これは、言語選択でタブタイトルを設定したイベントリスナー内で、tabGroupコレクションのタブをループして、反映するタイトルを出力できるためです。選択した言語。ただし、Androidは何らかの理由で、新しいテキストを表示するためにタブを再描画しません。
これは、タブのタイトルを設定したイベントリスナーのスニペットです。
Titanium.App.addEventListener('langChanged', function() {
homeTab.title = al.L('home_win_title');
servicesTab.title = al.L('services_win_title');
mediaTab.title = al.L('media_win_title');
contactTab.title = al.L('media_win_title');
// Android test:
if (Ti.Platform.name == 'android') {
for (var t in tabGroup.tabs) {
// The alert below returns the expected title based on the language selection!
alert(tabGroup.tabs[t].title);
}
}
});
私が言ったように、私のテストiOSデバイスでは、タブのタイトルが期待どおりに更新されます。上記のループでスローしたアラートには正しいテキストが表示されますが、Androidデバイスでは変更されません(再描画されません)。
何かアイデアはありますか?