Android(Java)国际化:布局XML中xliff:g默认值失效问题求助
Android中xliff:g标签example属性在XML布局中不生效的问题
问题描述
在Android Studio做i18n国际化开发时,使用<xliff:g>标签实现字符串变量注入,Java代码中通过getString()调用时显示正常,但XML布局直接引用对应字符串时,只会显示占位符%1$s,<xliff:g>的example属性完全不起作用。
示例代码
strings.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="starting">Start: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string> <string name="end">Arrival: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string> <string name="beginning_default">• Beginning: <xliff:g id="unknown_start_date" example="21 august 2022 at 14h21">%1$s</xliff:g></string> <string name="ending_default">• End: <xliff:g id="unknown_end_date" example="22 august 2022 at 14h20">%1$s</xliff:g></string> </resources>
布局文件(activity_layout.xml)
<TextView android:id="@+id/startPositionText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:text="@string/starting" android:textColor="@color/white" android:textSize="20sp" /> <TextView android:id="@+id/endPositionText" android:layout_below="@id/startPositionText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:text="@string/end" android:textColor="@color/white" android:textSize="20sp" /> <TextView android:id="@+id/startText" android:layout_below="@+id/endPositionText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/beginning_default" android:textColor="@color/white" android:textSize="17sp" /> <TextView android:id="@+id/endText" android:layout_below="@id/startText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ending_default" android:textColor="@color/white" android:textSize="17sp" />
原因分析
<xliff:g>的example属性仅作为翻译参考,用于告诉翻译人员该占位符对应的内容格式或示例,并非占位符的默认替换值,没有自动填充占位符的功能。- Java代码中
getString()能正常显示是因为你主动传入了替换参数(比如传入了example中的字符串),而XML布局直接引用字符串时,没有传递任何替换参数,系统只能原样输出占位符。
解决方法
方法一:在代码中传入替换参数
在Activity/Fragment中通过代码给TextView设置文本时,传入占位符对应的参数:
// 位置相关文本 startPositionText.setText(getString(R.string.starting, "Unknown position")); endPositionText.setText(getString(R.string.end, "Unknown position")); // 日期相关文本 startText.setText(getString(R.string.beginning_default, "21 august 2022 at 14h21")); endText.setText(getString(R.string.ending_default, "22 august 2022 at 14h20"));
方法二:使用DataBinding直接在布局中传参
如果项目使用DataBinding,可以直接在布局中传递参数,无需在代码中处理:
<TextView android:id="@+id/startPositionText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:text="@{@string/starting(`Unknown position`)}" android:textColor="@color/white" android:textSize="20sp" />
方法三:定义固定字符串(无需动态替换时)
如果占位符内容不需要动态修改,可以直接把默认值写入字符串资源,去掉占位符:
<string name="starting">Start: Unknown position.</string>
内容的提问来源于stack exchange,提问作者Pioupia
相关产品推荐
相关产品推荐

