从一开始就犯了不将我的应用程序构建为对翻译友好的错误,我现在正处于追溯这样做的艰巨过程中......
我的应用程序涉及语音识别,因此语言差异在代码本身中很常见,而不仅仅是在可能更常见的布局和描述中。
因此,我可能比大多数人更关心使用 XML 字符串资源的性能成本,并再次权衡为每种语言编写新代码/类的巨大努力。
这是一个示例类,我希望通过一点想象力可以让您了解我的困惑:
private static Pattern pWIFI = Pattern.compile(".*\\bwifi\\b.*");
private static Pattern pMOBD = Pattern.compile(".*\\bdata\\b.*");
private static Pattern pBLUE = Pattern.compile(".*\\bbluetooth\\b.*");
private static Pattern pAIRPLANE = Pattern.compile(".*\\bairplane\\b.*");
private static Pattern pAEROPLANE = Pattern.compile(".*\\baeroplane\\b.*");
public class MatchingAndReplacingStuff {
for (String vd : voiceData) {
vd = vd.toLowerCase(loc).trim();
if (vd.startsWith(ctx.getString(R.string.KEYBOARD_)) || vd.startsWith(ctx.getString(R.string.KEY_BOARD_))
|| vd.startsWith(ctx.getString(R.string.KEYBOARDS_))
|| vd.startsWith(ctx.getString(R.string.KEY_BOARDS_)) || vd.startsWith(ctx.getString(R.string.KEYBORD_))
|| vd.startsWith(ctx.getString(R.string.KEYBORDS_))) {
vd = vd.replaceFirst(ctx.getString(R.string.KEYBOARDS_), "");
vd = vd.replaceFirst(ctx.getString(R.string.KEYBOARD_), "");
vd = vd.replaceFirst(ctx.getString(R.string.KEY_BOARD_), "");
vd = vd.replaceFirst(ctx.getString(R.string.KEY_BOARDS_), "");
vd = vd.replaceFirst(ctx.getString(R.string.KEYBORD_), "");
vd = vd.replaceFirst(ctx.getString(R.string.KEYBORDS_), "");
vd = vd.replaceFirst(ctx.getString(R.string.GOOGLE_VOICE_TYPING), ctx.getString(R.string.GOOGLE_SEARCH));
vd = vd.replaceFirst(ctx.getString(R.string.VOICE_TYPING), ctx.getString(R.string.GOOGLE_SEARCH));
vd = vd.replaceFirst(ctx.getString(R.string.VOICE_INPUT), ctx.getString(R.string.GOOGLE_SEARCH));
vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEYBOARD), ctx.getString(R.string.GOOGLE_SEARCH));
vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEYBORD), ctx.getString(R.string.GOOGLE_SEARCH));
vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEY_BOARD), ctx.getString(R.string.GOOGLE_SEARCH));
voiceDataUpdated.add(vd.trim());
}
}
// loop again and compare Strings in voiceDataUpdated to Patterns compiled above
}
假设蓝牙和 WiFi 以及上述所有其他 R.String 在每种语言中都不同,我会遇到以下性能/正确性/翻译问题:
1)是否应该ctx.getString(R.string
在循环之前将每个都分配给一个字符串?语音数据字符串的最大数量约为 30 - 那么性能是否值得考虑?对于将来阅读这个问题的其他人,是否有一个应该考虑的阈值?
2)作为编译模式需要一个上下文(当获取字符串资源时),下面的变体是否可能?
Pattern.compile(".*\\bctx.getString(R.string.SOMETHING\\b.*"); <-- pseudo code
3)如果问题 2 的答案是否定的,但是 Patterns 可以以这种方式编译,我应该编译它们,还是只构建一个 String 来比较 - 或者甚至不打扰?!
最后一个问题是:当我处理循环最多包含 300 个条目的字符串数组时,我是否应该完全忘记性能(在合理范围内)!?
^ 我喜欢认为在构建我的代码时,我在可读性和性能之间找到了一个快乐的媒介,但是如果我忘记了性能(仅由于上述原因以及我的循环大小有限),我真的需要一些人们向我保证这是正确的做法!
我提前谢谢你