2012-09-21 3 views
7

Sto provando ad usare i18n in java per devanagari/hindi usando file ttf di esempio da internet.devanagari i18n in java

Sono in grado di caricare le voci del bundle delle risorse e anche caricare il TTF e impostare il font ma non renderà jlabel come desiderato. Mostra blocchi al posto dei personaggi. Se eseguo il debug in eclissi, posso passare il mouse sopra la variabile unicode e rende persino devanagari. Di seguito è riportato il codice e il pacchetto di risorse per riferimento.

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

} 

Ecco il pacchetto di risorse per MyNumbersrb_hi.properties che ho creato.

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 

risposta

0

Semplicemente non impostare il carattere sull'etichetta per Unicode e il font predefinito è in grado di renderlo corretto.

0

prova con questo https://stackoverflow.com/a/6995374/466250 come la domanda originale dice file di proprietà sono ISO-8859-1 per impostazione predefinita.

+0

Ho già utilizzato la sequenza \ u nei file delle proprietà per caratteri non ASCII quindi non è necessario eseguire alcuna conversione. Il file è un semplice file ascii con la sequenza \ u e la variabile unicode è in grado di renderizzare correttamente la modalità di debug ma solo che swing JLabel non lo sta rendendo. – Miten

0

Provare a eseguire l'applet SymbolText, selezionare l'intervallo 900 e selezionare il carattere che si sta tentando di utilizzare. Confronta i risultati selezionando un font standard come Devanagari MT. Potrebbe esserci un'incompatibilità tra la versione del font e l'implementazione TrueType su JVM.

Prova a chiamare getFontName(), getNumGlyphs(), canDisplay() e canDisplayUpTo() per verificare che il carattere che hai caricato sia quello che ti aspetti.

Poiché si sa che Eclipse può eseguire il rendering di Devanagari, provare ad identificare e utilizzare il carattere utilizzato da Eclipse, se necessario.

0

risorse di carico con i messaggi UTF-8

ResourceBundle = ResourceBundle.getBundle ("Risorse/MenuBarResources", locale, nuova 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; 
} 
}