From 529e1bfd6366aaa362235281518ec17a2a2f75f3 Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 5 Jan 2017 10:39:08 +0000 Subject: [PATCH] Internationalize the main menu. --- res/locales/en_US.po | 412 +++++++++++++++++++++++++++++++++++++- res/messages.pot | 412 +++++++++++++++++++++++++++++++++++++- src/graphicswin.cpp | 251 +++++++++++------------ src/platform/cocoamain.mm | 41 +++- src/platform/gtkmain.cpp | 44 +++- src/platform/headless.cpp | 3 + src/platform/w32main.cpp | 35 +++- src/resource.cpp | 1 + src/solvespace.cpp | 19 ++ src/solvespace.h | 2 + src/ui.h | 4 +- 11 files changed, 1081 insertions(+), 143 deletions(-) diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 3744aadf..c6840dd8 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,12 +7,420 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2017-01-05 10:32+0000\n" +"POT-Creation-Date: 2017-01-05 10:37+0000\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en_US\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ASCII\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:29 +msgid "&File" +msgstr "&File" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:30 +msgid "&New" +msgstr "&New" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:31 +msgid "&Open..." +msgstr "&Open..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:32 +msgid "Open &Recent" +msgstr "Open &Recent" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:33 +msgid "&Save" +msgstr "&Save" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:34 +msgid "Save &As..." +msgstr "Save &As..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:36 +msgid "Export &Image..." +msgstr "Export &Image..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:37 +msgid "Export 2d &View..." +msgstr "Export 2d &View..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:38 +msgid "Export 2d &Section..." +msgstr "Export 2d &Section..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:39 +msgid "Export 3d &Wireframe..." +msgstr "Export 3d &Wireframe..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:40 +msgid "Export Triangle &Mesh..." +msgstr "Export Triangle &Mesh..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:41 +msgid "Export &Surfaces..." +msgstr "Export &Surfaces..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:42 +msgid "Im&port..." +msgstr "Im&port..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:45 +msgid "E&xit" +msgstr "E&xit" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:48 +msgid "&Edit" +msgstr "&Edit" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:49 +msgid "&Undo" +msgstr "&Undo" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:50 +msgid "&Redo" +msgstr "&Redo" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:51 +msgid "Re&generate All" +msgstr "Re&generate All" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:53 +msgid "Snap Selection to &Grid" +msgstr "Snap Selection to &Grid" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:54 +msgid "Rotate Imported &90°" +msgstr "Rotate Imported &90°" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:56 +msgid "Cu&t" +msgstr "Cu&t" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:57 +msgid "&Copy" +msgstr "&Copy" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:58 +msgid "&Paste" +msgstr "&Paste" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:59 +msgid "Paste &Transformed..." +msgstr "Paste &Transformed..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:60 +msgid "&Delete" +msgstr "&Delete" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:62 +msgid "Select &Edge Chain" +msgstr "Select &Edge Chain" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:63 +msgid "Select &All" +msgstr "Select &All" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:64 +msgid "&Unselect All" +msgstr "&Unselect All" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:66 +msgid "&View" +msgstr "&View" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:67 +msgid "Zoom &In" +msgstr "Zoom &In" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:68 +msgid "Zoom &Out" +msgstr "Zoom &Out" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:69 +msgid "Zoom To &Fit" +msgstr "Zoom To &Fit" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:71 +msgid "Align View to &Workplane" +msgstr "Align View to &Workplane" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:72 +msgid "Nearest &Ortho View" +msgstr "Nearest &Ortho View" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:73 +msgid "Nearest &Isometric View" +msgstr "Nearest &Isometric View" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:74 +msgid "&Center View At Point" +msgstr "&Center View At Point" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:76 +msgid "Show Snap &Grid" +msgstr "Show Snap &Grid" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:77 +msgid "Use &Perspective Projection" +msgstr "Use &Perspective Projection" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:80 +msgid "Show Menu &Bar" +msgstr "Show Menu &Bar" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:82 +msgid "Show &Toolbar" +msgstr "Show &Toolbar" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:83 +msgid "Show Property Bro&wser" +msgstr "Show Property Bro&wser" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:85 +msgid "Dimensions in &Inches" +msgstr "Dimensions in &Inches" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:86 +msgid "Dimensions in &Millimeters" +msgstr "Dimensions in &Millimeters" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:89 +msgid "&Full Screen" +msgstr "&Full Screen" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:92 +msgid "&New Group" +msgstr "&New Group" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:93 +msgid "Sketch In &3d" +msgstr "Sketch In &3d" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:94 +msgid "Sketch In New &Workplane" +msgstr "Sketch In New &Workplane" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:96 +msgid "Step &Translating" +msgstr "Step &Translating" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:97 +msgid "Step &Rotating" +msgstr "Step &Rotating" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:99 +msgid "E&xtrude" +msgstr "E&xtrude" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:100 +msgid "&Lathe" +msgstr "&Lathe" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:102 +msgid "Link / Assemble..." +msgstr "Link / Assemble..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:103 +msgid "Link Recent" +msgstr "Link Recent" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:105 +msgid "&Sketch" +msgstr "&Sketch" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:106 +msgid "In &Workplane" +msgstr "In &Workplane" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:107 +msgid "Anywhere In &3d" +msgstr "Anywhere In &3d" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:109 +msgid "Datum &Point" +msgstr "Datum &Point" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:110 +msgid "&Workplane" +msgstr "&Workplane" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:112 +msgid "Line &Segment" +msgstr "Line &Segment" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:113 +msgid "C&onstruction Line Segment" +msgstr "C&onstruction Line Segment" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:114 +msgid "&Rectangle" +msgstr "&Rectangle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:115 +msgid "&Circle" +msgstr "&Circle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:116 +msgid "&Arc of a Circle" +msgstr "&Arc of a Circle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:117 +msgid "&Bezier Cubic Spline" +msgstr "&Bezier Cubic Spline" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:119 +msgid "&Text in TrueType Font" +msgstr "&Text in TrueType Font" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:121 +msgid "To&ggle Construction" +msgstr "To&ggle Construction" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:122 +msgid "Tangent &Arc at Point" +msgstr "Tangent &Arc at Point" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:123 +msgid "Split Curves at &Intersection" +msgstr "Split Curves at &Intersection" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:125 +msgid "&Constrain" +msgstr "&Constrain" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:126 +msgid "&Distance / Diameter" +msgstr "&Distance / Diameter" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:127 +msgid "Re&ference Dimension" +msgstr "Re&ference Dimension" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:128 +msgid "A&ngle" +msgstr "A&ngle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:129 +msgid "Reference An&gle" +msgstr "Reference An&gle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:130 +msgid "Other S&upplementary Angle" +msgstr "Other S&upplementary Angle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:131 +msgid "Toggle R&eference Dim" +msgstr "Toggle R&eference Dim" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:133 +msgid "&Horizontal" +msgstr "&Horizontal" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:134 +msgid "&Vertical" +msgstr "&Vertical" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:136 +msgid "&On Point / Curve / Plane" +msgstr "&On Point / Curve / Plane" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:137 +msgid "E&qual Length / Radius / Angle" +msgstr "E&qual Length / Radius / Angle" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:138 +msgid "Length Ra&tio" +msgstr "Length Ra&tio" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:139 +msgid "Length Diff&erence" +msgstr "Length Diff&erence" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:140 +msgid "At &Midpoint" +msgstr "At &Midpoint" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:141 +msgid "S&ymmetric" +msgstr "S&ymmetric" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:142 +msgid "Para&llel / Tangent" +msgstr "Para&llel / Tangent" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:143 +msgid "&Perpendicular" +msgstr "&Perpendicular" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:144 +msgid "Same Orient&ation" +msgstr "Same Orient&ation" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:145 +msgid "Lock Point Where &Dragged" +msgstr "Lock Point Where &Dragged" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:147 +msgid "Comment" +msgstr "Comment" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:149 +msgid "&Analyze" +msgstr "&Analyze" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:150 +msgid "Measure &Volume" +msgstr "Measure &Volume" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:151 +msgid "Measure A&rea" +msgstr "Measure A&rea" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:152 +msgid "Measure &Perimeter" +msgstr "Measure &Perimeter" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:153 +msgid "Show &Interfering Parts" +msgstr "Show &Interfering Parts" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:154 +msgid "Show &Naked Edges" +msgstr "Show &Naked Edges" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:156 +msgid "Show Degrees of &Freedom" +msgstr "Show Degrees of &Freedom" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:158 +msgid "&Trace Point" +msgstr "&Trace Point" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:159 +msgid "&Stop Tracing..." +msgstr "&Stop Tracing..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:160 +msgid "Step &Dimension..." +msgstr "Step &Dimension..." + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:162 +msgid "&Help" +msgstr "&Help" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:163 +msgid "&Website / Manual" +msgstr "&Website / Manual" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:164 +msgid "&Language" +msgstr "&Language" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:166 +msgid "&About" +msgstr "&About" diff --git a/res/messages.pot b/res/messages.pot index bd0142cb..93cd99bb 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,11 +8,419 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2017-01-05 10:32+0000\n" +"POT-Creation-Date: 2017-01-05 10:37+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:29 +msgid "&File" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:30 +msgid "&New" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:31 +msgid "&Open..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:32 +msgid "Open &Recent" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:33 +msgid "&Save" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:34 +msgid "Save &As..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:36 +msgid "Export &Image..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:37 +msgid "Export 2d &View..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:38 +msgid "Export 2d &Section..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:39 +msgid "Export 3d &Wireframe..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:40 +msgid "Export Triangle &Mesh..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:41 +msgid "Export &Surfaces..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:42 +msgid "Im&port..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:45 +msgid "E&xit" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:48 +msgid "&Edit" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:49 +msgid "&Undo" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:50 +msgid "&Redo" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:51 +msgid "Re&generate All" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:53 +msgid "Snap Selection to &Grid" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:54 +msgid "Rotate Imported &90°" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:56 +msgid "Cu&t" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:57 +msgid "&Copy" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:58 +msgid "&Paste" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:59 +msgid "Paste &Transformed..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:60 +msgid "&Delete" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:62 +msgid "Select &Edge Chain" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:63 +msgid "Select &All" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:64 +msgid "&Unselect All" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:66 +msgid "&View" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:67 +msgid "Zoom &In" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:68 +msgid "Zoom &Out" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:69 +msgid "Zoom To &Fit" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:71 +msgid "Align View to &Workplane" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:72 +msgid "Nearest &Ortho View" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:73 +msgid "Nearest &Isometric View" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:74 +msgid "&Center View At Point" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:76 +msgid "Show Snap &Grid" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:77 +msgid "Use &Perspective Projection" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:80 +msgid "Show Menu &Bar" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:82 +msgid "Show &Toolbar" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:83 +msgid "Show Property Bro&wser" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:85 +msgid "Dimensions in &Inches" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:86 +msgid "Dimensions in &Millimeters" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:89 +msgid "&Full Screen" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:92 +msgid "&New Group" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:93 +msgid "Sketch In &3d" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:94 +msgid "Sketch In New &Workplane" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:96 +msgid "Step &Translating" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:97 +msgid "Step &Rotating" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:99 +msgid "E&xtrude" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:100 +msgid "&Lathe" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:102 +msgid "Link / Assemble..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:103 +msgid "Link Recent" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:105 +msgid "&Sketch" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:106 +msgid "In &Workplane" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:107 +msgid "Anywhere In &3d" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:109 +msgid "Datum &Point" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:110 +msgid "&Workplane" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:112 +msgid "Line &Segment" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:113 +msgid "C&onstruction Line Segment" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:114 +msgid "&Rectangle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:115 +msgid "&Circle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:116 +msgid "&Arc of a Circle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:117 +msgid "&Bezier Cubic Spline" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:119 +msgid "&Text in TrueType Font" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:121 +msgid "To&ggle Construction" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:122 +msgid "Tangent &Arc at Point" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:123 +msgid "Split Curves at &Intersection" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:125 +msgid "&Constrain" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:126 +msgid "&Distance / Diameter" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:127 +msgid "Re&ference Dimension" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:128 +msgid "A&ngle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:129 +msgid "Reference An&gle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:130 +msgid "Other S&upplementary Angle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:131 +msgid "Toggle R&eference Dim" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:133 +msgid "&Horizontal" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:134 +msgid "&Vertical" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:136 +msgid "&On Point / Curve / Plane" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:137 +msgid "E&qual Length / Radius / Angle" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:138 +msgid "Length Ra&tio" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:139 +msgid "Length Diff&erence" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:140 +msgid "At &Midpoint" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:141 +msgid "S&ymmetric" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:142 +msgid "Para&llel / Tangent" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:143 +msgid "&Perpendicular" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:144 +msgid "Same Orient&ation" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:145 +msgid "Lock Point Where &Dragged" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:147 +msgid "Comment" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:149 +msgid "&Analyze" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:150 +msgid "Measure &Volume" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:151 +msgid "Measure A&rea" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:152 +msgid "Measure &Perimeter" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:153 +msgid "Show &Interfering Parts" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:154 +msgid "Show &Naked Edges" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:156 +msgid "Show Degrees of &Freedom" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:158 +msgid "&Trace Point" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:159 +msgid "&Stop Tracing..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:160 +msgid "Step &Dimension..." +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:162 +msgid "&Help" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:163 +msgid "&Website / Manual" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:164 +msgid "&Language" +msgstr "" + +#: /home/whitequark/Work/solvespace/src/graphicswin.cpp:166 +msgid "&About" +msgstr "" diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 8624aa1a..bee0518c 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -25,146 +25,147 @@ #define TR MenuKind::RADIO const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = { //level -// label id accel ty fn -{ 0, "&File", Command::NONE, 0, TN, NULL }, -{ 1, "&New", Command::NEW, C|'N', TN, mFile }, -{ 1, "&Open...", Command::OPEN, C|'O', TN, mFile }, -{ 1, "Open &Recent", Command::OPEN_RECENT, 0, TN, mFile }, -{ 1, "&Save", Command::SAVE, C|'S', TN, mFile }, -{ 1, "Save &As...", Command::SAVE_AS, 0, TN, mFile }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Export &Image...", Command::EXPORT_PNG, 0, TN, mFile }, -{ 1, "Export 2d &View...", Command::EXPORT_VIEW, 0, TN, mFile }, -{ 1, "Export 2d &Section...", Command::EXPORT_SECTION, 0, TN, mFile }, -{ 1, "Export 3d &Wireframe...", Command::EXPORT_WIREFRAME, 0, TN, mFile }, -{ 1, "Export Triangle &Mesh...", Command::EXPORT_MESH, 0, TN, mFile }, -{ 1, "Export &Surfaces...", Command::EXPORT_SURFACES, 0, TN, mFile }, -{ 1, "Im&port...", Command::IMPORT, 0, TN, mFile }, +// label id accel ty fn +{ 0, N_("&File"), Command::NONE, 0, TN, NULL }, +{ 1, N_("&New"), Command::NEW, C|'N', TN, mFile }, +{ 1, N_("&Open..."), Command::OPEN, C|'O', TN, mFile }, +{ 1, N_("Open &Recent"), Command::OPEN_RECENT, 0, TN, mFile }, +{ 1, N_("&Save"), Command::SAVE, C|'S', TN, mFile }, +{ 1, N_("Save &As..."), Command::SAVE_AS, 0, TN, mFile }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Export &Image..."), Command::EXPORT_PNG, 0, TN, mFile }, +{ 1, N_("Export 2d &View..."), Command::EXPORT_VIEW, 0, TN, mFile }, +{ 1, N_("Export 2d &Section..."), Command::EXPORT_SECTION, 0, TN, mFile }, +{ 1, N_("Export 3d &Wireframe..."), Command::EXPORT_WIREFRAME, 0, TN, mFile }, +{ 1, N_("Export Triangle &Mesh..."), Command::EXPORT_MESH, 0, TN, mFile }, +{ 1, N_("Export &Surfaces..."), Command::EXPORT_SURFACES, 0, TN, mFile }, +{ 1, N_("Im&port..."), Command::IMPORT, 0, TN, mFile }, #ifndef __APPLE__ -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "E&xit", Command::EXIT, C|'Q', TN, mFile }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("E&xit"), Command::EXIT, C|'Q', TN, mFile }, #endif -{ 0, "&Edit", Command::NONE, 0, TN, NULL }, -{ 1, "&Undo", Command::UNDO, C|'Z', TN, mEdit }, -{ 1, "&Redo", Command::REDO, C|'Y', TN, mEdit }, -{ 1, "Re&generate All", Command::REGEN_ALL, ' ', TN, mEdit }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Snap Selection to &Grid", Command::SNAP_TO_GRID, '.', TN, mEdit }, -{ 1, "Rotate Imported &90°", Command::ROTATE_90, '9', TN, mEdit }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Cu&t", Command::CUT, C|'X', TN, mClip }, -{ 1, "&Copy", Command::COPY, C|'C', TN, mClip }, -{ 1, "&Paste", Command::PASTE, C|'V', TN, mClip }, -{ 1, "Paste &Transformed...", Command::PASTE_TRANSFORM, C|'T', TN, mClip }, -{ 1, "&Delete", Command::DELETE, DEL, TN, mClip }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Select &Edge Chain", Command::SELECT_CHAIN, C|'E', TN, mEdit }, -{ 1, "Select &All", Command::SELECT_ALL, C|'A', TN, mEdit }, -{ 1, "&Unselect All", Command::UNSELECT_ALL, ESC, TN, mEdit }, +{ 0, N_("&Edit"), Command::NONE, 0, TN, NULL }, +{ 1, N_("&Undo"), Command::UNDO, C|'Z', TN, mEdit }, +{ 1, N_("&Redo"), Command::REDO, C|'Y', TN, mEdit }, +{ 1, N_("Re&generate All"), Command::REGEN_ALL, ' ', TN, mEdit }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Snap Selection to &Grid"), Command::SNAP_TO_GRID, '.', TN, mEdit }, +{ 1, N_("Rotate Imported &90°"), Command::ROTATE_90, '9', TN, mEdit }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Cu&t"), Command::CUT, C|'X', TN, mClip }, +{ 1, N_("&Copy"), Command::COPY, C|'C', TN, mClip }, +{ 1, N_("&Paste"), Command::PASTE, C|'V', TN, mClip }, +{ 1, N_("Paste &Transformed..."), Command::PASTE_TRANSFORM, C|'T', TN, mClip }, +{ 1, N_("&Delete"), Command::DELETE, DEL, TN, mClip }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Select &Edge Chain"), Command::SELECT_CHAIN, C|'E', TN, mEdit }, +{ 1, N_("Select &All"), Command::SELECT_ALL, C|'A', TN, mEdit }, +{ 1, N_("&Unselect All"), Command::UNSELECT_ALL, ESC, TN, mEdit }, -{ 0, "&View", Command::NONE, 0, TN, NULL }, -{ 1, "Zoom &In", Command::ZOOM_IN, '+', TN, mView }, -{ 1, "Zoom &Out", Command::ZOOM_OUT, '-', TN, mView }, -{ 1, "Zoom To &Fit", Command::ZOOM_TO_FIT, 'F', TN, mView }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Align View to &Workplane", Command::ONTO_WORKPLANE, 'W', TN, mView }, -{ 1, "Nearest &Ortho View", Command::NEAREST_ORTHO, F(2), TN, mView }, -{ 1, "Nearest &Isometric View", Command::NEAREST_ISO, F(3), TN, mView }, -{ 1, "&Center View At Point", Command::CENTER_VIEW, F(4), TN, mView }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Show Snap &Grid", Command::SHOW_GRID, '>', TC, mView }, -{ 1, "Use &Perspective Projection", Command::PERSPECTIVE_PROJ, '`', TC, mView }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 0, N_("&View"), Command::NONE, 0, TN, NULL }, +{ 1, N_("Zoom &In"), Command::ZOOM_IN, '+', TN, mView }, +{ 1, N_("Zoom &Out"), Command::ZOOM_OUT, '-', TN, mView }, +{ 1, N_("Zoom To &Fit"), Command::ZOOM_TO_FIT, 'F', TN, mView }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Align View to &Workplane"), Command::ONTO_WORKPLANE, 'W', TN, mView }, +{ 1, N_("Nearest &Ortho View"), Command::NEAREST_ORTHO, F(2), TN, mView }, +{ 1, N_("Nearest &Isometric View"), Command::NEAREST_ISO, F(3), TN, mView }, +{ 1, N_("&Center View At Point"), Command::CENTER_VIEW, F(4), TN, mView }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Show Snap &Grid"), Command::SHOW_GRID, '>', TC, mView }, +{ 1, N_("Use &Perspective Projection"), Command::PERSPECTIVE_PROJ, '`', TC, mView }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, #if defined(__APPLE__) -{ 1, "Show Menu &Bar", Command::SHOW_MENU_BAR, C|F(12), TC, mView }, +{ 1, N_("Show Menu &Bar"), Command::SHOW_MENU_BAR, C|F(12), TC, mView }, #endif -{ 1, "Show &Toolbar", Command::SHOW_TOOLBAR, 0, TC, mView }, -{ 1, "Show Property Bro&wser", Command::SHOW_TEXT_WND, '\t', TC, mView }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Dimensions in &Inches", Command::UNITS_INCHES, 0, TR, mView }, -{ 1, "Dimensions in &Millimeters", Command::UNITS_MM, 0, TR, mView }, +{ 1, N_("Show &Toolbar"), Command::SHOW_TOOLBAR, 0, TC, mView }, +{ 1, N_("Show Property Bro&wser"), Command::SHOW_TEXT_WND, '\t', TC, mView }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Dimensions in &Inches"), Command::UNITS_INCHES, 0, TR, mView }, +{ 1, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, TR, mView }, #if defined(__unix__) || defined(__APPLE__) -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "&Full Screen", Command::FULL_SCREEN, C|F(11), TC, mView }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("&Full Screen"), Command::FULL_SCREEN, C|F(11), TC, mView }, #endif -{ 0, "&New Group", Command::NONE, 0, TN, NULL }, -{ 1, "Sketch In &3d", Command::GROUP_3D, S|'3', TN, mGrp }, -{ 1, "Sketch In New &Workplane", Command::GROUP_WRKPL, S|'W', TN, mGrp }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Step &Translating", Command::GROUP_TRANS, S|'T', TN, mGrp }, -{ 1, "Step &Rotating", Command::GROUP_ROT, S|'R', TN, mGrp }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "E&xtrude", Command::GROUP_EXTRUDE, S|'X', TN, mGrp }, -{ 1, "&Lathe", Command::GROUP_LATHE, S|'L', TN, mGrp }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Link / Assemble...", Command::GROUP_LINK, S|'I', TN, mGrp }, -{ 1, "Link Recent", Command::GROUP_RECENT, 0, TN, mGrp }, +{ 0, N_("&New Group"), Command::NONE, 0, TN, NULL }, +{ 1, N_("Sketch In &3d"), Command::GROUP_3D, S|'3', TN, mGrp }, +{ 1, N_("Sketch In New &Workplane"), Command::GROUP_WRKPL, S|'W', TN, mGrp }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Step &Translating"), Command::GROUP_TRANS, S|'T', TN, mGrp }, +{ 1, N_("Step &Rotating"), Command::GROUP_ROT, S|'R', TN, mGrp }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("E&xtrude"), Command::GROUP_EXTRUDE, S|'X', TN, mGrp }, +{ 1, N_("&Lathe"), Command::GROUP_LATHE, S|'L', TN, mGrp }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Link / Assemble..."), Command::GROUP_LINK, S|'I', TN, mGrp }, +{ 1, N_("Link Recent"), Command::GROUP_RECENT, 0, TN, mGrp }, -{ 0, "&Sketch", Command::NONE, 0, TN, NULL }, -{ 1, "In &Workplane", Command::SEL_WORKPLANE, '2', TR, mReq }, -{ 1, "Anywhere In &3d", Command::FREE_IN_3D, '3', TR, mReq }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Datum &Point", Command::DATUM_POINT, 'P', TN, mReq }, -{ 1, "&Workplane", Command::WORKPLANE, 0, TN, mReq }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Line &Segment", Command::LINE_SEGMENT, 'S', TN, mReq }, -{ 1, "C&onstruction Line Segment", Command::CONSTR_SEGMENT, S|'S', TN, mReq }, -{ 1, "&Rectangle", Command::RECTANGLE, 'R', TN, mReq }, -{ 1, "&Circle", Command::CIRCLE, 'C', TN, mReq }, -{ 1, "&Arc of a Circle", Command::ARC, 'A', TN, mReq }, -{ 1, "&Bezier Cubic Spline", Command::CUBIC, 'B', TN, mReq }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "&Text in TrueType Font", Command::TTF_TEXT, 'T', TN, mReq }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "To&ggle Construction", Command::CONSTRUCTION, 'G', TN, mReq }, -{ 1, "Tangent &Arc at Point", Command::TANGENT_ARC, S|'A', TN, mReq }, -{ 1, "Split Curves at &Intersection", Command::SPLIT_CURVES, 'I', TN, mReq }, +{ 0, N_("&Sketch"), Command::NONE, 0, TN, NULL }, +{ 1, N_("In &Workplane"), Command::SEL_WORKPLANE, '2', TR, mReq }, +{ 1, N_("Anywhere In &3d"), Command::FREE_IN_3D, '3', TR, mReq }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Datum &Point"), Command::DATUM_POINT, 'P', TN, mReq }, +{ 1, N_("&Workplane"), Command::WORKPLANE, 0, TN, mReq }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Line &Segment"), Command::LINE_SEGMENT, 'S', TN, mReq }, +{ 1, N_("C&onstruction Line Segment"), Command::CONSTR_SEGMENT, S|'S', TN, mReq }, +{ 1, N_("&Rectangle"), Command::RECTANGLE, 'R', TN, mReq }, +{ 1, N_("&Circle"), Command::CIRCLE, 'C', TN, mReq }, +{ 1, N_("&Arc of a Circle"), Command::ARC, 'A', TN, mReq }, +{ 1, N_("&Bezier Cubic Spline"), Command::CUBIC, 'B', TN, mReq }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("&Text in TrueType Font"), Command::TTF_TEXT, 'T', TN, mReq }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("To&ggle Construction"), Command::CONSTRUCTION, 'G', TN, mReq }, +{ 1, N_("Tangent &Arc at Point"), Command::TANGENT_ARC, S|'A', TN, mReq }, +{ 1, N_("Split Curves at &Intersection"), Command::SPLIT_CURVES, 'I', TN, mReq }, -{ 0, "&Constrain", Command::NONE, 0, TN, NULL }, -{ 1, "&Distance / Diameter", Command::DISTANCE_DIA, 'D', TN, mCon }, -{ 1, "Re&ference Dimension", Command::REF_DISTANCE, S|'D', TN, mCon }, -{ 1, "A&ngle", Command::ANGLE, 'N', TN, mCon }, -{ 1, "Reference An&gle", Command::REF_ANGLE, S|'N', TN, mCon }, -{ 1, "Other S&upplementary Angle", Command::OTHER_ANGLE, 'U', TN, mCon }, -{ 1, "Toggle R&eference Dim", Command::REFERENCE, 'E', TN, mCon }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "&Horizontal", Command::HORIZONTAL, 'H', TN, mCon }, -{ 1, "&Vertical", Command::VERTICAL, 'V', TN, mCon }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "&On Point / Curve / Plane", Command::ON_ENTITY, 'O', TN, mCon }, -{ 1, "E&qual Length / Radius / Angle", Command::EQUAL, 'Q', TN, mCon }, -{ 1, "Length Ra&tio", Command::RATIO, 'Z', TN, mCon }, -{ 1, "Length Diff&erence", Command::DIFFERENCE, 'J', TN, mCon }, -{ 1, "At &Midpoint", Command::AT_MIDPOINT, 'M', TN, mCon }, -{ 1, "S&ymmetric", Command::SYMMETRIC, 'Y', TN, mCon }, -{ 1, "Para&llel / Tangent", Command::PARALLEL, 'L', TN, mCon }, -{ 1, "&Perpendicular", Command::PERPENDICULAR, '[', TN, mCon }, -{ 1, "Same Orient&ation", Command::ORIENTED_SAME, 'X', TN, mCon }, -{ 1, "Lock Point Where &Dragged", Command::WHERE_DRAGGED, ']', TN, mCon }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Comment", Command::COMMENT, ';', TN, mCon }, +{ 0, N_("&Constrain"), Command::NONE, 0, TN, NULL }, +{ 1, N_("&Distance / Diameter"), Command::DISTANCE_DIA, 'D', TN, mCon }, +{ 1, N_("Re&ference Dimension"), Command::REF_DISTANCE, S|'D', TN, mCon }, +{ 1, N_("A&ngle"), Command::ANGLE, 'N', TN, mCon }, +{ 1, N_("Reference An&gle"), Command::REF_ANGLE, S|'N', TN, mCon }, +{ 1, N_("Other S&upplementary Angle"), Command::OTHER_ANGLE, 'U', TN, mCon }, +{ 1, N_("Toggle R&eference Dim"), Command::REFERENCE, 'E', TN, mCon }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("&Horizontal"), Command::HORIZONTAL, 'H', TN, mCon }, +{ 1, N_("&Vertical"), Command::VERTICAL, 'V', TN, mCon }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("&On Point / Curve / Plane"), Command::ON_ENTITY, 'O', TN, mCon }, +{ 1, N_("E&qual Length / Radius / Angle"), Command::EQUAL, 'Q', TN, mCon }, +{ 1, N_("Length Ra&tio"), Command::RATIO, 'Z', TN, mCon }, +{ 1, N_("Length Diff&erence"), Command::DIFFERENCE, 'J', TN, mCon }, +{ 1, N_("At &Midpoint"), Command::AT_MIDPOINT, 'M', TN, mCon }, +{ 1, N_("S&ymmetric"), Command::SYMMETRIC, 'Y', TN, mCon }, +{ 1, N_("Para&llel / Tangent"), Command::PARALLEL, 'L', TN, mCon }, +{ 1, N_("&Perpendicular"), Command::PERPENDICULAR, '[', TN, mCon }, +{ 1, N_("Same Orient&ation"), Command::ORIENTED_SAME, 'X', TN, mCon }, +{ 1, N_("Lock Point Where &Dragged"), Command::WHERE_DRAGGED, ']', TN, mCon }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Comment"), Command::COMMENT, ';', TN, mCon }, -{ 0, "&Analyze", Command::NONE, 0, TN, NULL }, -{ 1, "Measure &Volume", Command::VOLUME, C|S|'V', TN, mAna }, -{ 1, "Measure A&rea", Command::AREA, C|S|'A', TN, mAna }, -{ 1, "Measure &Perimeter", Command::PERIMETER, C|S|'P', TN, mAna }, -{ 1, "Show &Interfering Parts", Command::INTERFERENCE, C|S|'I', TN, mAna }, -{ 1, "Show &Naked Edges", Command::NAKED_EDGES, C|S|'N', TN, mAna }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "Show Degrees of &Freedom", Command::SHOW_DOF, C|S|'F', TN, mAna }, -{ 1, NULL, Command::NONE, 0, TN, NULL }, -{ 1, "&Trace Point", Command::TRACE_PT, C|S|'T', TN, mAna }, -{ 1, "&Stop Tracing...", Command::STOP_TRACING, C|S|'S', TN, mAna }, -{ 1, "Step &Dimension...", Command::STEP_DIM, C|S|'D', TN, mAna }, +{ 0, N_("&Analyze"), Command::NONE, 0, TN, NULL }, +{ 1, N_("Measure &Volume"), Command::VOLUME, C|S|'V', TN, mAna }, +{ 1, N_("Measure A&rea"), Command::AREA, C|S|'A', TN, mAna }, +{ 1, N_("Measure &Perimeter"), Command::PERIMETER, C|S|'P', TN, mAna }, +{ 1, N_("Show &Interfering Parts"), Command::INTERFERENCE, C|S|'I', TN, mAna }, +{ 1, N_("Show &Naked Edges"), Command::NAKED_EDGES, C|S|'N', TN, mAna }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("Show Degrees of &Freedom"), Command::SHOW_DOF, C|S|'F', TN, mAna }, +{ 1, NULL, Command::NONE, 0, TN, NULL }, +{ 1, N_("&Trace Point"), Command::TRACE_PT, C|S|'T', TN, mAna }, +{ 1, N_("&Stop Tracing..."), Command::STOP_TRACING, C|S|'S', TN, mAna }, +{ 1, N_("Step &Dimension..."), Command::STEP_DIM, C|S|'D', TN, mAna }, -{ 0, "&Help", Command::NONE, 0, TN, NULL }, -{ 1, "&Website / Manual", Command::WEBSITE, 0, TN, mHelp }, +{ 0, N_("&Help"), Command::NONE, 0, TN, NULL }, +{ 1, N_("&Website / Manual"), Command::WEBSITE, 0, TN, mHelp }, +{ 1, N_("&Language"), Command::LOCALE, 0, TN, mHelp }, #ifndef __APPLE__ -{ 1, "&About", Command::ABOUT, 0, TN, mHelp }, +{ 1, N_("&About"), Command::ABOUT, 0, TN, mHelp }, #endif -{ -1, 0, Command::NONE, 0, TN, 0 } +{ -1, 0, Command::NONE, 0, TN, 0 } }; #undef DEL diff --git a/src/platform/cocoamain.mm b/src/platform/cocoamain.mm index eb03df75..f0839cc8 100644 --- a/src/platform/cocoamain.mm +++ b/src/platform/cocoamain.mm @@ -592,6 +592,12 @@ ContextCommand ShowContextMenu(void) { SolveSpace::Group::MenuGroup((SolveSpace::Command)cmd); } } + ++ (void)handleLocale:(id)sender { + uint32_t offset = [sender tag]; + SolveSpace::SolveSpaceUI::MenuHelp( + (SolveSpace::Command)((uint32_t)SolveSpace::Command::LOCALE + offset)); +} @end namespace SolveSpace { @@ -602,6 +608,10 @@ void InitMainMenu(NSMenu *mainMenu) { NSMenu *levels[5] = {mainMenu, 0}; NSString *label; + while([mainMenu numberOfItems] != 1) { + [mainMenu removeItemAtIndex:1]; + } + const GraphicsWindow::MenuEntry *entry = &GraphicsWindow::menu[0]; int current_level = 0; while(entry->level >= 0) { @@ -619,9 +629,9 @@ void InitMainMenu(NSMenu *mainMenu) { current_level = entry->level; if(entry->label) { + label = [NSString stringWithUTF8String:Translate(entry->label).c_str()]; /* OS X does not support mnemonics */ - label = [[NSString stringWithUTF8String:entry->label] - stringByReplacingOccurrencesOfString:@"&" withString:@""]; + label = [label stringByReplacingOccurrencesOfString:@"&" withString:@""]; unichar accelChar = entry->accel & ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK); @@ -650,6 +660,22 @@ void InitMainMenu(NSMenu *mainMenu) { [levels[entry->level] addItem:[NSMenuItem separatorItem]]; } + if(entry->id == Command::LOCALE) { + NSMenu *localeMenu = [[NSMenu alloc] initWithTitle:label]; + [menuItem setSubmenu:localeMenu]; + + size_t i = 0; + for(auto locale : Locales()) { + NSMenuItem *localeMenuItem = + [localeMenu addItemWithTitle: + [NSString stringWithUTF8String:locale.displayName.c_str()] + action:NULL keyEquivalent:@""]; + [localeMenuItem setTag:(NSInteger)i++]; + [localeMenuItem setTarget:[MainMenuResponder class]]; + [localeMenuItem setAction:@selector(handleLocale:)]; + } + } + mainMenuItems[(uint32_t)entry->id] = menuItem; ++entry; @@ -1168,6 +1194,10 @@ std::vector SolveSpace::GetFontFiles() { } @end +void SolveSpace::RefreshLocale() { + SolveSpace::InitMainMenu([NSApp mainMenu]); +} + void SolveSpace::ExitNow(void) { [NSApp stop:nil]; } @@ -1329,7 +1359,12 @@ int main(int argc, const char *argv[]) { SolveSpace::InitGraphicsWindow(); SolveSpace::InitTextWindow(); [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:nil topLevelObjects:nil]; - SolveSpace::InitMainMenu([NSApp mainMenu]); + + NSArray *languages = [NSLocale preferredLanguages]; + for(NSString *language in languages) { + dbp("%s", ([language UTF8String])); + if(SolveSpace::SetLocale([language UTF8String])) break; + } connexionInit(); SolveSpace::SS.Init(); diff --git a/src/platform/gtkmain.cpp b/src/platform/gtkmain.cpp index bd82066a..9fd51b6d 100644 --- a/src/platform/gtkmain.cpp +++ b/src/platform/gtkmain.cpp @@ -782,7 +782,7 @@ protected: } private: - const GraphicsWindow::MenuEntry &_entry; + const GraphicsWindow::MenuEntry _entry; bool _synthetic; }; @@ -808,18 +808,21 @@ static void InitMainMenu(Gtk::MenuShell *menu_shell) { current_level = entry->level; if(entry->label) { + GraphicsWindow::MenuEntry localizedEntry = *entry; + localizedEntry.label = Translate(entry->label).c_str(); + switch(entry->kind) { case GraphicsWindow::MenuKind::NORMAL: - menu_item = new MainMenuItem(*entry); + menu_item = new MainMenuItem(localizedEntry); break; case GraphicsWindow::MenuKind::CHECK: - menu_item = new MainMenuItem(*entry); + menu_item = new MainMenuItem(localizedEntry); break; case GraphicsWindow::MenuKind::RADIO: MainMenuItem *radio_item = - new MainMenuItem(*entry); + new MainMenuItem(localizedEntry); radio_item->set_draw_as_radio(true); menu_item = radio_item; break; @@ -828,6 +831,20 @@ static void InitMainMenu(Gtk::MenuShell *menu_shell) { menu_item = new Gtk::SeparatorMenuItem(); } + if(entry->id == Command::LOCALE) { + Gtk::Menu *menu = new Gtk::Menu; + menu_item->set_submenu(*menu); + + size_t i = 0; + for(auto locale : Locales()) { + GraphicsWindow::MenuEntry localeEntry = {}; + localeEntry.label = locale.displayName.c_str(); + localeEntry.id = (Command)((uint32_t)Command::LOCALE + i++); + localeEntry.fn = entry->fn; + menu->append(*new MainMenuItem(localeEntry)); + } + } + levels[entry->level]->append(*menu_item); main_menu_items[(uint32_t)entry->id] = menu_item; @@ -1347,7 +1364,17 @@ static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gxevent, GdkEvent *, gpointer) /* Application lifecycle */ -void ExitNow(void) { +void RefreshLocale() { + for(auto menu : GW->get_menubar().get_children()) { + GW->get_menubar().remove(*menu); + } + InitMainMenu(&GW->get_menubar()); + GW->get_menubar().show_all(); + GW->get_menubar().accelerate(*GW); + GW->get_menubar().accelerate(*TW); +} + +void ExitNow() { GW->hide(); TW->hide(); } @@ -1390,8 +1417,6 @@ int main(int argc, char** argv) { TW.reset(new TextWindowGtk); GW.reset(new GraphicsWindowGtk); - InitMainMenu(&GW->get_menubar()); - GW->get_menubar().accelerate(*TW); TW->set_transient_for(*GW); GW->set_icon(icon_gdk); TW->set_icon(icon_gdk); @@ -1399,6 +1424,11 @@ int main(int argc, char** argv) { TW->show_all(); GW->show_all(); + const char* const* langNames = g_get_language_names(); + while(*langNames) { + if(SetLocale(*langNames++)) break; + } + #ifdef HAVE_SPACEWARE // We don't care if it can't be opened; just continue without. spnav_x11_open(gdk_x11_get_default_xdisplay(), diff --git a/src/platform/headless.cpp b/src/platform/headless.cpp index 99f7bd5c..83505346 100644 --- a/src/platform/headless.cpp +++ b/src/platform/headless.cpp @@ -253,6 +253,9 @@ std::vector GetFontFiles() { // Application lifecycle //----------------------------------------------------------------------------- +void RefreshLocale() { +} + void ExitNow() { ssassert(false, "Not implemented"); } diff --git a/src/platform/w32main.cpp b/src/platform/w32main.cpp index 6f414670..f8ee1160 100644 --- a/src/platform/w32main.cpp +++ b/src/platform/w32main.cpp @@ -16,6 +16,11 @@ #include #include +#ifdef MenuHelp +// This is defined to IsolationAwareMenuHelp on Windows 6.0 and later. +#undef MenuHelp +#endif + #ifdef HAVE_SPACEWARE # include # include @@ -1016,6 +1021,11 @@ LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam, Group::MenuGroup(id); break; } + if((uint32_t)id >= (uint32_t)Command::LOCALE && + (uint32_t)id < ((uint32_t)Command::LOCALE + Locales().size())) { + SolveSpaceUI::MenuHelp(id); + break; + } int i; for(i = 0; SS.GW.menu[i].level >= 0; i++) { if(id == SS.GW.menu[i].id) { @@ -1293,7 +1303,7 @@ HMENU CreateGraphicsWindowMenus() if(SS.GW.menu[i].label) { std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel); const char *sep = accel.empty() ? "" : "\t"; - label = ssprintf("%s%s%s", SS.GW.menu[i].label, sep, accel.c_str()); + label = ssprintf("%s%s%s", Translate(SS.GW.menu[i].label).c_str(), sep, accel.c_str()); } if(SS.GW.menu[i].level == 0) { @@ -1311,6 +1321,15 @@ HMENU CreateGraphicsWindowMenus() RecentImportMenu = CreateMenu(); AppendMenuW(m, MF_STRING | MF_POPUP, (UINT_PTR)RecentImportMenu, Widen(label).c_str()); + } else if(SS.GW.menu[i].id == Command::LOCALE) { + HMENU LocaleMenu = CreateMenu(); + size_t i = 0; + for(auto locale : Locales()) { + AppendMenuW(LocaleMenu, MF_STRING, + (uint32_t)Command::LOCALE + i++, Widen(locale.displayName).c_str()); + } + AppendMenuW(m, MF_STRING | MF_POPUP, + (UINT_PTR)LocaleMenu, Widen(label).c_str()); } else if(SS.GW.menu[i].label) { AppendMenuW(m, MF_STRING, (uint32_t)SS.GW.menu[i].id, Widen(label).c_str()); } else { @@ -1343,12 +1362,11 @@ static void CreateMainWindows() IMAGE_ICON, 16, 16, 0); ssassert(RegisterClassEx(&wc), "Cannot register window class"); - HMENU top = CreateGraphicsWindowMenus(); GraphicsWnd = CreateWindowExW(0, L"GraphicsWnd", L"SolveSpace (not yet saved)", WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_CLIPSIBLINGS, - 50, 50, 900, 600, NULL, top, Instance, NULL); + 50, 50, 900, 600, NULL, NULL, Instance, NULL); ssassert(GraphicsWnd != NULL, "Cannot create window"); GraphicsEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"", @@ -1396,6 +1414,14 @@ static void CreateMainWindows() ClientIsSmallerBy = (r.bottom - r.top) - (rc.bottom - rc.top); } +void SolveSpace::RefreshLocale() { + HMENU oldMenu = GetMenu(GraphicsWnd); + SetMenu(GraphicsWnd, CreateGraphicsWindowMenus()); + if(oldMenu != NULL) { + DestroyMenu(oldMenu); + } +} + #ifdef HAVE_SPACEWARE //----------------------------------------------------------------------------- // Test if a message comes from the SpaceNavigator device. If yes, dispatch @@ -1478,6 +1504,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, } #endif + // Use the user default locale. + SetLocale((uint16_t)GetUserDefaultLCID()); + // Call in to the platform-independent code, and let them do their init SS.Init(); diff --git a/src/resource.cpp b/src/resource.cpp index f625f5a0..761ed70f 100644 --- a/src/resource.cpp +++ b/src/resource.cpp @@ -1473,6 +1473,7 @@ bool SetLocale(Predicate pred) { std::string filename = "locales/" + it->language + "_" + it->region + ".po"; translations[*it] = Translation::From(LoadString(filename)); currentTranslation = &translations[*it]; + RefreshLocale(); return true; } else { return false; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 8b0fec55..4262777d 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -102,6 +102,11 @@ void SolveSpaceUI::Init() { RefreshRecentMenus(); // Autosave timer autosaveInterval = CnfThawInt(5, "AutosaveInterval"); + // Locale + std::string locale = CnfThawString("", "Locale"); + if(!locale.empty()) { + SetLocale(locale); + } // The default styles (colors, line widths, etc.) are also stored in the // configuration file, but we will automatically load those as we need @@ -810,6 +815,20 @@ void SolveSpaceUI::ShowNakedEdges(bool reportOnlyWhenNotOkay) { } void SolveSpaceUI::MenuHelp(Command id) { + if((uint32_t)id >= (uint32_t)Command::LOCALE && + (uint32_t)id < ((uint32_t)Command::LOCALE + Locales().size())) { + size_t offset = (uint32_t)id - (uint32_t)Command::LOCALE; + size_t i = 0; + for(auto locale : Locales()) { + if(i++ == offset) { + CnfFreezeString(locale.Culture(), "Locale"); + SetLocale(locale.Culture()); + break; + } + } + return; + } + switch(id) { case Command::WEBSITE: OpenWebsite("http://solvespace.com/helpmenu"); diff --git a/src/solvespace.h b/src/solvespace.h index d4b70edd..b3006760 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -238,6 +238,8 @@ std::vector GetFontFiles(); void OpenWebsite(const char *url); +void RefreshLocale(); + void CheckMenuByCmd(Command id, bool checked); void RadioMenuByCmd(Command id, bool selected); void EnableMenuByCmd(Command id, bool enabled); diff --git a/src/ui.h b/src/ui.h index d2182f25..a937fac5 100644 --- a/src/ui.h +++ b/src/ui.h @@ -21,7 +21,7 @@ public: }; struct LocaleLess { - bool operator()(const Locale &a, const Locale &b) { + bool operator()(const Locale &a, const Locale &b) const { return a.language < b.language || (a.language == b.language && a.region < b.region); } @@ -143,6 +143,8 @@ enum class Command : uint32_t { // Recent RECENT_OPEN = 0xf000, RECENT_LINK = 0xf100, + // Locale + LOCALE = 0xf200, }; enum class ContextCommand : uint32_t {