一、翻译
在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定义来实现的。