如何在本地化Qt应用程序中自动检测截止(过长)字符串?

如何在本地化Qt应用程序中自动检测截止(过长)字符串?,qt,localization,internationalization,Qt,Localization,Internationalization,在我的Qt应用程序中,我有许多不同的屏幕,其中包含使用Qt的tr()的本地化小部件。要确定字符串是否在不被截断的情况下正确显示,我们有以下工作流: 开发人员隐式检查英文版本 母语人士使用自动生成的屏幕截图或直接使用应用程序手动查看翻译版本 问题在于,手动审查流程无法覆盖100%的字符串,因为某些文本仅针对某些错误或审查人员无法轻松复制的场景显示。俄语或德语等语言的单词往往比英语长得多 您知道哪些方法可以检查软件翻译版本中的截止/过长字符串? 我考虑过但不满意的方法: 我可以自动循环应用程序中的

在我的Qt应用程序中,我有许多不同的屏幕,其中包含使用Qt的tr()的本地化小部件。要确定字符串是否在不被截断的情况下正确显示,我们有以下工作流:

  • 开发人员隐式检查英文版本
  • 母语人士使用自动生成的屏幕截图或直接使用应用程序手动查看翻译版本
  • 问题在于,手动审查流程无法覆盖100%的字符串,因为某些文本仅针对某些错误或审查人员无法轻松复制的场景显示。俄语或德语等语言的单词往往比英语长得多

    您知道哪些方法可以检查软件翻译版本中的截止/过长字符串?

    我考虑过但不满意的方法:

    • 我可以自动循环应用程序中的所有小部件,并检查标签的最大宽度。然后,我可以使用字体度量以所有语言在屏幕外渲染字符串,并在渲染后将最大宽度与实际需要的空间进行比较,并创建一个日志,其中包含失败的小部件名称和字符串。问题是很多字符串是动态分配的,所以我需要知道所有标签的可能文本的所有排列
    • 我可以(手动?!)为每个字符串定义一个最大像素数,并将此信息交给转换器。然后,翻译器可以使用完全相同的字体和大小,呈现翻译后的字符串并比较像素数量。这种方法要求开发人员为屏幕上的每个位置指定最大像素,如果使用动态布局,这甚至是不可能的。这听起来像是一项乏味的工作

      • 一种方法是编写一个函数,迭代给定类型的所有小部件并检查文本大小

        QList<QLabel *> labels = rootWidget->findChildren<QLabel *>();
        
        for (auto label : labels)
            check(label);
        
        对于不同类型的文本绘图小部件,
        check()
        函数可能需要重载。您可能还需要调整比较以考虑更多内容(边距、填充等)

        如果您使用Qt快速接口,可能会执行类似的操作,但这会有点困难,因为您可能需要搜索QML中声明的动态属性

        对于动态布局中的小部件,这需要在某个点显示经过评估的小部件,以便知道小部件的最终大小。
        对于Qt Quick,您需要加载QML文件并实例化项,以便甚至检索其父项。

        我研究了Qt域之外的不同方法,发现如下:

        • 是一家帮助管理翻译流程的公司/产品。它们基本上提供了一个不起作用的字符串,因为呈现字符串的宽度取决于使用的字体和语言,例如:“iiii”和“WW”。在俄语中,几乎所有的字母都占据了更多的空间,所以字符限制在实践中并没有什么用处。此外,OneSky还支持一个屏幕截图功能,将它们发送给翻译人员(这也是一个手动审查过程)
        • 在文章中,他们还提到应该使用截图将其发送给翻译人员
        • 提到了伪语言测试,它只是使用了一个带有过长术语的人工语言(例如,因子2)
        • 当然,这一列表可能是正确的,但只能帮助改进自动翻译过程
        因此,当涉及到截断字符串时,似乎没有实现自动翻译过程的标准方法。开发人员只能实现帮助翻译人员的工具。我认为不可能有一个完全自动化的解决方案,因为:

        • 上下文在没有屏幕截图的情况下,译者通常无法用简单的注释完美地描述上下文
        • 动态布局仍然无法保护用户免受到处都是过长字符串的影响
        • 固定布局当然不能保护用户免受过长字符串的影响(但至少可以很容易地找到错误的术语)
        • 美学因为合适的琴弦不一定让观众满意。在某些语言中,它仍然看起来“塞满了”

        通常,GUI的设计和实现方式应与自动调整大小的方式相同,以便正确显示所有文本。这可以通过正确使用布局来实现。在你的应用程序中不是这样吗?此外,即使您知道所有字符串的长度,您也无法在不测试GUI本身的情况下确保它们都正确地显示在屏幕上。@vahancho嗯,在可能的情况下使用动态布局,但在我看来,当所有内容都是动态的时,问题会变得更糟。想象一下一个非常罕见的错误情况,翻译的文本太长了,这会在显示尺寸非常有限的嵌入式屏幕上打乱布局。你将如何追踪这些场景?@vahancho我没有包括关于我们目标平台的信息(有限的屏幕大小,甚至在英文版本中也有许多缩写)。因此,它不像一个有很多空间的网站或桌面应用程序,也没有鼠标/指针。你认为我应该在我的问题中包括这些信息吗?我想从我们的评论中已经清楚了:-)是的,现在清楚了,谢谢。实际上,我想到了一个桌面应用程序。嗯,如果英语还可以的话,我会把它作为基准。然后,我将从翻译文件(我猜TS文件是XML格式)中提取所有字符串:翻译的和原始的,计算给定字体和屏幕分辨率的字符串长度,如果翻译文本比英文版本长,则在GUI上手动验证案例(或使用GUI自动化工具).@vahancho这值得一想!不幸的是,英语是人们使用的最短的语言之一。俄罗斯通常有第二个因素
        void check (QLabel *label)
        {
            QFontMetrics fm = label->fontMetrics();
            bool ok = fm.width(label->text()) <= label->width();
        }