如何在本地化Qt应用程序中自动检测截止(过长)字符串?
在我的Qt应用程序中,我有许多不同的屏幕,其中包含使用Qt的tr()的本地化小部件。要确定字符串是否在不被截断的情况下正确显示,我们有以下工作流:如何在本地化Qt应用程序中自动检测截止(过长)字符串?,qt,localization,internationalization,Qt,Localization,Internationalization,在我的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)
- 当然,这一列表可能是正确的,但只能帮助改进自动翻译过程
- 上下文在没有屏幕截图的情况下,译者通常无法用简单的注释完美地描述上下文
- 动态布局仍然无法保护用户免受到处都是过长字符串的影响
- 固定布局当然不能保护用户免受过长字符串的影响(但至少可以很容易地找到错误的术语)
- 美学因为合适的琴弦不一定让观众满意。在某些语言中,它仍然看起来“塞满了”
void check (QLabel *label)
{
QFontMetrics fm = label->fontMetrics();
bool ok = fm.width(label->text()) <= label->width();
}