【Android】XLIFF的应用

来源:互联网 发布:阿里云 邮件超时 编辑:程序博客网 时间:2024/06/08 14:04

今天看了一个google的demo,发现部分资源字符串在/res/values/string.xml中包含有类似xliff的节点,刚才查了一下,Xliff是XML Localization Interchange File Format 的缩写,中文名为XML本地化数据交换格式。

对于在Android的资源字符串中,可能会有类似下面的 <xliff:g id="FILE_NAME">%1$s</xliff:g> 写法,这里,id我们可以随便定义,后面的%1$s的1%表示这是第一个可替换量,s表示字符串

详细的介绍如下:

属性id可以随便命名 
属性example表示举例说明,可以省略 
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格 
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0 
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00

例如一个String中有多个需要替换的变量,可以在xml中定义如下变量: 

   <string name="info">
your name is <xliff:g id="NAME">%1$s</xliff:g>, and your age is
<xliff:g id="AGE">%2$s</xliff:g>
   </string>


程序中动态加载:

TextView tv = (TextView) findViewById(R.id.textView);

        String info = getResources().getString(R.string.info,"jnhoodlum","22");

        tv.setText(info);

 

最后要注意一点:在String里要增加XLIFF的 xmlns:

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">




在最近的一个开发中,有一个这样的小小需求,就是某一个标签存在三种状态: 
a、正在连接XXX设备 
b、已连接XXX设备 
c、与XXX设备已断开

从上面我们可以看出,不变的是XXX,我们在实际开发中很有可能遇到这样的情况。当然其解决办法也是有很多种,但是今天我想说的是可以利用XLIFF实现这种效果。

XLIFF全称为XML Localization Interchange File Format。维基百科给出的解释是:XLIFF(XML本地化交换文件格式)是创建标准化本地化的数据,在本地化过程和CAT工具文件的通用格式工具之间传递方式一种基于XML的格式。 XLIFF是由OASIS于2002年其目前的规范标准化是2.0,2014年8月5日公布。 
该规范的目的是在本地化行业。它指定的元素和属性来存储从各种原始文件格式及其相应的翻译提取的内容。我们的目标是从抽象与具体的格式,如HTML工程技术本地化的能力。XLIFF形成了XML创作和本地化(OAXAL)参考架构的开放式架构的一部分。 
这么好的东西,我们大Android欧巴肯定也要支持啊,的确在Android官方也有关于XLIFF的介绍,地址为:http://developer.android.com/distribute/tools/localization-checklist.html,(自备梯子)。

小伙伴们是不是迫不及待想知道如何在android中使用呢?现在跟随我的步伐一步步来实现吧! 
首先我们打开我们的string.xml添加如下字符串:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">    <string name="app_name">XLIFF</string>    <string name="bt_connectioning">正在连接<xliff:g id="device_name">%1$s</xliff:g>设备</string>    <string name="bt_connectioned">已连接<xliff:g id="device_name">%1$s</xliff:g>设备</string>    <string name="bt_connection_failed"><xliff:g id="device_name">%1$s</xliff:g>设备已断开</string></resources>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意两点: 
a、我们在中新增了一个命名空间:xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" 
b、我们在标签中又嵌套了一个子标签:<xliff:g id="device_name">%1$s</xliff:g>

<xliff:g id="device_name">%1$s</xliff:g>
  • 1

device_name:这个名字名字你可以随便写,阿猫阿狗你喜欢就好 
%1:表示替换第一个 
s:表示字符串

例如: 
在java代码中使用:<xliff id="a_mao_or_a_gou">%1$s</xliff:g> 
getString(R.string.yourstring,”不变的字符串”);

其他用法:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- Example placeholder for a special unicode symbol --><string name="star_rating">Check out our 5    <xliff:g id="star">\u2605</xliff:g></string><!-- Example placeholder for a for a URL --><string name="app_homeurl">    Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g></string><!-- Example placeholder for a name --><string name="prod_name">    Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g></string><!-- Example placeholder for a literal --><string name="promo_message">    Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>” to get a discount.</string>...</resources>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

给一个例子代码,当然你可以根据服务返回不同的状态自己去改变,只是我给的例子是三个按钮而已:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Button mBtnChange1;    private Button mBtnChange2;    private Button mBtnChange3;    private TextView mTvState;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView()    {        mBtnChange1 = (Button) findViewById(R.id.btn_change1);        mBtnChange1.setOnClickListener(this);        mBtnChange2 = (Button) findViewById(R.id.btn_change2);        mBtnChange2.setOnClickListener(this);        mBtnChange3 = (Button) findViewById(R.id.btn_change3);        mBtnChange3.setOnClickListener(this);        mTvState = (TextView) findViewById(R.id.tv_state);    }    @Override    public void onClick(View v)    {        Message msg = Message.obtain();        switch (v.getId())        {            case R.id.btn_change1:                msg.what = 1;                myHandler.sendMessage(msg);                break;            case R.id.btn_change2:                msg.what = 2;                myHandler.sendMessage(msg);                break;            case R.id.btn_change3:                msg.what = 3;                myHandler.sendMessage(msg);                break;            default:                break;        }    }    Handler myHandler = new Handler()    {        @Override        public void handleMessage(Message msg)        {            switch (msg.what)            {                case 1:                    setState(getString(R.string.bt_connectioning, "XXX"));                    break;                case 2:                    setState(getString(R.string.bt_connectioned, "XXX"));                    break;                case 3:                    setState(getString(R.string.bt_connection_failed, "XXX"));                    break;            }        }    };    private void setState(String state)    {        mTvState.setText(state);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
原创粉丝点击