Android 不同顺序的 kotlin 字符串格式
Android kotlin string formats in different orders
我有一些本地化的字符串格式,格式参数的顺序不同。例如,我有短语 synced 12 files on 6/29/2018 将显示给用户。 12 和 6/29/2018 只是占位符。所以我的资源中的字符串看起来像
<string name="n_synced_on_date" formatted="false">"%d files synced on %s"</string>
麻烦的是有些译者想写
<string name="n_synced_on_date" formatted="false">"bla %s bla bla bla %d bla"</string>
所以当我 运行 我的代码
text = String.format(getString(R.string.n_synced_on_date), numberOfFiles, dateString)
任何反转格式参数的语言都会崩溃。
我希望我可以使用 Kotlin 字符串模板,这样我的资源就可以定义为
<string name="n_synced_on_date" formatted="false">"$NUMBER files synced on $DATESTRING"</string>
这将允许翻译人员以任何顺序放置单词,但根据此 link How to apply template to a string returned from a function 这是不可能的。
我目前糟糕的做法是捕获数字格式异常并尝试将参数反转的字符串格式。我希望找到一个干净的解决方案。
正如 this answer 所解释的那样,您可以像这样为参数提供索引:
<string name="n_synced_on_date" formatted="false">"%1$d files synced on %2$s"</string>
<string name="n_synced_on_date" formatted="false">"bla %2$s bla bla bla %1$d bla"</string>
然后您可以 运行 代码,就像您已经在做的那样:
String.format(getString(R.string.n_synced_on_date), numberOfFiles, dateString)
我有一些本地化的字符串格式,格式参数的顺序不同。例如,我有短语 synced 12 files on 6/29/2018 将显示给用户。 12 和 6/29/2018 只是占位符。所以我的资源中的字符串看起来像
<string name="n_synced_on_date" formatted="false">"%d files synced on %s"</string>
麻烦的是有些译者想写
<string name="n_synced_on_date" formatted="false">"bla %s bla bla bla %d bla"</string>
所以当我 运行 我的代码
text = String.format(getString(R.string.n_synced_on_date), numberOfFiles, dateString)
任何反转格式参数的语言都会崩溃。
我希望我可以使用 Kotlin 字符串模板,这样我的资源就可以定义为
<string name="n_synced_on_date" formatted="false">"$NUMBER files synced on $DATESTRING"</string>
这将允许翻译人员以任何顺序放置单词,但根据此 link How to apply template to a string returned from a function 这是不可能的。
我目前糟糕的做法是捕获数字格式异常并尝试将参数反转的字符串格式。我希望找到一个干净的解决方案。
正如 this answer 所解释的那样,您可以像这样为参数提供索引:
<string name="n_synced_on_date" formatted="false">"%1$d files synced on %2$s"</string>
<string name="n_synced_on_date" formatted="false">"bla %2$s bla bla bla %1$d bla"</string>
然后您可以 运行 代码,就像您已经在做的那样:
String.format(getString(R.string.n_synced_on_date), numberOfFiles, dateString)