定位后重置控制位置

Posted

技术标签:

【中文标题】定位后重置控制位置【英文标题】:Reset control positions after localization 【发布时间】:2013-01-18 09:10:36 【问题描述】:

我有一个基本语言为英语的 WinForms 应用程序。我将表格本地化为德语。德语中的某些单词比英语对应的单词要长得多,因此我需要在德语版本的表单上移动一些控件。问题是当我移动英语控件时,德语本地化不反映移动(显然)。

但是一些控件被错误地移动了,我想重置它们,所以它们在英文表格上的移动也会反映在德文表格上。

如何在德语窗体上重置单个控件的位置和大小(或所有属性),以便当控件在英文窗体上移动时,该控件将在窗体的两种语言版本上移动?除了挖掘本地化的 .resx 文件并删除控件的所有属性分配之外,还有其他方法吗?

【问题讨论】:

这些是静态的还是动态创建的控件? 这些是静态控件 【参考方案1】:

我是面向 Visual Studio 开发人员的本地化产品的作者(为了全面披露)。从本地化的“.resx”文件中删除的任何属性,无论是在 Visual Studio 表单设计器中还是在“.resx”文件本身中手动删除,都会导致控件再次遵循该属性的默认语言值。然而,没有特定的功能可以处理这个问题。您需要在逐个控制的基础上自己进行操作。但是请注意,Visual Studio 有时是不稳定的,并且有各种错误,对于这个和其他问题,所以即使你使用设计器删除它们,事情也并不总是有效(上次我回顾了这种情况)。除非它现在已经修复(我对此表示怀疑),否则如果您将德语控件的“位置”属性设置回默认语言的“位置”属性(例如在设计器中),VS 应该从中删除“位置”属性“.de.resx”文件。它确实 - 有时。其他时候它没有(去图),你需要自己手动删除它。一旦它消失了,“回退”过程确保将再次使用默认语言属性(因此在您的情况下移动英语版本的控件会将其移动到德语版本,因为两者都再次依赖相同的属性- 来自英文“.resx”文件的那个)。

【讨论】:

非常感谢,拉里。虽然我没有得到一个完美的、基于 GUI 的解决方案,但我在这个话题上有点聪明,可以停止搜索。然后是手动 .resx 黑客攻击。【参考方案2】:

我认为,如果您以无需更改控件的方式创建 UI,这将使您的未来开发更容易。然后你可以只翻译标签而不用弄乱控制位置。

例如,将标签放在相应编辑字段的顶部,而不是左侧,使按钮足够大以处理所有文本。并考虑改写德语文本以使它们更小。

【讨论】:

谢谢,但我认为这不是一个好的解决方案。首先,今天的屏幕很宽,因此它们具有水平而不是垂直的空间。在文本框上方放置标签意味着我可以在给定屏幕上显示更少的信息。其次,不可能预测未来语言的空间需求。没有什么比充满缩写和/或令人困惑的术语的 GUI 更糟糕的了。微软让本地化功能如此灵活是有原因的。【参考方案3】:

现代本地化工具可以提供帮助。表格在工具中以可视方式呈现,允许编辑大小和位置值(如果已明确设置)。将显示自动尺寸控件,但尺寸/位置不可编辑。

在设计软件时要考虑本地化,这一点很重要。避免在运行时显着更改表单;避免硬编码和连接字符串等。

本地化工具将检查您的源代码或编译后的二进制文件。它将发现要翻译的表单、字符串、菜单等。它会将这些呈现给语言学家进行翻译,然后将翻译后的源代码或二进制文件返回给您(取决于您开始使用的内容)。这些工具了解语言文件夹等的 .net 命名约定。

搜索“.net 软件本地化”以找到可以完成这项工作的有用工具。

【讨论】:

【参考方案4】:

正如@Larry 所说,在设计时进行更改时,并非总是更新表单的 resx 文件。它们变得损坏,有时我们需要将 Localizable 属性设置为 false 并再次设置为 true 以解决此问题。但最重要的是保持 .Designer.cs 文件始终在编辑器中打开以假设更改,因为如果关闭它并不总是更新。如果您使用默认语言以外的语言工作,切勿将 Localizable 属性设置为 false,除非您希望这是新的默认语言。

【讨论】:

以上是关于定位后重置控制位置的主要内容,如果未能解决你的问题,请参考以下文章

在pygame中,重置每个子画面位置的最有效方法是什么?

Unity重置动画帧位置转换状态时控制播放速度

Unity重置动画帧位置转换状态时控制播放速度

Unity重置动画帧位置转换状态时控制播放速度

输入文本时 UITextField 位置重置

方向改变后播放位置重置为零