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