本地化测试,用 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 格式化所有字符串的主要内容,如果未能解决你的问题,请参考以下文章

java包路径解析成json

输入控制

1009 说反话

1009 说反话

1009 说反话

1009. 说反话