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

时间:2017-11-06 09:18:31

标签: qt localization internationalization

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

  1. 英文版由开发人员隐式检查
  2. 翻译版本由母语人士使用自动生成的屏幕截图或直接应用程序进行人工审核
  3. 问题在于手动审核流程无法覆盖100%的字符串,因为某些文本仅针对某些错误或方案显示,而这些错误或方案无法由审阅者轻松复制。俄语或德语等语言往往比英语长得多。

    您知道在软件的任何翻译版本中检查截止/过长字符串的哪种方法?

    我想到但不满意的方法:

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

2 个答案:

答案 0 :(得分:1)

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

QList<QLabel *> labels = rootWidget->findChildren<QLabel *>();

for (auto label : labels)
    check(label);

可以使用QFontMetric

完成检查
void check (QLabel *label)
{
    QFontMetrics fm = label->fontMetrics();
    bool ok = fm.width(label->text()) <= label->width();
}

对于不同类型的文本绘制小部件,可能需要重载check()函数。您可能还需要调整比较以考虑更多事情(边距,填充等)。

如果您使用Qt Quick界面,可能会做类似的事情,但这会有点困难,因为您可能需要搜索在QML中声明的动态属性。

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

答案 1 :(得分:0)

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

  • OneSky是一家帮助管理翻译流程的公司/产品。它们基本上提供了一个character limit,它不起作用,因为渲染字符串的宽度取决于使用的字体和语言,例如:“iiii”和“WWWW”。在俄语中,似乎几乎所有字母都占用了更多的空间,因此字符限制实际上没有用处。此外,OneSky支持屏幕截图功能,将其发送给翻译人员(这也是一个人工审核流程)。
  • What’s new in localization in Xcode 9 and iOS 11中,他们还提到应使用屏幕截图将其发送给翻译人员。
  • Apple提到伪语言测试,它只使用人工语言太长(例如因子2)。
  • 当然,best practices列表可能属实,但只能帮助改善自动翻译流程。

因此,在切断字符串时似乎没有实现自动翻译流程的标准方法。开发人员只能实施工具来帮助翻译人员。我认为由于以下原因,无法实现完全自动化的解决方案:

  • 上下文,如果没有屏幕截图,对于翻译的简单评论通常无法完美描述
  • 动态布局仍然无法保护一个地方过长的字符串
  • 固定布局当然不会保护太长的字符串(但至少可以轻松找到错误的字词)
  • 美学因为适合的字符串不一定让观众感到愉快。它仍然可能在某些语言中“挤满”。