本地化测试,用 XXXXX 格式化所有字符串
Posted
技术标签:
【中文标题】本地化测试,用 XXXXX 格式化所有字符串【英文标题】:Localization testing, formatting all strings with XXXXX 【发布时间】:2008-10-10 05:45:27 【问题描述】:我们正在尝试优化我们的本地化测试。
我们的 QA 小组提出了一种特殊模式的建议,以强制资源中的所有字符串完全包含在 X 中。我们已经 API 劫持了 LoadString,以及它的 MFC 实现,所以这样做应该不是主要障碍。
我的问题是如何解决格式问题?
Examples -
CString str ;
str . LoadString ( IDS_MYSTRING ) ;
where IDS_MYSTRING is "Hello World", should return "XXXXX XXXXX"
where IDS_MYSTRING is "Hello\nWorld", should return "XXXXX\nXXXXX"
where IDS_MYSTRING is "Hello%dWorld", should return "XXXXX%dXXXXX"
where IDS_MYSTRING is "Hello%.2fWorld", should return "XXXXX%.2fXXXXX"
where IDS_MYSTRING is "Hello%%World", should return "XXXXX%%XXXXX"
所以总而言之,如果在 printf 或 Format 语句中使用该字符串应该可以工作,它应该支持转义字符。
所以这是一个纯代码问题,C++/MFC,
CString ConvertStringToXXXX ( const CString& aSource )
CString lResult = aSource ;
// Insert your code here
return lResult ;
我知道这可以使用 .RC 文件上的工具来完成,但我们想构建英语,然后像这样运行 -
应用程序-L10NTEST
【问题讨论】:
将文本转换为 Xes 的目标是什么?确定任何缺失的(非资源绑定)字符串? 是的,我们想运行一些基本的自动化测试来检查没有引入硬编码字符串。 【参考方案1】:如果这种方法是在应用程序中突出显示格式化的字符串(或格式序列)(即所有出现 XXXX 以外的文本),您可以找到转义序列(可能使用正则表达式)并在格式化(替换)周围插入块引号值,例如一些\n文本 -> 一些[\n]文本
您可以获得可读性(所有字符串为 XXX 可能难以在应用程序中使用),并且还可以检测非资源(硬编码)字符串。
话虽如此,如果您要检测非资源加载字符串(硬编码字符串),而不是替换 Xs,为什么不只是为字符串添加前缀呢?您将能够轻松地从硬编码字符串中区分资源加载字符串, 例如一些\n文本 -> [EN]一些\n文本
希望有帮助吗?
【讨论】:
其实前缀是个好主意,我下周试试,简单的解决方案总是更好。【参考方案2】:appTranslator 的伪本地化功能可以帮助您:它修改未翻译的字符串以使用变音符号、文本加宽或缩短等。到目前为止,你不感兴趣。有趣的是,它可以选择将这些字符串括在括号中。这个想法是为了让字符串是伪本地化的更加明显。您可以使用它来检测字符串实际上来自字符串表而不是代码。
当然,由于伪本地化程序必须正确运行,所以 appTranslator 会保留所有格式化程序(包括类似 printf 和类似 FormatMessage 的格式化程序)和特殊字符,例如 % 或 \n。这就是你要找的。p>
您甚至不必修改您的代码:只需创建一个“虚拟”翻译。我所说的“虚拟”是指您不打算将您的应用程序翻译成的语言。将您的应用程序的语言首选项设置为该语言。 等等,更好的是:QA 的人可以完全靠自己完成。他们甚至不必打扰你! :-)
免责声明:我是 appTranslator 的作者。
编辑:回答您的评论: 很高兴看到您已经在使用 appTranslator。 为了避免由于 L10N DLL 中没有的对话框或字符串导致的问题,您可以简单地重新构建 DLL(例如,在 VS 项目中使用链接后步骤)。该过程会自动重新扫描源 exe 并在构建的资源 dll 中合并新的和修改的文本(不影响 appTranslator 项目文件,而不是“更新源”)。这有助于确保您的资源 DLL 始终与您的 exe 同步。
【讨论】:
其实我们几年前买过你们的产品,我个人用过很多次,我想我们可能要重温一下了!虽然这个解决方案可以工作,但它每天都会发生变化,它仍然有可能引入 L10N DLL 中没有的错误、对话框或字符串。 我看不出加泰罗尼亚语翻译应该比其他翻译更愚蠢。也许您的意思是“一个不包含在要求中的翻译”,但是加泰罗尼亚语有很多软件,所以这不是一个很好的例子。 丹尼尔,不知何故,我知道加泰罗尼亚的某个人有一天会抱怨 :-( 是的,我知道很多软件都被翻译成加泰罗尼亚语。但是这些“批次”可能比适用的批次小很多德语、日语等……对吗? 是的,它们更小。无意冒犯,我知道这是您在应用中碰巧没有使用的语言示例。【参考方案3】:您可以在此处应用编译器理论并使用flex/bison(lex/yacc 或任何工具)生成您的扫描器和解析器。您可以将\w+定义为单词,它可以匹配“Hello”和“World”等。
【讨论】:
【参考方案4】:如果您的软件支持语言环境,我认为您需要的是 XXXX 语言环境。
你用英语开发它,然后切换到 XXXX 语言环境以确保所有内容都是可翻译的。
【讨论】:
【参考方案5】:我的最终解决方案是为字符串添加前缀,如“* [资源实例名称]原始字符串”。它工作得非常好,它显示了可能不适合说德语的字符串。
例子:
appres.dll 中的原始字符串,“我的应用程序”
来自 appres.dll 的新字符串,“*[appres]My Application”。
感谢所有建议。
【讨论】:
【参考方案6】:我更喜欢我在 Microsoft 时用于伪本地化的机制,其中包括在每个本地化资源周围放置大括号。例如,资源 => [-Resource-]。然后你总是可以告诉你有一个组合字符串,并且格式通常不会改变,除非换行规则。
我们通常还会做一些字符串扩展(在原始字符串周围添加各种字符),以及一些基于字典或随机化的字符替换(将“o”转换为“ö”)。
一些团队还将文字资源标识符(名称)作为本地化资源的值,这对本地化人员比对测试人员更有用,因为他们可以看到资源在 UI 中的实际使用位置。
【讨论】:
以上是关于本地化测试,用 XXXXX 格式化所有字符串的主要内容,如果未能解决你的问题,请参考以下文章