2012-09-21 21 views
7

Estoy tratando de usar i18n en Java para devanagari/hindi usando archivos ttf de ejemplo de Internet.devanagari i18n en java

Puedo cargar entradas de paquete de recursos y también cargar el ttf y establecer la fuente, pero no mostrará jlabel como se desee. Muestra bloques en lugar de caracteres. Si depuro en eclipse puedo pasar el mouse sobre la variable Unicode e incluso representa devanagari. A continuación se encuentra el paquete de código y recursos para referencia.

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

} 

Aquí hay un paquete de recursos para MyNumbersrb_hi.properties que creé.

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 

Respuesta

0

Simplemente no establezca la fuente en la etiqueta para unicode y la fuente predeterminada puede procesarla bien.

0

intentarlo con éste https://stackoverflow.com/a/6995374/466250 como la pregunta original dice archivos de propiedades son ISO-8859-1 por defecto.

+0

Ya uso \ u secuencia en los archivos de propiedades para caracteres que no son ASCII, así que no necesito hacer ninguna conversión. El archivo es un archivo ascii simple con \ u secuencia y la variable unicode puede renderizarse bien en el modo de depuración, pero es solo ese swing que JLabel no lo está renderizando. – Miten

0

Intente ejecutar el applet SymbolText, seleccione el rango 900 y seleccione la fuente que está tratando de usar. Compare los resultados con la selección de una fuente estándar como Devanagari MT. Puede haber una incompatibilidad entre su versión de la fuente y la implementación de TrueType en su JVM.

Intente llamar a getFontName(), getNumGlyphs(), canDisplay() y canDisplayUpTo() para verificar que la fuente que ha cargado es la esperada.

Dado que sabe que Eclipse puede representar Devanagari, intente identificar y usar la fuente que utiliza Eclipse, si es necesario.

0

carga de recursos con mensajes UTF-8

ResourceBundle = ResourceBundle.getBundle ("recursos/MenuBarResources", la configuración regional, nuevo 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; 
} 
}