2012-09-21 10 views
7

私はインターネットからのサンプルttfファイルを使用してdevanagari/hindiのjavaでi18nを使用しようとしています。devanagari i18n in java

リソースバンドルエントリを読み込むことができ、ttfとset fontも読み込むことができますが、jlabelは必要に応じて表示されません。文字の代わりにブロックを表示します。私がEclipseでデバッグするならば、私はユニコード変数の上に置くことができ、それはdevanagariをレンダリングすることさえできます。以下は参考用のコードとリソースバンドルです。

package i18n; 

import java.awt.Font; 
import java.awt.GridLayout; 
import java.io.InputStream; 
import java.util.Locale; 
import java.util.ResourceBundle; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MyNumbers extends JFrame { 
    private ResourceBundle rb; 
    private Font devanagariFont; 

    public MyNumbers (String language, String fontFile) { 
     loadResourceBundle(language); 
     loadFont(fontFile); 
     display(); 
    } 

    private void display() { 
     String unicode = null; 

     JPanel labels = new JPanel(new GridLayout(0,2)); 
     JLabel uni = null; 
     for(int i=0; i<=10; i++) { 
      unicode = rb.getString("" +i); 
      labels.add(new JLabel("" + i)); 
      labels.add(uni = new JLabel(unicode)); 
      uni.setFont(devanagariFont); 
     } 
     getContentPane().add(labels); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    private void loadFont(String fontFile) { 
     try { 
      InputStream input = getClass().getResourceAsStream(fontFile); 
      Font b = Font.createFont(Font.TRUETYPE_FONT, input); 
      devanagariFont = b.deriveFont(Font.PLAIN, 11); 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void loadResourceBundle(String language) { 
     String base = getClass().getName() + "rb"; 
     rb = ResourceBundle.getBundle(base, new Locale(language)); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     new MyNumbers("hi", "Devnew.ttf"); 
    } 

} 

私が作成したMyNumbersrb_hi.propertiesのリソースバンドルです。

Default properties in Devnagari 
0=\u0915\u0916\u0917: 
1=\u090f\u0915: 
2=\u0926\u094b: 
3=\u0924\u0940\u0907: 
4=\u091a\u093e\u0930: 
5=\u092a\u093e\u091a: 
6=\u091b\u0947: 
7=\u0938\u093e\u0924: 
8=\u0906\u093e\u0920: 
9=\u0928\u094c: 
10=\u0926\u0938: 
random=Random 
title=Key in numbers to match the words 

答えて

0

ユニコードのラベルにフォントを設定しないでください。デフォルトのフォントは、それをうまく表現できます。

0

元の質問のように、この1 https://stackoverflow.com/a/6995374/466250 で試すには、プロパティファイルは、デフォルトではISO-8859-1ですと言います。

+0

私は既に非ASCII文字のプロパティファイルでシーケンスを使用していますので、変換する必要はありません。このファイルは、\ uシーケンスとunicode変数を持つプレーン・アスキー・ファイルであり、デバッグ・モードではそれ自身を正常にレンダリングできますが、スイングJLabelはそれをレンダリングしません。 – Miten

0

SymbolTextアプレットを実行し、900の範囲を選択して、使用しようとしているフォントを選択してみてください。結果をDevanagari MTのような標準フォントを選択すると比較してください。 JVM上のフォントのバージョンとTrueType実装との間に互換性がない可能性があります。

getFontName()、getNumGlyphs()、canDisplay()およびcanDisplayUpTo()を呼び出して、ロードしたフォントが期待どおりであることを確認してください。

EclipseはDevanagariをレンダリングできることが分かっているので、必要に応じてEclipseが使用するフォントを特定して使用してください。 UTF-8

のResourceBundleメッセージと

0

積載資源=にResourceBundle.getBundle( "リソース/ MenuBarResources"、ロケール、新しいUTF8Control())。

public class UTF8Control extends Control { 
public ResourceBundle newBundle 
    (String baseName, Locale locale, String format, ClassLoader loader, boolean reload) 
     throws IllegalAccessException, InstantiationException, IOException 
{ 
    // The below is a copy of the default implementation. 
    String bundleName = toBundleName(baseName, locale); 
    String resourceName = toResourceName(bundleName, "properties"); 
    ResourceBundle bundle = null; 
    InputStream stream = null; 
    if (reload) { 
     URL url = loader.getResource(resourceName); 
     if (url != null) { 
      URLConnection connection = url.openConnection(); 
      if (connection != null) { 
       connection.setUseCaches(false); 
       stream = connection.getInputStream(); 
      } 
     } 
    } else { 
     stream = loader.getResourceAsStream(resourceName); 
    } 
    if (stream != null) { 
     try { 
      // Only this line is changed to make it to read properties files as UTF-8. 
      bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8")); 
     } finally { 
      stream.close(); 
     } 
    } 
    return bundle; 
} 
}