2

我们正在尝试优化我们的本地化测试。

我们的 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

4

6 回答 6

3

如果这种方法是在应用程序中突出显示格式化字符串(或格式序列)(即所有文本都出现在 XXXX 之外),您可以找到转义序列(可能使用正则表达式)并在格式化(替换)值周围插入块引号,
例如一些\n文本 -> 一些[\n]文本

您可以获得可读性(所有字符串为 XXX 可能难以使用应用程序)并且还可以检测非资源(硬编码)字符串。

话虽如此,如果您要检测非资源加载的字符串(硬编码字符串),而不是替换 X,为什么不只是为字符串添加前缀呢?您将能够轻松地从硬编码字符串中区分资源加载字符串,
例如 Some\ntext -> [EN]Some\ntext

希望能帮助到你?

于 2008-10-10T07:01:38.347 回答
1

appTranslator的伪本地化功能可以帮助您:它修改未翻译的字符串以使用变音符号、文本加宽或缩短等。到目前为止,你不感兴趣。有趣的是,它可以选择将这些字符串括在括号中。这个想法是为了让字符串是伪本地化的更加明显。您可以使用它来检测字符串实际上来自字符串表而不是代码。

当然,由于伪本地化程序必须正确运行,所以 appTranslator 会保留所有格式化程序(包括类似 printf 和类似 FormatMessage 的格式化程序)和特殊字符,例如 % 或 \n。这就是你要找的。

您甚至不必修改您的代码:只需创建一个“虚拟”翻译。我所说的“虚拟”是指您不打算将您的应用程序翻译成的语言。将您的应用程序的语言首选项设置为该语言。等等,更好的是:QA 的人可以完全靠自己完成。他们甚至不必打扰你!:-)

免责声明:我是 appTranslator 的作者。

编辑:回答您的评论:很高兴看到您已经在使用 appTranslator。为避免由于对话框或字符串不在 L10N DLL 中而导致的问题,您可以简单地重新构建 DLL(例如,在 VS 项目中使用链接后步骤)。该过程会自动重新扫描源 exe 并在构建的资源 dll 中合并新的和修改的文本(不影响 appTranslator 项目文件,而不是“更新源”)。这有助于确保您的资源 DLL 始终与您的 exe 同步。

于 2008-10-10T10:45:33.513 回答
0

您可以在这里应用编译器理论并使用flex/bison(lex/yacc 或任何工具)生成您的扫描仪和解析器。您可以将 \w+ 定义为单词,它可以匹配“Hello”和“World”等。

于 2008-10-10T06:20:57.667 回答
0

如果您的软件支持语言环境,我认为您需要的是 XXXX 语言环境。

你用英语开发它,然后切换到 XXXX 语言环境以确保所有内容都是可翻译的。

于 2008-10-10T08:24:00.117 回答
0

我的最终解决方案是为字符串添加前缀,例如“* [资源实例名称]原始字符串”。它工作得非常好,它显示了可能不适合说德语的字符串。

例子:

来自 appres.dll 的原始字符串“我的应用程序”

appres.dll 中的新字符串“*[appres]My Application”。

感谢所有的建议。

于 2008-10-16T09:57:54.873 回答
0

我更喜欢我们在 Microsoft 时使用的伪本地化机制,其中包括在每个本地化资源周围放置大括号。例如,资源 => [-Resource-]。然后你总是可以告诉你有一个组合字符串,并且格式通常不会改变,除非换行规则。

我们通常还会进行一些字符串扩展(在原始字符串周围添加各种字符),以及一些基于字典或随机化的字符替换(将“o”转换为“ö”)。

一些团队还将文字资源标识符(名称)作为本地化资源的值,这对本地化人员比对测试人员更有用,因为他们可以看到资源在 UI 中实际使用的位置。

于 2008-12-20T05:08:41.603 回答