Android开发笔记(八十三)多语言支持

本文探讨了Android应用中实现多语言支持的方法,包括使用Android自带的库和pinyin4j库进行汉字转拼音的处理,以及如何为应用添加国际语言版本。
摘要由CSDN通过智能技术生成

汉字转拼音

app中有许多场景要对汉字排序,例如通讯录姓名、商品名称、城市名称等等,这些汉字词汇通常是按照拼音排序,所以产生了把汉字转换为拼音的需求。


Android自带库

Android自带的联系人应用,就支持对联系人按照姓名排序,内置汉字转拼音的源码位于路径“packages\providers\ContactsProvider\src\com\android\providers\contacts\HanziToPinyin.java”。该工具类早期的源码,直接把字符集合写在java文件中,这种做法在4.2以上版本不能正常工作。4.2以上的工具源码改为调用底层的jni接口,具体说来,便是HanziToPinyin.java引用了核心库libcore.icu的Transliterator类,Transliterator内部有提供数个native方法。


不管是HanziToPinyin类还是Transliterator类,都属于系统源码,不属于sdk源码,也就是说,app开发无法直接调用这两个类的方法。只能是把这两个类的java文件直接复制到app工程中,才能正常调用其中的api。同时注意,Transliterator.java必须放在名称是libcore.icu的包路径下,因为该类引用了jni接口,而jni接口要求包名、类名、方法名都保持一致才能正常运行,jni的详细说明参见《 Android开发笔记(六十九)JNI实战》。


下面是HanziToPinyin.java的源码:
import android.text.TextUtils;
import android.util.Log;

import java.util.ArrayList;

import libcore.icu.Transliterator;

public class HanziToPinyin {
    private static final String TAG = "HanziToPinyin";

    private static HanziToPinyin sInstance;
    private Transliterator mPinyinTransliterator;
    private Transliterator mAsciiTransliterator;

    public static class Token {
        public static final String SEPARATOR = " ";
        public static final int LATIN = 1;
        public static final int PINYIN = 2;
        public static final int UNKNOWN = 3;

        public Token() {
        }

        public Token(int type, String source, String target) {
            this.type = type;
            this.source = source;
            this.target = target;
        }

        public int type;
        public String source;
        public String target;
    }

    private HanziToPinyin() {
        try {
        	mPinyinTransliterator = new Transliterator("Han-Latin/Names; Latin-Ascii; Any-Upper");
        	mAsciiTransliterator = new Transliterator("Latin-Ascii");
        } catch (RuntimeException e) {
            Log.w(TAG, "Han-Latin/Names transliterator data is missing," + " HanziToPinyin is disabled");
        }
    }

    public boolean hasChineseTransliterator() {
        return mPinyinTransliterator != null;
    }

    public static HanziToPinyin getInstance() {
        synchronized (HanziToPinyin.class) {
            if (sInstance == null) {
                sInstance = new HanziToPinyin();
            }
            return sInstance;
        }
    }

    private void tokenize(char character, Token token) {
        token.source = Character.toString(character);

        // ASCII
        if (character < 128) {
            token.type = Token.LATIN;
            token.target = token.source;
            return;
        }

        // Extended Latin. Transcode these to ASCII equivalents
        if 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值