2012-02-17 9 views
2

My Java ME MIDletを使用すると、Midletの言語を変更できます。
私のコードは国際化を扱い、左から右の言語でうまく動作します。
しかし、ユーザーが言語を右から左の言語に変更すると、正しい文字列が表示されますが、画面は左揃えのままです。Java MEでは、MIDletの右から左に表示されるものの方向を変更するにはどうすればよいですか?

つまり、電話のロケールはen_USなので、私はそれを変更したくありません。
MIDletのロケールを変更したいだけです。
コンテンツを右揃えにするためにMIDletのすべての画面を動的に変更する最も簡単な方法は何ですか?
解決策には、ユーザーがアプリケーションを再起動する必要があるかどうかは関係ありません。
Java MEソリューションがない場合は、ソリューションがNokia製携帯電話の所有者であるかどうかは気にしません。

答えて

1

あなたがLCDUIを使用していると仮定すると、デフォルトでStringItemsなどに電話機のロケールに基づいたデフォルトのレイアウトが与えられます。すなわちItem.LAYOUT_DEFAULTの場合、en_USロケールの電話機は左から右のアイテムを表示し、ar_EGロケールの電話機は右から左のテキストを表示します。

setLayout()機能を使用してテキストを正当化右にレイアウトが可能です:

StringItem myStringItem = new StringItem("Title", "The text I want to display", Item.PLAIN); 
myStringItem.setLayout(Item.LAYOUT_RIGHT); 
append(myStringItem); 

あなたは簡単に使用する値とフラグを保持することができシングルトンSettingsクラスを作成することができます

myStringItem.setLayout(Settings.getInstance().getJustification()); 

これもで行うことができます。レイアウトなどを設定するときに正当化(Item.LAYOUT_LEFTまたはItem.LAYOUT_RIGHT)、およびそれを呼び出しますあなたが望むなら、コンストラクタ。

低レベルのためにGraphicsdrawString()方法を用いることができ、変更されたテキストの方向が、あなたはあなたのテキストの右上から開始点を計算する必要がありますトップは

if (Settings.getInstance().getJustification() != Item.LAYOUT_RIGHT) { 
     g.drawString("Some Text", x + TEXT_MARGIN , y ,Graphics.TOP | Graphics.LEFT); 
    } else { 
     // Arabic rendering of menu items - getWidth() is the maximum length 
     // of the line 
     g.drawString("Some Arabic Text", x + getWidth() - TEXT_MARGIN, y , 
          Graphics.TOP | Graphics.RIGHT); 
    } 

を残していませんあなたが既に拒否した最も簡単な解決策は、全体を通してItem.LAYOUT_DEFAULTを使用して電話のロケールを変更することですが、低レベルのグラフィックを使用する場合は、まだdrawString()の上書きを使用する必要があります。

static final String[] RIGHT_TO_LEFT = { 
     "ar", // Arabic 
     "az", // Azerbaijani 
     "he", // Hebrew 
     "jv", // Javanese 
     "ks", // Kashmiri 
     "ml", // Malayalam 
     "ms", // Malay 
     "pa", // Panjabi 
     "fa", // Persian 
     "ps", // Pushto 
     "sd", // Sindhi 
     "so", // Somali 
     "tk", // Turkmen 
     "ug", // Uighur 
     "ur", // Urdu 
     "yi" // Yiddish 
    }; 

public static int getJustification(String locale) { 

     for (int index = 0; index < RIGHT_TO_LEFT.length; index++) { 
      if (locale.indexOf(RIGHT_TO_LEFT[index]) != -1) { 
       return Item.LAYOUT_RIGHT; 
      } 
     } 
     return Item.LAYOUT_DEFAULT; 
    } 
+0

サイドノート:

は、私がこのような機能にSystem.getProperty("microedition.locale")を使用して入力ロケールを入力し、正しい正当性を確認します。ターゲットデバイスが[JSR 238](http://jcp.org/ja/jsr/detail?id=238 "J2ME Mobile Internationalization API")_Mobile I18N API_をサポートしている場合は、他のオプションもあります – gnat

関連する問題