2012-09-21 6 views
7

Ich versuche, i18n in Java für devanagari/hindi mit Beispiel-ttf-Dateien aus dem Internet zu verwenden.devanagari i18n in Java

Ich bin in der Lage, Ressourcen-Bundle-Einträge zu laden und laden Sie auch die TTF und Schriftart, aber es wird jlabel nicht wie gewünscht rendern. Es zeigt Blöcke anstelle von Zeichen. Wenn ich in Eclipse debugge, kann ich über die Unicode-Variable schweben und es macht sogar devanagari. Unten ist Code und Ressourcenpaket als Referenz.

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"); 
    } 

} 

Hier ist das Ressourcenpaket für MyNumbersrb_hi.properties, das ich erstellt habe.

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 

Antwort

0

Setzen Sie die Schriftart nicht auf die Beschriftung für Unicode und Standardschriftart ist in der Lage, es gut zu machen.

0

Versuch mit diesem https://stackoverflow.com/a/6995374/466250 als die ursprüngliche Frage sagt Eigenschaftsdateien sind ISO-8859-1 standardmäßig.

+0

Ich benutze bereits \ u Sequenz in Eigenschaften Dateien für nicht ASCII-Zeichen, so dass ich keine Konvertierung vornehmen muss. Die Datei ist eine einfache Ascii-Datei mit \ u Sequenz und Unicode-Variable ist in der Lage, sich im Debug-Modus gut zu machen, aber nur das Swing JLabel ist es nicht zu rendern. – Miten

0

Versuchen Sie, das SymbolText-Applet auszuführen, wählen Sie den 900-Bereich aus, und wählen Sie die Schriftart aus, die Sie verwenden möchten. Vergleichen Sie die Ergebnisse mit der Auswahl einer Standardschrift wie Devanagari MT. Möglicherweise besteht eine Inkompatibilität zwischen Ihrer Version der Schriftart und der TrueType-Implementierung auf Ihrer JVM.

Versuchen Sie, getFontName(), getNumGlyphs(), canDisplay() und canDisplayUpTo() aufzurufen, um sicherzustellen, dass die von Ihnen geladene Schriftart Ihren Erwartungen entspricht.

Da Sie wissen, dass Eclipse Devanagari rendern kann, versuchen Sie, die Schriftart, die Eclipse verwendet, zu identifizieren und zu verwenden, falls erforderlich.

0

Last Ressource mit UTF-8

Resource messages = ResourceBundle.getBundle ("resources/MenuBarResources", Gebietsschema, New 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; 
} 
}