devanagari i18n in java

早过忘川 提交于 2019-12-08 19:08:53

问题


I am trying to use i18n in java for devanagari/hindi using sample ttf files from internet.

I am able to load resource bundle entries and also load the ttf and set font but it will not render jlabel as desired. It shows blocks in place of characters. If I debug in eclipse I can hover over the unicode variable and it even renders devanagari. Below is code and resource bundle for reference.

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

}

Here is resource bundle for MyNumbersrb_hi.properties I created.

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

回答1:


try with this one https://stackoverflow.com/a/6995374/466250 as the original question says property files are ISO-8859-1 by default.




回答2:


Just do not set the font on label for unicode and default font is able to render it fine.




回答3:


Try running the SymbolText applet, select the 900 range, and select the font you are trying to use. Compare the results with selecting a standard font such as Devanagari MT. There may be an incompatibility between your version of the font and the TrueType implementation on your JVM.

Try calling getFontName(), getNumGlyphs(), canDisplay() and canDisplayUpTo() to verify the font you've loaded is what you expect.

Since you know Eclipse can render Devanagari, try to identify and use the font Eclipse uses, if necessary.




回答4:


Load Resource with utf-8

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


来源:https://stackoverflow.com/questions/12532056/devanagari-i18n-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!