转自http://blog.chengyunfeng.com/?p=579
Phrase 是一个用来替代 Android 中字符串格式化功能的小型类库。解决了在实际开发中遇到的几个问题。这些问题如下:
假如有这么一个 字符串定义:
<string name="greeting"> Hello %1$s, today\'s cook yielded %2$d %3$s. </string>
使用 Resources 的 getString(…) 函数可以很方便的格式化其内容:
String name = "Walter"; int yield = 50; String unit = "pounds"; String greeting = context.getString(R.string.greeting, name, yield, unit);
但是这里的 %1$s 和 %2$d 是非常程序话的,不查看文本内容根本无法知道其代表的含义,另外 ,多个参数的顺序也非常重要,如果搞错了,显示的内容就错了。
另外 getString(…) 函数还无法处理 HTML 格式化标签。例如 文字加粗、斜体等。 该函数会把这些基本标签给过滤掉。
Phrase
Phrase 使用 命名参数的解决方式,例如:
<string name="greeting"> Hello {name}, today\'s cook yielded {yield} {unit}. </string>
为了减少翻译这些字符串出错的可能性,所以规则制定的比较粗暴:
- 使用大括号来环绕一个参数,文本中的大括号需要使用两个大括号来表示
- 参数的名字需要依靠小写字母开始,后面只能跟小写字母和下划线
然后使用如下方式来格式化该字符串:
// 这里 put(...) 函数的调用顺序是无关紧要的 CharSequence greeting = Phrase.from(context, R.string.greeting) .put("unit", unit) .put("name", name) .put("yield", yield) .format();
注意, Phrase 返回的是一个 CharSequence 而不是 String, 这样可以支持基本的格式化字符串。例如:
<string name="did_you_learn"> <!-- class_type is something like Chemistry. --> Did you learn <b>nothing</b> from my {class_type} class? </string>
另外,为了避免文本显示错误,当遇到如下问题的时候, Phrase 就即刻抛出错误:
- 命名参数不规范或者缺少配对的大括号
put(...)函数参数不能为 nullput(...)的 key 在格式化字符串中不存在- 调用
format()的时候还有 参数 没赋值的情况
paraphrase
paraphrase 虽然使用 Phrase 来格式化字符串,减少了翻译字符和格式化字符串出错的可能性,但是使用起来还是有点麻烦,而 paraphrase 这个 Gradle 插件使 Phrase 的使用更加方便。
例如:
<string name="greeting">Hello, {other_name}! My name is {my_name}.</string>使用 Gradle 编译后可以这样用 Phrase:
CharSequence greeting = Phrase.greeting()
.other_name("GitHub user")
.my_name("Jake Wharton")
.build(this);
如果你在翻译的时候,错误的修改了字符串:
<string name="greeting">Hello! My name is {my_name}.</string>
Example.java:34: error: cannot find symbol .other_name("GitHub user") ^ symbol: method other_name(String) location: class Phrase_greeting
现在编译项目的时候就会报错,而不是在运行应用的时候 Crash。
在项目中的 build.gradle 配置文件中添加如下内容来使用 paraphrase:
buildscript {
repositories {
mavenCentral()
maven url: 'http://oss.sonatype.org/content/repositories/snapshots/'
}
dependencies {
classpath 'com.android.tools.build:gradle:0.8.+'
classpath 'com.jakewharton.paraphrase:paraphrase:1.0.0-SNAPSHOT'
}
}
apply plugin: 'android'
apply plugin: 'paraphrase'
Read more: http://blog.chengyunfeng.com/?p=579#ixzz2z6izBfJJ
Phrase简化Android字符串格式化
Phrase是一个小型类库,用于简化Android中字符串的格式化工作。通过使用命名参数,它提高了代码的可读性和维护性,并支持HTML标签,避免了运行时错误。Paraphrase插件进一步简化了Phrase的使用。
6701

被折叠的 条评论
为什么被折叠?



