macOS平台下Qt应用程序菜单翻译及调整

  • 2019 年 10 月 8 日
  • 筆記

一、翻译

在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项。先来看一些典型的例子:

这个是Qt Creator的菜单,系统为应用程序菜单添加了一些桌面显示操作相关的菜单项;

这个是Qt Designer的应用程序菜单,也添加了一些额外的菜单项。并且我们可以注意到,这些菜单项在中文语言环境是翻译好的。那么我们自己的应用程序,怎么去让它们也翻译好呢?

Qt应用程序的国际化都是通过ts文件来做翻译的。通过lupdate程序扫描源代码中被tr()宏包裹的字符串,得到需要翻译的字符串。但是这些系统添加的字符串,并没有存在我们的源码当中。这个应该如何处理嗯?通过网上的一番搜寻发现,有一个直接且简单的方法,直接在ts文件里面添加这些字符串并做好翻译即可。如下所示:

  1 <?xml version="1.0" encoding="utf-8"?>    2 <!DOCTYPE TS>    3 <TS version="2.1" language="zh_CN">    4 <context>    5     <name>demoMainWindow</name>    6     <message>    7         <location filename="../mainwindow.ui" line="14"/>    8         <source>MainWindow</source>    9         <translation>主窗口</translation>   10     </message>   11     <message>   12         <location filename="../mainwindow.ui" line="28"/>   13         <source>File</source>   14         <translation>文件</translation>   15     </message>   16     <message>   17         <location filename="../mainwindow.ui" line="40"/>   18         <source>Edit</source>   19         <translation>编辑</translation>   20     </message>   21     <message>   22         <location filename="../mainwindow.ui" line="50"/>   23         <source>View</source>   24         <translation>视图</translation>   25     </message>   26     <message>   27         <location filename="../mainwindow.ui" line="57"/>   28         <source>Settings</source>   29         <translation>设置</translation>   30     </message>   31     <message>   32         <location filename="../mainwindow.ui" line="65"/>   33         <source>Help</source>   34         <translation>帮助</translation>   35     </message>   36     <message>   37         <location filename="../mainwindow.ui" line="81"/>   38         <source>Open File</source>   39         <translation>打开文件</translation>   40     </message>   41     <message>   42         <location filename="../mainwindow.ui" line="86"/>   43         <source>Open Project</source>   44         <translation>打开工程</translation>   45     </message>   46     <message>   47         <location filename="../mainwindow.ui" line="91"/>   48         <source>Open Folder</source>   49         <translation>打开文件夹</translation>   50     </message>   51     <message>   52         <location filename="../mainwindow.ui" line="96"/>   53         <source>Recent</source>   54         <translation>最近文件</translation>   55     </message>   56     <message>   57         <location filename="../mainwindow.ui" line="101"/>   58         <source>Save</source>   59         <translation>保存</translation>   60     </message>   61     <message>   62         <location filename="../mainwindow.ui" line="106"/>   63         <source>Quit</source>   64         <translation>退出</translation>   65     </message>   66     <message>   67         <location filename="../mainwindow.ui" line="111"/>   68         <source>Redo</source>   69         <translation>重做</translation>   70     </message>   71     <message>   72         <location filename="../mainwindow.ui" line="116"/>   73         <source>Undo</source>   74         <translation>撤销</translation>   75     </message>   76     <message>   77         <location filename="../mainwindow.ui" line="121"/>   78         <source>Cut</source>   79         <translation>剪切</translation>   80     </message>   81     <message>   82         <location filename="../mainwindow.ui" line="126"/>   83         <source>Paste</source>   84         <translation>粘贴</translation>   85     </message>   86     <message>   87         <location filename="../mainwindow.ui" line="131"/>   88         <source>Delete</source>   89         <translation>删除</translation>   90     </message>   91     <message>   92         <location filename="../mainwindow.ui" line="136"/>   93         <source>Tile</source>   94         <translation>平铺</translation>   95     </message>   96     <message>   97         <location filename="../mainwindow.ui" line="141"/>   98         <source>Stack</source>   99         <translation>堆叠</translation>  100     </message>  101     <message>  102         <location filename="../mainwindow.ui" line="146"/>  103         <source>Preference</source>  104         <translation>偏好设置</translation>  105     </message>  106     <message>  107         <location filename="../mainwindow.ui" line="151"/>  108         <source>Log</source>  109         <translation>日志</translation>  110     </message>  111     <message>  112         <location filename="../mainwindow.ui" line="156"/>  113         <source>Tools</source>  114         <translation>工具</translation>  115     </message>  116     <message>  117         <location filename="../mainwindow.ui" line="161"/>  118         <source>About Demo</source>  119         <translation>关于Demo</translation>  120     </message>  121     <message>  122         <location filename="../mainwindow.ui" line="166"/>  123         <source>Check for updates</source>  124         <translation>检查更新</translation>  125     </message>  126     <message>  127         <location filename="../mainwindow.ui" line="171"/>  128         <source>Website</source>  129         <translation>官网</translation>  130     </message>  131     <message>  132         <location filename="../mainwindow.ui" line="176"/>  133         <source>Tutorial</source>  134         <translation>教程</translation>  135     </message>  136 </context>  137 <context>  138     <name>MAC_APPLICATION_MENU</name>  139     <message>  140         <source>Services</source>  141         <translation>服务</translation>  142     </message>  143     <message>  144         <source>Hide %1</source>  145         <translation>隐藏 %1</translation>  146     </message>  147     <message>  148         <source>Hide Others</source>  149         <translation>隐藏其他</translation>  150     </message>  151     <message>  152         <source>Show All</source>  153         <translation>显示所有</translation>  154     </message>  155     <message>  156         <source>Preferences...</source>  157         <translation>偏好设置…</translation>  158     </message>  159     <message>  160         <source>Quit %1</source>  161         <translation>退出 %1</translation>  162     </message>  163     <message>  164         <source>About %1</source>  165         <translation>关于 %1</translation>  166     </message>  167 </context>  168  169 </TS>

手动添加一个context,并在该context下面添加翻译。然后用lupdate更新ts文件即可。这样,我们自己的应用程序也可以翻译好了:

二、菜单项重排

为了契合不同平台的使用习惯,Qt给菜单添加了Menu Role这样一个定义。通过定义不同的Menu Role,mac系统会调整应用程序的位置,以保证平台习惯的统一。Qt库本身已经定义了几个常用的Role:

这些Role类型的菜单项都会被系统重新调整位置到应用菜单里。如果我们还有一些其他的菜单项,也想放到应用菜单里面,应该怎么做呢?其实也非常简单,直接将菜单的Role设置为ApplicationSpecificRole即可。按照设置顺序,各个菜单项将依次出现在应用菜单中。比如说上面截图中的Check for Updates菜单项,就是通过设置ApplicationSpecificRole定义来实现的。