summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xpo/compile.py41
-rw-r--r--po/en.po453
-rw-r--r--po/ru.po1340
-rw-r--r--res/lang/en.binbin6816 -> 11317 bytes
-rw-r--r--src/macos.m1
-rw-r--r--src/ui/bindingswidget.c12
-rw-r--r--src/ui/inputwidget.c2
-rw-r--r--src/ui/keys.c58
-rw-r--r--src/ui/sidebarwidget.c3
-rw-r--r--src/ui/translation.c4
-rw-r--r--src/ui/util.c254
11 files changed, 1991 insertions, 177 deletions
diff --git a/po/compile.py b/po/compile.py
index 6e565733..650dc3eb 100755
--- a/po/compile.py
+++ b/po/compile.py
@@ -2,8 +2,9 @@
2# Parses all the .po files and generates binary language strings to be loaded 2# Parses all the .po files and generates binary language strings to be loaded
3# at runtime via embedded data. 3# at runtime via embedded data.
4 4
5import os 5import os, sys
6 6
7MODE = 'compile'
7ESCAPES = { 8ESCAPES = {
8 '\\': '\\', 9 '\\': '\\',
9 '"': '"', 10 '"': '"',
@@ -12,6 +13,9 @@ ESCAPES = {
12 't': '\t' 13 't': '\t'
13} 14}
14 15
16if '--new' in sys.argv:
17 MODE = 'new'
18
15 19
16def unquote(string): 20def unquote(string):
17 txt = string.strip() 21 txt = string.strip()
@@ -30,12 +34,10 @@ def unquote(string):
30 else: 34 else:
31 out += c 35 out += c
32 return out 36 return out
33 37
34 38
35messages = [] 39def parse_po(src):
36for src in os.listdir('.'): 40 messages = []
37 if not src.endswith('.po'):
38 continue
39 msg_id, msg_str = None, None 41 msg_id, msg_str = None, None
40 for line in open(src, 'rt', encoding='utf-8').readlines(): 42 for line in open(src, 'rt', encoding='utf-8').readlines():
41 line = line.strip() 43 line = line.strip()
@@ -44,12 +46,23 @@ for src in os.listdir('.'):
44 elif line.startswith('msgstr'): 46 elif line.startswith('msgstr'):
45 msg_str = unquote(line[7:]) 47 msg_str = unquote(line[7:])
46 messages.append((msg_id, msg_str)) 48 messages.append((msg_id, msg_str))
47 # Make a binary blob with strings sorted by ID. 49 return messages
48 compiled = bytes()
49 for msg in sorted(messages):
50 compiled += msg[0].encode('utf-8') + bytes([0])
51 compiled += msg[1].encode('utf-8') + bytes([0])
52 #print(compiled)
53 open(f'../res/lang/{src[:-3]}.bin', 'wb').write(compiled)
54 50
51
52if MODE == 'compile':
53 for src in os.listdir('.'):
54 if src.endswith('.po'):
55 # Make a binary blob with strings sorted by ID.
56 compiled = bytes()
57 for msg in sorted(parse_po(src)):
58 compiled += msg[0].encode('utf-8') + bytes([0])
59 compiled += msg[1].encode('utf-8') + bytes([0])
60 open(f'../res/lang/{src[:-3]}.bin', 'wb').write(compiled)
61
62elif MODE == 'new':
63 messages = parse_po('en.po')
64 f = open('new.po', 'wt', encoding='utf-8')
65 for msg_id, _ in messages:
66 print(f'\nmsgid "{msg_id}"\nmsgstr ""\n', file=f)
67
55 68
diff --git a/po/en.po b/po/en.po
index 27948b3c..a00eaee5 100644
--- a/po/en.po
+++ b/po/en.po
@@ -16,6 +16,18 @@ msgstr "Cancel"
16msgid "dismiss" 16msgid "dismiss"
17msgstr "Dismiss" 17msgstr "Dismiss"
18 18
19msgid "dlg.message.ok"
20msgstr "Continue"
21
22msgid "dlg.default"
23msgstr " OK "
24
25msgid "toggle.yes"
26msgstr "YES"
27
28msgid "toggle.no"
29msgstr "NO"
30
19msgid "menu.title.file" 31msgid "menu.title.file"
20msgstr "File" 32msgstr "File"
21 33
@@ -175,6 +187,12 @@ msgstr "Subscribe to Pageā€¦"
175msgid "menu.aboutpages" 187msgid "menu.aboutpages"
176msgstr "About Pages" 188msgstr "About Pages"
177 189
190msgid "menu.about"
191msgstr "About"
192
193msgid "panel.back"
194msgstr "Back"
195
178msgid "menu.debug" 196msgid "menu.debug"
179msgstr "Debug Information" 197msgstr "Debug Information"
180 198
@@ -581,3 +599,438 @@ msgstr "View Image"
581msgid "bookmark.title.blank" 599msgid "bookmark.title.blank"
582msgstr "Blank Page" 600msgstr "Blank Page"
583 601
602msgid "heading.translate"
603msgstr "TRANSLATE PAGE"
604
605msgid "dlg.translate.unavail"
606msgstr "Service Unavailable"
607
608msgid "dlg.translate.fail"
609msgstr "Request Failed"
610
611msgid "dlg.translate"
612msgstr "Translate"
613
614msgid "dlg.translate.from"
615msgstr "From:"
616
617msgid "dlg.translate.to"
618msgstr "To:"
619
620msgid "lang.ar"
621msgstr "Arabic"
622
623msgid "lang.zh"
624msgstr "Chinese"
625
626msgid "lang.en"
627msgstr "English"
628
629msgid "lang.fr"
630msgstr "French"
631
632msgid "lang.de"
633msgstr "German"
634
635msgid "lang.hi"
636msgstr "Hindi"
637
638msgid "lang.it"
639msgstr "Italian"
640
641msgid "lang.ja"
642msgstr "Japanese"
643
644msgid "lang.pt"
645msgstr "Portuguese"
646
647msgid "lang.ru"
648msgstr "Russian"
649
650msgid "lang.es"
651msgstr "Spanish"
652
653msgid "heading.newident"
654msgstr "NEW IDENTITY"
655
656msgid "dlg.newident.rsa.selfsign"
657msgstr "Creating a self-signed 2048-bit RSA certificate."
658
659msgid "dlg.newident.until"
660msgstr "Valid until:"
661
662msgid "hint.newident.date"
663msgstr "YYYY-MM-DD HH:MM:SS"
664
665msgid "hint.newident.optional"
666msgstr "optional"
667
668msgid "dlg.newident.commonname"
669msgstr "Common name:"
670
671msgid "dlg.newident.temp"
672msgstr "Temporary:"
673
674msgid "dlg.newident.notsaved"
675msgstr "not saved to disk"
676
677msgid "dlg.newident.email"
678msgstr "Email:"
679
680msgid "dlg.newident.userid"
681msgstr "User ID:"
682
683msgid "dlg.newident.domain"
684msgstr "Domain:"
685
686msgid "dlg.newident.org"
687msgstr "Organization:"
688
689msgid "dlg.newident.country"
690msgstr "Country:"
691
692msgid "dlg.newident.create"
693msgstr "Create Identity"
694
695msgid "heading.feedcfg"
696msgstr "FEED SETTINGS"
697
698msgid "heading.subscribe"
699msgstr "SUBSCRIBE TO PAGE"
700
701msgid "dlg.feed.title"
702msgstr "Title:"
703
704msgid "dlg.feed.entrytype"
705msgstr "Entry type:"
706
707msgid "dlg.feed.type.gemini"
708msgstr "YYYY-MM-DD Links"
709
710msgid "dlg.feed.type.headings"
711msgstr "New Headings"
712
713msgid "dlg.feed.save"
714msgstr "Save Settings"
715
716msgid "dlg.feed.sub"
717msgstr "Subscribe"
718
719msgid "heading.bookmark.add"
720msgstr "ADD BOOKMARK"
721
722msgid "heading.bookmark.edit"
723msgstr "EDIT BOOKMARK"
724
725msgid "dlg.bookmark.save"
726msgstr "Save Bookmark"
727
728msgid "dlg.bookmark.title"
729msgstr "Title:"
730
731msgid "dlg.bookmark.url"
732msgstr "URL:"
733
734msgid "dlg.bookmark.tags"
735msgstr "Tags:"
736
737msgid "dlg.bookmark.icon"
738msgstr "Icon:"
739
740msgid "heading.prefs"
741msgstr "PREFERENCES"
742
743msgid "heading.prefs.certs"
744msgstr "CERTIFICATES"
745
746# tab button
747msgid "heading.prefs.colors"
748msgstr "Colors"
749
750msgid "heading.prefs.fonts"
751msgstr "FONTS"
752
753# tab button
754msgid "heading.prefs.general"
755msgstr "General"
756
757# tab button
758msgid "heading.prefs.interface"
759msgstr "Interface"
760
761# tab button
762msgid "heading.prefs.keys"
763msgstr "Keys"
764
765# tab button
766msgid "heading.prefs.network"
767msgstr "Network"
768
769msgid "heading.prefs.paragraph"
770msgstr "PARAGRAPH"
771
772msgid "heading.prefs.pagecontent"
773msgstr "PAGE CONTENT"
774
775msgid "heading.prefs.proxies"
776msgstr "PROXIES"
777
778msgid "heading.prefs.scrolling"
779msgstr "SCROLLING"
780
781msgid "heading.prefs.sizing"
782msgstr "SIZING"
783
784msgid "heading.prefs.widelayout"
785msgstr "WIDE LAYOUT"
786
787# tab button
788msgid "heading.prefs.style"
789msgstr "Style"
790
791# tab button
792msgid "heading.prefs.userinterface"
793msgstr "User Interface"
794
795msgid "prefs.downloads"
796msgstr "Donwloads folder:"
797
798msgid "prefs.searchurl"
799msgstr "Search URL:"
800
801msgid "prefs.hoverlink"
802msgstr "Show URL on hover:"
803
804msgid "prefs.centershort"
805msgstr "Vertical centering:"
806
807msgid "prefs.smoothscroll"
808msgstr "Smooth scrolling:"
809
810msgid "prefs.imageloadscroll"
811msgstr "Load image on scroll:"
812
813msgid "prefs.hidetoolbarscroll"
814msgstr "Hide toolbar on scroll:"
815
816msgid "prefs.ostheme"
817msgstr "Use system theme:"
818
819msgid "prefs.theme"
820msgstr "Theme:"
821
822msgid "prefs.theme.black"
823msgstr "Pure Black"
824
825msgid "prefs.theme.dark"
826msgstr "Dark"
827
828msgid "prefs.theme.light"
829msgstr "Light"
830
831msgid "prefs.theme.white"
832msgstr "Pure White"
833
834msgid "prefs.accent"
835msgstr "Accent color:"
836
837msgid "prefs.accent.teal"
838msgstr "Teal"
839
840msgid "prefs.accent.orange"
841msgstr "Orange"
842
843msgid "prefs.uiscale"
844msgstr "UI scale factor:"
845
846msgid "prefs.customframe"
847msgstr "Custom window frame:"
848
849msgid "prefs.retainwindow"
850msgstr "Retain placement:"
851
852msgid "prefs.sideicon"
853msgstr "Capsule icon:"
854
855msgid "prefs.doctheme.dark"
856msgstr "Dark theme:"
857
858msgid "prefs.doctheme.light"
859msgstr "Light theme:"
860
861msgid "prefs.doctheme.name.colorfuldark"
862msgstr "Colorful Dark"
863
864msgid "prefs.doctheme.name.colorfullight"
865msgstr "Colorful Light"
866
867msgid "prefs.doctheme.name.black"
868msgstr "Black"
869
870msgid "prefs.doctheme.name.gray"
871msgstr "Gray"
872
873msgid "prefs.doctheme.name.white"
874msgstr "White"
875
876msgid "prefs.doctheme.name.sepia"
877msgstr "Sepia"
878
879msgid "prefs.doctheme.name.highcontrast"
880msgstr "High Contrast"
881
882msgid "prefs.saturation"
883msgstr "Saturation:"
884
885msgid "prefs.headingfont"
886msgstr "Heading font:"
887
888msgid "prefs.font"
889msgstr "Body font:"
890
891msgid "prefs.mono"
892msgstr "Monospace body:"
893
894msgid "prefs.mono.gemini"
895msgstr "Gemini"
896
897msgid "prefs.mono.gopher"
898msgstr "Gopher"
899
900msgid "prefs.linewidth"
901msgstr "Line width:"
902
903msgid "prefs.linewidth.normal"
904msgstr "Normal"
905
906msgid "prefs.linewidth.fill"
907msgstr "Fill"
908
909msgid "prefs.quoteicon"
910msgstr "Quote indicator:"
911
912msgid "prefs.quoteicon.icon"
913msgstr "\" Icon"
914
915msgid "prefs.quoteicon.line"
916msgstr "Line"
917
918msgid "prefs.biglede"
919msgstr "Big 1st paragaph:"
920
921msgid "prefs.plaintext.wrap"
922msgstr "Wrap plain text:"
923
924msgid "prefs.decodeurls"
925msgstr "Decode URLs:"
926
927msgid "prefs.cachesize"
928msgstr "Cache size:"
929
930msgid "prefs.ca.file"
931msgstr "CA file:"
932
933msgid "prefs.ca.path"
934msgstr "CA path:"
935
936msgid "prefs.proxy.gemini"
937msgstr "Gemini proxy:"
938
939msgid "prefs.proxy.gopher"
940msgstr "Gopher proxy:"
941
942msgid "prefs.proxy.http"
943msgstr "HTTP proxy:"
944
945msgid "menu.binding.reset"
946msgstr "Reset to Default"
947
948msgid "menu.binding.clear"
949msgstr "Remove"
950
951msgid "keys.top"
952msgstr "Jump to top"
953
954msgid "keys.bottom"
955msgstr "Jump to bottom"
956
957msgid "keys.scroll.up"
958msgstr "Scroll up"
959
960msgid "keys.scroll.down"
961msgstr "Scroll down"
962
963msgid "keys.scroll.halfpage.up"
964msgstr "Scroll up half a page"
965
966msgid "keys.scroll.halfpage.down"
967msgstr "Scroll down half a page"
968
969msgid "keys.scroll.page.up"
970msgstr "Scroll up a page"
971
972msgid "keys.scroll.page.down"
973msgstr "Scroll down a page"
974
975msgid "keys.back"
976msgstr "Go back"
977
978msgid "keys.forward"
979msgstr "Go forward"
980
981msgid "keys.parent"
982msgstr "Go to parent directory"
983
984msgid "keys.root"
985msgstr "Go to capsule root"
986
987msgid "keys.reload"
988msgstr "Reload page"
989
990msgid "keys.link.modkey"
991msgstr "Open link via modifier key"
992
993msgid "keys.link.homerow"
994msgstr "Open link via home row keys"
995
996msgid "keys.link.homerow.newtab"
997msgstr "Open link in new tab via home row keys"
998
999msgid "keys.link.homerow.hover"
1000msgstr "Hover on link via home row keys"
1001
1002msgid "keys.link.homerow.next"
1003msgstr "Next set of home row key links"
1004
1005msgid "keys.bookmark.add"
1006msgstr "Add bookmark"
1007
1008msgid "keys.findtext"
1009msgstr "Find text on page"
1010
1011msgid "keys.zoom.in"
1012msgstr "Zoom in"
1013
1014msgid "keys.zoom.out"
1015msgstr "Zoom out"
1016
1017msgid "keys.zoom.reset"
1018msgstr "Reset zoom"
1019
1020msgid "keys.fullscreen"
1021msgstr "Toggle fullscreen mode"
1022
1023msgid "keys.tab.new"
1024msgstr "New tab"
1025
1026msgid "keys.tab.close"
1027msgstr "Close tab"
1028
1029msgid "keys.tab.prev"
1030msgstr "Previous tab"
1031
1032msgid "keys.tab.next"
1033msgstr "Next tab"
1034
1035msgid "keys.hoverurl"
1036msgstr "Toggle show URL on hover"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 00000000..8abcf95b
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,1340 @@
1
2msgid "about.logo"
3msgstr ""
4
5
6msgid "about.tagline"
7msgstr ""
8
9
10msgid "about.version"
11msgstr ""
12
13
14msgid "about.powered"
15msgstr ""
16
17
18msgid "cancel"
19msgstr ""
20
21
22msgid "dismiss"
23msgstr ""
24
25
26msgid "dlg.message.ok"
27msgstr ""
28
29
30msgid "dlg.default"
31msgstr ""
32
33
34msgid "toggle.yes"
35msgstr ""
36
37
38msgid "toggle.no"
39msgstr ""
40
41
42msgid "menu.title.file"
43msgstr ""
44
45
46msgid "menu.title.edit"
47msgstr ""
48
49
50msgid "menu.title.view"
51msgstr ""
52
53
54msgid "menu.title.bookmarks"
55msgstr ""
56
57
58msgid "menu.title.identity"
59msgstr ""
60
61
62msgid "menu.title.help"
63msgstr ""
64
65
66msgid "menu.newtab"
67msgstr ""
68
69
70msgid "menu.closetab"
71msgstr ""
72
73
74msgid "menu.closetab.other"
75msgstr ""
76
77
78msgid "menu.closetab.left"
79msgstr ""
80
81
82msgid "menu.closetab.right"
83msgstr ""
84
85
86msgid "menu.duptab"
87msgstr ""
88
89
90msgid "menu.openlocation"
91msgstr ""
92
93
94msgid "menu.find"
95msgstr ""
96
97
98msgid "macos.menu.find"
99msgstr ""
100
101
102msgid "menu.save.files"
103msgstr ""
104
105
106msgid "menu.save.downloads"
107msgstr ""
108
109
110msgid "menu.copy.source"
111msgstr ""
112
113
114msgid "menu.sidebar"
115msgstr ""
116
117
118msgid "menu.sidebar.left"
119msgstr ""
120
121
122msgid "menu.sidebar.right"
123msgstr ""
124
125
126msgid "menu.zoom.in"
127msgstr ""
128
129
130msgid "menu.zoom.out"
131msgstr ""
132
133
134msgid "menu.zoom.reset"
135msgstr ""
136
137
138msgid "menu.bookmarks.list"
139msgstr ""
140
141
142msgid "macos.menu.bookmarks.list"
143msgstr ""
144
145
146msgid "menu.bookmarks.bytag"
147msgstr ""
148
149
150msgid "macos.menu.bookmarks.bytag"
151msgstr ""
152
153
154msgid "menu.bookmarks.bytime"
155msgstr ""
156
157
158msgid "macos.menu.bookmarks.bytime"
159msgstr ""
160
161
162msgid "menu.feeds.entrylist"
163msgstr ""
164
165
166msgid "menu.preferences"
167msgstr ""
168
169
170msgid "menu.help"
171msgstr ""
172
173
174msgid "menu.releasenotes"
175msgstr ""
176
177
178msgid "menu.quit"
179msgstr ""
180
181
182msgid "menu.cut"
183msgstr ""
184
185
186msgid "menu.copy"
187msgstr ""
188
189
190msgid "menu.paste"
191msgstr ""
192
193
194msgid "menu.copy.pagelink"
195msgstr ""
196
197
198msgid "menu.show.bookmarks"
199msgstr ""
200
201
202msgid "menu.show.feeds"
203msgstr ""
204
205
206msgid "menu.show.history"
207msgstr ""
208
209
210msgid "menu.show.identities"
211msgstr ""
212
213
214msgid "menu.show.outline"
215msgstr ""
216
217
218msgid "menu.back"
219msgstr ""
220
221
222msgid "menu.forward"
223msgstr ""
224
225
226msgid "menu.parent"
227msgstr ""
228
229
230msgid "menu.root"
231msgstr ""
232
233
234msgid "menu.reload"
235msgstr ""
236
237
238msgid "menu.autoreload"
239msgstr ""
240
241
242msgid "menu.page.bookmark"
243msgstr ""
244
245
246msgid "menu.page.subscribe"
247msgstr ""
248
249
250msgid "menu.aboutpages"
251msgstr ""
252
253
254msgid "menu.about"
255msgstr ""
256
257
258msgid "panel.back"
259msgstr ""
260
261
262msgid "menu.debug"
263msgstr ""
264
265
266msgid "menu.import.links"
267msgstr ""
268
269
270msgid "menu.page.import"
271msgstr ""
272
273
274msgid "menu.page.translate"
275msgstr ""
276
277
278msgid "menu.page.copyurl"
279msgstr ""
280
281
282msgid "menu.page.copysource"
283msgstr ""
284
285
286msgid "menu.bookmarks.refresh"
287msgstr ""
288
289
290msgid "menu.feeds.refresh"
291msgstr ""
292
293
294msgid "menu.identity.new"
295msgstr ""
296
297
298msgid "menu.identity.import"
299msgstr ""
300
301
302msgid "menu.identity.notactive"
303msgstr ""
304
305
306msgid "sidebar.bookmarks"
307msgstr ""
308
309
310msgid "sidebar.feeds"
311msgstr ""
312
313
314msgid "sidebar.history"
315msgstr ""
316
317
318msgid "sidebar.identities"
319msgstr ""
320
321
322msgid "sidebar.outline"
323msgstr ""
324
325
326msgid "sidebar.unread"
327msgstr ""
328
329
330msgid "toolbar.outline"
331msgstr ""
332
333
334msgid "hint.findtext"
335msgstr ""
336
337
338msgid "status.query"
339msgstr ""
340
341
342msgid "status.feeds"
343msgstr ""
344
345
346msgid "mb"
347msgstr ""
348
349
350msgid "kb"
351msgstr ""
352
353
354msgid "bytes"
355msgstr ""
356
357
358msgid "page.timestamp"
359msgstr ""
360
361
362msgid "sidebar.date.thisyear"
363msgstr ""
364
365
366msgid "sidebar.date.otheryear"
367msgstr ""
368
369
370msgid "feeds.today"
371msgstr ""
372
373
374msgid "feeds.entry.newtab"
375msgstr ""
376
377
378msgid "feeds.entry.markread"
379msgstr ""
380
381
382msgid "feeds.entry.markunread"
383msgstr ""
384
385
386msgid "sidebar.entry.bookmark"
387msgstr ""
388
389
390msgid "feeds.entry.bookmark"
391msgstr ""
392
393
394msgid "feeds.entry.openfeed"
395msgstr ""
396
397
398msgid "feeds.edit"
399msgstr ""
400
401
402msgid "feeds.unsubscribe"
403msgstr ""
404
405
406msgid "feeds.markallread"
407msgstr ""
408
409
410msgid "feeds.refresh"
411msgstr ""
412
413
414msgid "menu.opentab"
415msgstr ""
416
417
418msgid "menu.opentab.background"
419msgstr ""
420
421
422msgid "menu.edit"
423msgstr ""
424
425
426msgid "menu.dup"
427msgstr ""
428
429
430msgid "menu.copyurl"
431msgstr ""
432
433
434msgid "menu.forgeturl"
435msgstr ""
436
437
438msgid "history.clear"
439msgstr ""
440
441
442msgid "heading.history.clear"
443msgstr ""
444
445
446msgid "dlg.confirm.history.clear"
447msgstr ""
448
449
450msgid "dlg.history.clear"
451msgstr ""
452
453
454msgid "bookmark.tag.home"
455msgstr ""
456
457
458msgid "bookmark.tag.sub"
459msgstr ""
460
461
462msgid "bookmark.tag.remote"
463msgstr ""
464
465
466msgid "bookmark.untag.home"
467msgstr ""
468
469
470msgid "bookmark.untag.sub"
471msgstr ""
472
473
474msgid "bookmark.untag.remote"
475msgstr ""
476
477
478msgid "bookmark.delete"
479msgstr ""
480
481
482msgid "bookmarks.reload"
483msgstr ""
484
485
486msgid "ident.using"
487msgstr ""
488
489
490msgid "ident.notused"
491msgstr ""
492
493
494msgid "ident.usedonurls"
495msgstr ""
496
497
498msgid "ident.temporary"
499msgstr ""
500
501
502msgid "ident.expiry"
503msgstr ""
504
505
506msgid "ident.use"
507msgstr ""
508
509
510msgid "ident.stopuse"
511msgstr ""
512
513
514msgid "ident.stopuse.all"
515msgstr ""
516
517
518msgid "ident.showuse"
519msgstr ""
520
521
522msgid "heading.ident.use"
523msgstr ""
524
525
526msgid "menu.edit.notes"
527msgstr ""
528
529
530msgid "heading.ident.notes"
531msgstr ""
532
533
534msgid "dlg.ident.notes"
535msgstr ""
536
537
538msgid "ident.fingerprint"
539msgstr ""
540
541
542msgid "ident.delete"
543msgstr ""
544
545
546msgid "heading.ident.delete"
547msgstr ""
548
549
550msgid "dlg.confirm.ident.delete"
551msgstr ""
552
553
554msgid "dlg.ident.delete"
555msgstr ""
556
557
558msgid "sidebar.empty.idents"
559msgstr ""
560
561
562msgid "ident.gotohelp"
563msgstr ""
564
565
566msgid "heading.unsub"
567msgstr ""
568
569
570msgid "dlg.confirm.unsub"
571msgstr ""
572
573
574msgid "dlg.unsub"
575msgstr ""
576
577
578msgid "error.unsupported.suggestsave"
579msgstr ""
580
581
582msgid "heading.pageinfo"
583msgstr ""
584
585
586msgid "pageinfo.header.cached"
587msgstr ""
588
589
590msgid "pageinfo.cert.status"
591msgstr ""
592
593
594msgid "pageinfo.cert.ca.verified"
595msgstr ""
596
597
598msgid "pageinfo.cert.ca.unverified"
599msgstr ""
600
601
602msgid "pageinfo.cert.notexpired"
603msgstr ""
604
605
606msgid "pageinfo.cert.expired"
607msgstr ""
608
609
610msgid "pageinfo.cert.trusted"
611msgstr ""
612
613
614msgid "pageinfo.cert.untrusted"
615msgstr ""
616
617
618msgid "pageinfo.domain.match"
619msgstr ""
620
621
622msgid "pageinfo.domain.mismatch"
623msgstr ""
624
625
626msgid "dlg.cert.trust"
627msgstr ""
628
629
630msgid "dlg.cert.fingerprint"
631msgstr ""
632
633
634msgid "dlg.input.prompt"
635msgstr ""
636
637
638msgid "dlg.input.send"
639msgstr ""
640
641
642msgid "heading.save"
643msgstr ""
644
645
646msgid "heading.save.incomplete"
647msgstr ""
648
649
650msgid "dlg.save.incomplete"
651msgstr ""
652
653
654msgid "dlg.save.size"
655msgstr ""
656
657
658msgid "heading.save.error"
659msgstr ""
660
661
662msgid "heading.import.bookmarks"
663msgstr ""
664
665
666msgid "dlg.import.found"
667msgstr ""
668
669
670msgid "dlg.import.found.many"
671msgstr ""
672
673
674msgid "dlg.import.add"
675msgstr ""
676
677
678msgid "dlg.import.add.many"
679msgstr ""
680
681
682msgid "dlg.import.notnew"
683msgstr ""
684
685
686msgid "heading.autoreload"
687msgstr ""
688
689
690msgid "dlg.autoreload"
691msgstr ""
692
693
694msgid "link.newtab"
695msgstr ""
696
697
698msgid "link.newtab.background"
699msgstr ""
700
701
702msgid "link.browser"
703msgstr ""
704
705
706msgid "link.noproxy"
707msgstr ""
708
709
710msgid "link.copy"
711msgstr ""
712
713
714msgid "link.bookmark"
715msgstr ""
716
717
718msgid "link.download"
719msgstr ""
720
721
722msgid "heading.openlink"
723msgstr ""
724
725
726msgid "dlg.openlink.confirm"
727msgstr ""
728
729
730msgid "dlg.openlink"
731msgstr ""
732
733
734msgid "heading.certwarn"
735msgstr ""
736
737
738msgid "dlg.certwarn.mayberenewed"
739msgstr ""
740
741
742msgid "dlg.certwarn.different"
743msgstr ""
744
745
746msgid "dlg.certwarn.expired"
747msgstr ""
748
749
750msgid "dlg.certwarn.domain"
751msgstr ""
752
753
754msgid "dlg.certwarn.domain.expired"
755msgstr ""
756
757
758msgid "link.hint.audio"
759msgstr ""
760
761
762msgid "link.hint.image"
763msgstr ""
764
765
766msgid "bookmark.title.blank"
767msgstr ""
768
769
770msgid "heading.translate"
771msgstr ""
772
773
774msgid "dlg.translate.unavail"
775msgstr ""
776
777
778msgid "dlg.translate.fail"
779msgstr ""
780
781
782msgid "dlg.translate"
783msgstr ""
784
785
786msgid "dlg.translate.from"
787msgstr ""
788
789
790msgid "dlg.translate.to"
791msgstr ""
792
793
794msgid "lang.ar"
795msgstr ""
796
797
798msgid "lang.zh"
799msgstr ""
800
801
802msgid "lang.en"
803msgstr ""
804
805
806msgid "lang.fr"
807msgstr ""
808
809
810msgid "lang.de"
811msgstr ""
812
813
814msgid "lang.hi"
815msgstr ""
816
817
818msgid "lang.it"
819msgstr ""
820
821
822msgid "lang.ja"
823msgstr ""
824
825
826msgid "lang.pt"
827msgstr ""
828
829
830msgid "lang.ru"
831msgstr ""
832
833
834msgid "lang.es"
835msgstr ""
836
837
838msgid "heading.newident"
839msgstr ""
840
841
842msgid "dlg.newident.rsa.selfsign"
843msgstr ""
844
845
846msgid "dlg.newident.until"
847msgstr ""
848
849
850msgid "hint.newident.date"
851msgstr ""
852
853
854msgid "hint.newident.optional"
855msgstr ""
856
857
858msgid "dlg.newident.commonname"
859msgstr ""
860
861
862msgid "dlg.newident.temp"
863msgstr ""
864
865
866msgid "dlg.newident.notsaved"
867msgstr ""
868
869
870msgid "dlg.newident.email"
871msgstr ""
872
873
874msgid "dlg.newident.userid"
875msgstr ""
876
877
878msgid "dlg.newident.domain"
879msgstr ""
880
881
882msgid "dlg.newident.org"
883msgstr ""
884
885
886msgid "dlg.newident.country"
887msgstr ""
888
889
890msgid "dlg.newident.create"
891msgstr ""
892
893
894msgid "heading.feedcfg"
895msgstr ""
896
897
898msgid "heading.subscribe"
899msgstr ""
900
901
902msgid "dlg.feed.title"
903msgstr ""
904
905
906msgid "dlg.feed.entrytype"
907msgstr ""
908
909
910msgid "dlg.feed.type.gemini"
911msgstr ""
912
913
914msgid "dlg.feed.type.headings"
915msgstr ""
916
917
918msgid "dlg.feed.save"
919msgstr ""
920
921
922msgid "dlg.feed.sub"
923msgstr ""
924
925
926msgid "heading.bookmark.add"
927msgstr ""
928
929
930msgid "heading.bookmark.edit"
931msgstr ""
932
933
934msgid "dlg.bookmark.save"
935msgstr ""
936
937
938msgid "dlg.bookmark.title"
939msgstr ""
940
941
942msgid "dlg.bookmark.url"
943msgstr ""
944
945
946msgid "dlg.bookmark.tags"
947msgstr ""
948
949
950msgid "dlg.bookmark.icon"
951msgstr ""
952
953
954msgid "heading.prefs"
955msgstr ""
956
957
958msgid "heading.prefs.certs"
959msgstr ""
960
961
962msgid "heading.prefs.colors"
963msgstr ""
964
965
966msgid "heading.prefs.fonts"
967msgstr ""
968
969
970msgid "heading.prefs.general"
971msgstr ""
972
973
974msgid "heading.prefs.interface"
975msgstr ""
976
977
978msgid "heading.prefs.keys"
979msgstr ""
980
981
982msgid "heading.prefs.network"
983msgstr ""
984
985
986msgid "heading.prefs.paragraph"
987msgstr ""
988
989
990msgid "heading.prefs.pagecontent"
991msgstr ""
992
993
994msgid "heading.prefs.proxies"
995msgstr ""
996
997
998msgid "heading.prefs.scrolling"
999msgstr ""
1000
1001
1002msgid "heading.prefs.sizing"
1003msgstr ""
1004
1005
1006msgid "heading.prefs.widelayout"
1007msgstr ""
1008
1009
1010msgid "heading.prefs.style"
1011msgstr ""
1012
1013
1014msgid "heading.prefs.userinterface"
1015msgstr ""
1016
1017
1018msgid "prefs.downloads"
1019msgstr ""
1020
1021
1022msgid "prefs.searchurl"
1023msgstr ""
1024
1025
1026msgid "prefs.hoverlink"
1027msgstr ""
1028
1029
1030msgid "prefs.centershort"
1031msgstr ""
1032
1033
1034msgid "prefs.smoothscroll"
1035msgstr ""
1036
1037
1038msgid "prefs.imageloadscroll"
1039msgstr ""
1040
1041
1042msgid "prefs.hidetoolbarscroll"
1043msgstr ""
1044
1045
1046msgid "prefs.ostheme"
1047msgstr ""
1048
1049
1050msgid "prefs.theme"
1051msgstr ""
1052
1053
1054msgid "prefs.theme.black"
1055msgstr ""
1056
1057
1058msgid "prefs.theme.dark"
1059msgstr ""
1060
1061
1062msgid "prefs.theme.light"
1063msgstr ""
1064
1065
1066msgid "prefs.theme.white"
1067msgstr ""
1068
1069
1070msgid "prefs.accent"
1071msgstr ""
1072
1073
1074msgid "prefs.accent.teal"
1075msgstr ""
1076
1077
1078msgid "prefs.accent.orange"
1079msgstr ""
1080
1081
1082msgid "prefs.uiscale"
1083msgstr ""
1084
1085
1086msgid "prefs.customframe"
1087msgstr ""
1088
1089
1090msgid "prefs.retainwindow"
1091msgstr ""
1092
1093
1094msgid "prefs.sideicon"
1095msgstr ""
1096
1097
1098msgid "prefs.doctheme.dark"
1099msgstr ""
1100
1101
1102msgid "prefs.doctheme.light"
1103msgstr ""
1104
1105
1106msgid "prefs.doctheme.name.colorfuldark"
1107msgstr ""
1108
1109
1110msgid "prefs.doctheme.name.colorfullight"
1111msgstr ""
1112
1113
1114msgid "prefs.doctheme.name.black"
1115msgstr ""
1116
1117
1118msgid "prefs.doctheme.name.gray"
1119msgstr ""
1120
1121
1122msgid "prefs.doctheme.name.white"
1123msgstr ""
1124
1125
1126msgid "prefs.doctheme.name.sepia"
1127msgstr ""
1128
1129
1130msgid "prefs.doctheme.name.highcontrast"
1131msgstr ""
1132
1133
1134msgid "prefs.saturation"
1135msgstr ""
1136
1137
1138msgid "prefs.headingfont"
1139msgstr ""
1140
1141
1142msgid "prefs.font"
1143msgstr ""
1144
1145
1146msgid "prefs.mono"
1147msgstr ""
1148
1149
1150msgid "prefs.mono.gemini"
1151msgstr ""
1152
1153
1154msgid "prefs.mono.gopher"
1155msgstr ""
1156
1157
1158msgid "prefs.linewidth"
1159msgstr ""
1160
1161
1162msgid "prefs.linewidth.normal"
1163msgstr ""
1164
1165
1166msgid "prefs.linewidth.fill"
1167msgstr ""
1168
1169
1170msgid "prefs.quoteicon"
1171msgstr ""
1172
1173
1174msgid "prefs.quoteicon.icon"
1175msgstr ""
1176
1177
1178msgid "prefs.quoteicon.line"
1179msgstr ""
1180
1181
1182msgid "prefs.biglede"
1183msgstr ""
1184
1185
1186msgid "prefs.plaintext.wrap"
1187msgstr ""
1188
1189
1190msgid "prefs.decodeurls"
1191msgstr ""
1192
1193
1194msgid "prefs.cachesize"
1195msgstr ""
1196
1197
1198msgid "prefs.ca.file"
1199msgstr ""
1200
1201
1202msgid "prefs.ca.path"
1203msgstr ""
1204
1205
1206msgid "prefs.proxy.gemini"
1207msgstr ""
1208
1209
1210msgid "prefs.proxy.gopher"
1211msgstr ""
1212
1213
1214msgid "prefs.proxy.http"
1215msgstr ""
1216
1217
1218msgid "menu.binding.reset"
1219msgstr ""
1220
1221
1222msgid "menu.binding.clear"
1223msgstr ""
1224
1225
1226msgid "keys.top"
1227msgstr ""
1228
1229
1230msgid "keys.bottom"
1231msgstr ""
1232
1233
1234msgid "keys.scroll.up"
1235msgstr ""
1236
1237
1238msgid "keys.scroll.down"
1239msgstr ""
1240
1241
1242msgid "keys.scroll.halfpage.up"
1243msgstr ""
1244
1245
1246msgid "keys.scroll.halfpage.down"
1247msgstr ""
1248
1249
1250msgid "keys.scroll.page.up"
1251msgstr ""
1252
1253
1254msgid "keys.scroll.page.down"
1255msgstr ""
1256
1257
1258msgid "keys.back"
1259msgstr ""
1260
1261
1262msgid "keys.forward"
1263msgstr ""
1264
1265
1266msgid "keys.parent"
1267msgstr ""
1268
1269
1270msgid "keys.root"
1271msgstr ""
1272
1273
1274msgid "keys.reload"
1275msgstr ""
1276
1277
1278msgid "keys.link.modkey"
1279msgstr ""
1280
1281
1282msgid "keys.link.homerow"
1283msgstr ""
1284
1285
1286msgid "keys.link.homerow.newtab"
1287msgstr ""
1288
1289
1290msgid "keys.link.homerow.hover"
1291msgstr ""
1292
1293
1294msgid "keys.link.homerow.next"
1295msgstr ""
1296
1297
1298msgid "keys.bookmark.add"
1299msgstr ""
1300
1301
1302msgid "keys.findtext"
1303msgstr ""
1304
1305
1306msgid "keys.zoom.in"
1307msgstr ""
1308
1309
1310msgid "keys.zoom.out"
1311msgstr ""
1312
1313
1314msgid "keys.zoom.reset"
1315msgstr ""
1316
1317
1318msgid "keys.fullscreen"
1319msgstr ""
1320
1321
1322msgid "keys.tab.new"
1323msgstr ""
1324
1325
1326msgid "keys.tab.close"
1327msgstr ""
1328
1329
1330msgid "keys.tab.prev"
1331msgstr ""
1332
1333
1334msgid "keys.tab.next"
1335msgstr ""
1336
1337
1338msgid "keys.hoverurl"
1339msgstr ""
1340
diff --git a/res/lang/en.bin b/res/lang/en.bin
index ab178d78..becb67ff 100644
--- a/res/lang/en.bin
+++ b/res/lang/en.bin
Binary files differ
diff --git a/src/macos.m b/src/macos.m
index 12575dd5..019533bd 100644
--- a/src/macos.m
+++ b/src/macos.m
@@ -369,6 +369,7 @@ void setupApplication_MacOS(void) {
369} 369}
370 370
371void enableMenu_MacOS(const char *menuLabel, iBool enable) { 371void enableMenu_MacOS(const char *menuLabel, iBool enable) {
372 menuLabel = translateCStr_Lang(menuLabel);
372 NSApplication *app = [NSApplication sharedApplication]; 373 NSApplication *app = [NSApplication sharedApplication];
373 NSMenu *appMenu = [app mainMenu]; 374 NSMenu *appMenu = [app mainMenu];
374 NSString *label = [NSString stringWithUTF8String:menuLabel]; 375 NSString *label = [NSString stringWithUTF8String:menuLabel];
diff --git a/src/ui/bindingswidget.c b/src/ui/bindingswidget.c
index 558bdcd5..c73982b3 100644
--- a/src/ui/bindingswidget.c
+++ b/src/ui/bindingswidget.c
@@ -26,6 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
26#include "command.h" 26#include "command.h"
27#include "util.h" 27#include "util.h"
28#include "app.h" 28#include "app.h"
29#include "lang.h"
29#if defined (iPlatformAppleDesktop) 30#if defined (iPlatformAppleDesktop)
30# include "macos.h" 31# include "macos.h"
31#endif 32#endif
@@ -97,6 +98,7 @@ static void updateItems_BindingsWidget_(iBindingsWidget *d) {
97 iBindingItem *item = new_BindingItem(); 98 iBindingItem *item = new_BindingItem();
98 item->id = bind->id; 99 item->id = bind->id;
99 set_String(&item->label, &bind->label); 100 set_String(&item->label, &bind->label);
101 translate_Lang(&item->label);
100 toString_Sym(bind->key, bind->mods, &item->key); 102 toString_Sym(bind->key, bind->mods, &item->key);
101 addItem_ListWidget(d->list, item); 103 addItem_ListWidget(d->list, item);
102 } 104 }
@@ -118,8 +120,8 @@ void init_BindingsWidget(iBindingsWidget *d) {
118 updateItems_BindingsWidget_(d); 120 updateItems_BindingsWidget_(d);
119 d->menu = makeMenu_Widget( 121 d->menu = makeMenu_Widget(
120 w, 122 w,
121 (iMenuItem[]){ { "Reset to Default", 0, 0, "binding.reset" }, 123 (iMenuItem[]){ { "${menu.binding.reset}", 0, 0, "binding.reset" },
122 { uiTextCaution_ColorEscape "Clear", 0, 0, "binding.clear" } }, 124 { uiTextCaution_ColorEscape "${menu.binding.clear}", 0, 0, "binding.clear" } },
123 2); 125 2);
124} 126}
125 127
@@ -143,9 +145,9 @@ static void setActiveItem_BindingsWidget_(iBindingsWidget *d, size_t pos) {
143#if defined (iPlatformAppleDesktop) 145#if defined (iPlatformAppleDesktop)
144 /* Native menus must be disabled while grabbing keys so the shortcuts don't trigger. */ 146 /* Native menus must be disabled while grabbing keys so the shortcuts don't trigger. */
145 const iBool enableNativeMenus = (d->activePos == iInvalidPos); 147 const iBool enableNativeMenus = (d->activePos == iInvalidPos);
146 enableMenu_MacOS("Edit", enableNativeMenus); 148 enableMenu_MacOS("${menu.title.edit}", enableNativeMenus);
147 enableMenu_MacOS("View", enableNativeMenus); 149 enableMenu_MacOS("${menu.title.view}", enableNativeMenus);
148 enableMenu_MacOS("Identity", enableNativeMenus); 150 enableMenu_MacOS("${menu.title.identity}", enableNativeMenus);
149#endif 151#endif
150} 152}
151 153
diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c
index 699ed184..05b83b3d 100644
--- a/src/ui/inputwidget.c
+++ b/src/ui/inputwidget.c
@@ -26,6 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
26#include "util.h" 26#include "util.h"
27#include "keys.h" 27#include "keys.h"
28#include "prefs.h" 28#include "prefs.h"
29#include "lang.h"
29#include "app.h" 30#include "app.h"
30 31
31#include <the_Foundation/array.h> 32#include <the_Foundation/array.h>
@@ -251,6 +252,7 @@ void setMaxLen_InputWidget(iInputWidget *d, size_t maxLen) {
251 252
252void setHint_InputWidget(iInputWidget *d, const char *hintText) { 253void setHint_InputWidget(iInputWidget *d, const char *hintText) {
253 setCStr_String(&d->hint, hintText); 254 setCStr_String(&d->hint, hintText);
255 translate_Lang(&d->hint); /* TODO: Keep original for retranslations. */
254} 256}
255 257
256void setContentPadding_InputWidget(iInputWidget *d, int left, int right) { 258void setContentPadding_InputWidget(iInputWidget *d, int left, int right) {
diff --git a/src/ui/keys.c b/src/ui/keys.c
index 4d3f79f7..f59c5997 100644
--- a/src/ui/keys.c
+++ b/src/ui/keys.c
@@ -192,37 +192,37 @@ enum iBindFlag {
192/* TODO: This indirection could be used for localization, although all UI strings 192/* TODO: This indirection could be used for localization, although all UI strings
193 would need to be similarly handled. */ 193 would need to be similarly handled. */
194static const struct { int id; iMenuItem bind; int flags; } defaultBindings_[] = { 194static const struct { int id; iMenuItem bind; int flags; } defaultBindings_[] = {
195 { 1, { "Jump to top", SDLK_HOME, 0, "scroll.top" }, 0 }, 195 { 1, { "${keys.top}", SDLK_HOME, 0, "scroll.top" }, 0 },
196 { 2, { "Jump to bottom", SDLK_END, 0, "scroll.bottom" }, 0 }, 196 { 2, { "${keys.bottom}", SDLK_END, 0, "scroll.bottom" }, 0 },
197 { 10, { "Scroll up", SDLK_UP, 0, "scroll.step arg:-1" }, argRepeat_BindFlag }, 197 { 10, { "${keys.scroll.up}", SDLK_UP, 0, "scroll.step arg:-1" }, argRepeat_BindFlag },
198 { 11, { "Scroll down", SDLK_DOWN, 0, "scroll.step arg:1" }, argRepeat_BindFlag }, 198 { 11, { "${keys.scroll.down}", SDLK_DOWN, 0, "scroll.step arg:1" }, argRepeat_BindFlag },
199 { 22, { "Scroll up half a page", SDLK_SPACE, KMOD_SHIFT, "scroll.page arg:-1" }, argRepeat_BindFlag }, 199 { 22, { "${keys.scroll.halfpage.up}", SDLK_SPACE, KMOD_SHIFT, "scroll.page arg:-1" }, argRepeat_BindFlag },
200 { 23, { "Scroll down half a page", SDLK_SPACE, 0, "scroll.page arg:1" }, argRepeat_BindFlag }, 200 { 23, { "${keys.scroll.halfpage.down}", SDLK_SPACE, 0, "scroll.page arg:1" }, argRepeat_BindFlag },
201 { 24, { "Scroll up a page", SDLK_PAGEUP, 0, "scroll.page arg:-1 full:1" }, argRepeat_BindFlag }, 201 { 24, { "${keys.scroll.page.up}", SDLK_PAGEUP, 0, "scroll.page arg:-1 full:1" }, argRepeat_BindFlag },
202 { 25, { "Scroll down a page", SDLK_PAGEDOWN, 0, "scroll.page arg:1 full:1" }, argRepeat_BindFlag }, 202 { 25, { "${keys.scroll.page.down}", SDLK_PAGEDOWN, 0, "scroll.page arg:1 full:1" }, argRepeat_BindFlag },
203 { 30, { "Go back", navigateBack_KeyShortcut, "navigate.back" }, 0 }, 203 { 30, { "${keys.back}", navigateBack_KeyShortcut, "navigate.back" }, 0 },
204 { 31, { "Go forward", navigateForward_KeyShortcut, "navigate.forward" }, 0 }, 204 { 31, { "${keys.forward}", navigateForward_KeyShortcut, "navigate.forward" }, 0 },
205 { 32, { "Go to parent directory", navigateParent_KeyShortcut, "navigate.parent" }, 0 }, 205 { 32, { "${keys.parent}", navigateParent_KeyShortcut, "navigate.parent" }, 0 },
206 { 33, { "Go to site root", navigateRoot_KeyShortcut, "navigate.root" }, 0 }, 206 { 33, { "${keys.root}", navigateRoot_KeyShortcut, "navigate.root" }, 0 },
207 { 35, { "Reload page", reload_KeyShortcut, "document.reload" }, 0 }, 207 { 35, { "${keys.reload}", reload_KeyShortcut, "document.reload" }, 0 },
208 { 41, { "Open link via modifier key", SDLK_LALT, 0, "document.linkkeys arg:0" }, argRelease_BindFlag }, 208 { 41, { "${keys.link.modkey}", SDLK_LALT, 0, "document.linkkeys arg:0" }, argRelease_BindFlag },
209 { 42, { "Open link via home row keys", 'f', 0, "document.linkkeys arg:1" }, 0 }, 209 { 42, { "${keys.link.homerow}", 'f', 0, "document.linkkeys arg:1" }, 0 },
210 { 45, { "Open link in new tab via home row keys", 'f', KMOD_SHIFT, "document.linkkeys arg:1 newtab:1" }, 0 }, 210 { 45, { "${keys.link.homerow.newtab}", 'f', KMOD_SHIFT, "document.linkkeys arg:1 newtab:1" }, 0 },
211 { 46, { "Hover on link via home row keys", 'h', 0, "document.linkkeys arg:1 hover:1" }, 0 }, 211 { 46, { "${keys.link.homerow.hover}", 'h', 0, "document.linkkeys arg:1 hover:1" }, 0 },
212 { 47, { "Next set of home row key links", '.', 0, "document.linkkeys more:1" }, 0 }, 212 { 47, { "${keys.link.homerow.next}", '.', 0, "document.linkkeys more:1" }, 0 },
213 { 50, { "Add bookmark", 'd', KMOD_PRIMARY, "bookmark.add" }, 0 }, 213 { 50, { "${keys.bookmark.add}", 'd', KMOD_PRIMARY, "bookmark.add" }, 0 },
214 { 60, { "Find text on page", 'f', KMOD_PRIMARY, "focus.set id:find.input" }, 0 }, 214 { 60, { "${keys.findtext}", 'f', KMOD_PRIMARY, "focus.set id:find.input" }, 0 },
215 { 70, { "Zoom in", SDLK_EQUALS, KMOD_PRIMARY, "zoom.delta arg:10" }, 0 }, 215 { 70, { "${keys.zoom.in}", SDLK_EQUALS, KMOD_PRIMARY, "zoom.delta arg:10" }, 0 },
216 { 71, { "Zoom out", SDLK_MINUS, KMOD_PRIMARY, "zoom.delta arg:-10" }, 0 }, 216 { 71, { "${keys.zoom.out}", SDLK_MINUS, KMOD_PRIMARY, "zoom.delta arg:-10" }, 0 },
217 { 72, { "Reset zoom", SDLK_0, KMOD_PRIMARY, "zoom.set arg:100" }, 0 }, 217 { 72, { "${keys.zoom.reset}", SDLK_0, KMOD_PRIMARY, "zoom.set arg:100" }, 0 },
218#if !defined (iPlatformApple) /* Ctrl-Cmd-F on macOS */ 218#if !defined (iPlatformApple) /* Ctrl-Cmd-F on macOS */
219 { 73, { "Toggle fullscreen mode", SDLK_F11, 0, "window.fullscreen" }, 0 }, 219 { 73, { "${keys.fullscreen}", SDLK_F11, 0, "window.fullscreen" }, 0 },
220#endif 220#endif
221 { 76, { "New tab", newTab_KeyShortcut, "tabs.new" }, 0 }, 221 { 76, { "${keys.tab.new}", newTab_KeyShortcut, "tabs.new" }, 0 },
222 { 77, { "Close tab", closeTab_KeyShortcut, "tabs.close" }, 0 }, 222 { 77, { "${keys.tab.close}", closeTab_KeyShortcut, "tabs.close" }, 0 },
223 { 80, { "Previous tab", prevTab_KeyShortcut, "tabs.prev" }, 0 }, 223 { 80, { "${keys.tab.prev}", prevTab_KeyShortcut, "tabs.prev" }, 0 },
224 { 81, { "Next tab", nextTab_KeyShortcut, "tabs.next" }, 0 }, 224 { 81, { "${keys.tab.next}", nextTab_KeyShortcut, "tabs.next" }, 0 },
225 { 100,{ "Toggle show URL on hover", '/', KMOD_PRIMARY, "prefs.hoverlink.toggle" }, 0 }, 225 { 100,{ "${keys.hoverurl}", '/', KMOD_PRIMARY, "prefs.hoverlink.toggle" }, 0 },
226 /* The following cannot currently be changed (built-in duplicates). */ 226 /* The following cannot currently be changed (built-in duplicates). */
227#if defined (iPlatformApple) 227#if defined (iPlatformApple)
228 { 1002, { NULL, SDLK_LEFTBRACKET, KMOD_PRIMARY, "navigate.back" }, 0 }, 228 { 1002, { NULL, SDLK_LEFTBRACKET, KMOD_PRIMARY, "navigate.back" }, 0 },
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 7a704de7..8d025569 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -175,7 +175,8 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
175 if (today.year == on.year && 175 if (today.year == on.year &&
176 today.month == on.month && 176 today.month == on.month &&
177 today.day == on.day) { 177 today.day == on.day) {
178 appendCStr_String(text, " \u2014 ${feeds.today}"); 178 appendCStr_String(text, " \u2014 ");
179 appendCStr_String(text, cstr_Lang("feeds.today"));
179 } 180 }
180 set_String(&sep->meta, text); 181 set_String(&sep->meta, text);
181 delete_String(text); 182 delete_String(text);
diff --git a/src/ui/translation.c b/src/ui/translation.c
index aaedfa4f..86607fc6 100644
--- a/src/ui/translation.c
+++ b/src/ui/translation.c
@@ -363,7 +363,7 @@ static iBool processResult_Translation_(iTranslation *d) {
363 SDL_RemoveTimer(d->timer); 363 SDL_RemoveTimer(d->timer);
364 d->timer = 0; 364 d->timer = 0;
365 if (status_TlsRequest(d->request) == error_TlsRequestStatus) { 365 if (status_TlsRequest(d->request) == error_TlsRequestStatus) {
366 setFailed_Translation_(d, explosion_Icon " Request Failed"); 366 setFailed_Translation_(d, explosion_Icon " ${dlg.translate.fail}");
367 return iFalse; 367 return iFalse;
368 } 368 }
369 iBlock *resultData = collect_Block(readAll_TlsRequest(d->request)); 369 iBlock *resultData = collect_Block(readAll_TlsRequest(d->request));
@@ -417,7 +417,7 @@ static iBool processResult_Translation_(iTranslation *d) {
417 delete_String(translation); 417 delete_String(translation);
418 } 418 }
419 else { 419 else {
420 setFailed_Translation_(d, unhappy_Icon " Service Unavailable"); 420 setFailed_Translation_(d, unhappy_Icon " ${dlg.translate.unavail}");
421 return iFalse; 421 return iFalse;
422 } 422 }
423 return iTrue; 423 return iTrue;
diff --git a/src/ui/util.c b/src/ui/util.c
index 5a08ec20..94690bc6 100644
--- a/src/ui/util.c
+++ b/src/ui/util.c
@@ -1137,7 +1137,7 @@ void finalizeSheet_Widget(iWidget *sheet) {
1137 pushBack_PtrArray(panelButtons, 1137 pushBack_PtrArray(panelButtons,
1138 addChildFlags_Widget(topPanel, 1138 addChildFlags_Widget(topPanel,
1139 iClob(panelButton = makePanelButton_( 1139 iClob(panelButton = makePanelButton_(
1140 i == 1 ? "User Interface" : cstr_String(text), 1140 i == 1 ? "${heading.prefs.userinterface}" : cstr_String(text),
1141 "panel.open")), 1141 "panel.open")),
1142 (i == 0 ? borderTop_WidgetFlag : 0) | 1142 (i == 0 ? borderTop_WidgetFlag : 0) |
1143 chevron_WidgetFlag)); 1143 chevron_WidgetFlag));
@@ -1332,10 +1332,10 @@ void finalizeSheet_Widget(iWidget *sheet) {
1332 if (isPrefs) { 1332 if (isPrefs) {
1333 addChild_Widget(topPanel, iClob(makePadding_Widget(lineHeight_Text(defaultBig_FontId)))); 1333 addChild_Widget(topPanel, iClob(makePadding_Widget(lineHeight_Text(defaultBig_FontId))));
1334 addChildFlags_Widget(topPanel, 1334 addChildFlags_Widget(topPanel,
1335 iClob(makePanelButton_(info_Icon " Help", "panel.showhelp")), 1335 iClob(makePanelButton_(info_Icon " ${menu.help}", "panel.showhelp")),
1336 borderTop_WidgetFlag); 1336 borderTop_WidgetFlag);
1337 addChildFlags_Widget(topPanel, 1337 addChildFlags_Widget(topPanel,
1338 iClob(makePanelButton_(planet_Icon " About", "panel.about")), 1338 iClob(makePanelButton_(planet_Icon " ${menu.about}", "panel.about")),
1339 chevron_WidgetFlag); 1339 chevron_WidgetFlag);
1340 } 1340 }
1341 else { 1341 else {
@@ -1362,7 +1362,7 @@ void finalizeSheet_Widget(iWidget *sheet) {
1362 setBackgroundColor_Widget(navi, uiBackground_ColorId); 1362 setBackgroundColor_Widget(navi, uiBackground_ColorId);
1363 addChild_Widget(navi, iClob(makePadding_Widget(0))); 1363 addChild_Widget(navi, iClob(makePadding_Widget(0)));
1364 iLabelWidget *back = addChildFlags_Widget(navi, 1364 iLabelWidget *back = addChildFlags_Widget(navi,
1365 iClob(new_LabelWidget(leftAngle_Icon " Back", "panel.close")), 1365 iClob(new_LabelWidget(leftAngle_Icon " ${panel.back}", "panel.close")),
1366 noBackground_WidgetFlag | frameless_WidgetFlag | 1366 noBackground_WidgetFlag | frameless_WidgetFlag |
1367 alignLeft_WidgetFlag | extraPadding_WidgetFlag); 1367 alignLeft_WidgetFlag | extraPadding_WidgetFlag);
1368 checkIcon_LabelWidget(back); 1368 checkIcon_LabelWidget(back);
@@ -1577,11 +1577,11 @@ iWidget *makeDialogButtons_Widget(const iMenuItem *actions, size_t numActions) {
1577 kmods = 0; 1577 kmods = 0;
1578 } 1578 }
1579 if (label == NULL) { 1579 if (label == NULL) {
1580 label = uiTextAction_ColorEscape " OK "; 1580 label = format_CStr(uiTextAction_ColorEscape "%s", cstr_Lang("dlg.default"));
1581 } 1581 }
1582 } 1582 }
1583 iLabelWidget *button = 1583 iLabelWidget *button =
1584 addChild_Widget(div, iClob(newKeyMods_LabelWidget(actions[i].label, key, kmods, cmd))); 1584 addChild_Widget(div, iClob(newKeyMods_LabelWidget(label, key, kmods, cmd)));
1585 setFont_LabelWidget(button, isDefault ? fonts[1] : fonts[0]); 1585 setFont_LabelWidget(button, isDefault ? fonts[1] : fonts[0]);
1586 } 1586 }
1587 return div; 1587 return div;
@@ -1655,7 +1655,7 @@ static iBool messageHandler_(iWidget *msg, const char *cmd) {
1655 1655
1656iWidget *makeMessage_Widget(const char *title, const char *msg) { 1656iWidget *makeMessage_Widget(const char *title, const char *msg) {
1657 iWidget *dlg = 1657 iWidget *dlg =
1658 makeQuestion_Widget(title, msg, (iMenuItem[]){ { "Continue", 0, 0, "message.ok" } }, 1); 1658 makeQuestion_Widget(title, msg, (iMenuItem[]){ { "${dlg.message.ok}", 0, 0, "message.ok" } }, 1);
1659 addAction_Widget(dlg, SDLK_ESCAPE, 0, "message.ok"); 1659 addAction_Widget(dlg, SDLK_ESCAPE, 0, "message.ok");
1660 addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok"); 1660 addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok");
1661 return dlg; 1661 return dlg;
@@ -1679,12 +1679,14 @@ iWidget *makeQuestion_Widget(const char *title, const char *msg,
1679 1679
1680void setToggle_Widget(iWidget *d, iBool active) { 1680void setToggle_Widget(iWidget *d, iBool active) {
1681 if (d) { 1681 if (d) {
1682 const char *YES = cstr_Lang("toggle.yes");
1683 const char *NO = cstr_Lang("toggle.no");
1682 setFlags_Widget(d, selected_WidgetFlag, active); 1684 setFlags_Widget(d, selected_WidgetFlag, active);
1683 iLabelWidget *label = (iLabelWidget *) d; 1685 iLabelWidget *label = (iLabelWidget *) d;
1684 if (!cmp_String(text_LabelWidget(label), "YES") || 1686 if (!cmp_String(text_LabelWidget(label), YES) ||
1685 !cmp_String(text_LabelWidget(label), "NO")) { 1687 !cmp_String(text_LabelWidget(label), NO)) {
1686 updateText_LabelWidget((iLabelWidget *) d, 1688 updateText_LabelWidget((iLabelWidget *) d,
1687 collectNewFormat_String("%s", isSelected_Widget(d) ? "YES" : "NO")); 1689 collectNewCStr_String(isSelected_Widget(d) ? YES : NO));
1688 } 1690 }
1689 else { 1691 else {
1690 refresh_Widget(d); 1692 refresh_Widget(d);
@@ -1788,85 +1790,85 @@ static void addFontButtons_(iWidget *parent, const char *id) {
1788iWidget *makePreferences_Widget(void) { 1790iWidget *makePreferences_Widget(void) {
1789 iWidget *dlg = makeSheet_Widget("prefs"); 1791 iWidget *dlg = makeSheet_Widget("prefs");
1790 addChildFlags_Widget(dlg, 1792 addChildFlags_Widget(dlg,
1791 iClob(new_LabelWidget(uiHeading_ColorEscape "PREFERENCES", NULL)), 1793 iClob(new_LabelWidget(uiHeading_ColorEscape "${heading.prefs}", NULL)),
1792 frameless_WidgetFlag); 1794 frameless_WidgetFlag);
1793 iWidget *tabs = makeTabs_Widget(dlg); 1795 iWidget *tabs = makeTabs_Widget(dlg);
1794 setBackgroundColor_Widget(findChild_Widget(tabs, "tabs.buttons"), uiBackgroundSidebar_ColorId); 1796 setBackgroundColor_Widget(findChild_Widget(tabs, "tabs.buttons"), uiBackgroundSidebar_ColorId);
1795 setId_Widget(tabs, "prefs.tabs"); 1797 setId_Widget(tabs, "prefs.tabs");
1796 iWidget *headings, *values; 1798 iWidget *headings, *values;
1797 /* General preferences. */ { 1799 /* General preferences. */ {
1798 appendTwoColumnPage_(tabs, "General", '1', &headings, &values); 1800 appendTwoColumnPage_(tabs, "${heading.prefs.general}", '1', &headings, &values);
1799#if defined (LAGRANGE_DOWNLOAD_EDIT) 1801#if defined (LAGRANGE_DOWNLOAD_EDIT)
1800 addChild_Widget(headings, iClob(makeHeading_Widget("Downloads folder:"))); 1802 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.downloads}")));
1801 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.downloads"); 1803 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.downloads");
1802#endif 1804#endif
1803 addChild_Widget(headings, iClob(makeHeading_Widget("Search URL:"))); 1805 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.searchurl}")));
1804 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.searchurl"); 1806 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.searchurl");
1805 addChild_Widget(headings, iClob(makeHeading_Widget("Show URL on hover:"))); 1807 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.hoverlink}")));
1806 addChild_Widget(values, iClob(makeToggle_Widget("prefs.hoverlink"))); 1808 addChild_Widget(values, iClob(makeToggle_Widget("prefs.hoverlink")));
1807 addChild_Widget(headings, iClob(makeHeading_Widget("Vertical centering:"))); 1809 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.centershort}")));
1808 addChild_Widget(values, iClob(makeToggle_Widget("prefs.centershort"))); 1810 addChild_Widget(values, iClob(makeToggle_Widget("prefs.centershort")));
1809 makeTwoColumnHeading_("SCROLLING", headings, values); 1811 makeTwoColumnHeading_("${heading.prefs.scrolling}", headings, values);
1810 addChild_Widget(headings, iClob(makeHeading_Widget("Smooth scrolling:"))); 1812 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.smoothscroll}")));
1811 addChild_Widget(values, iClob(makeToggle_Widget("prefs.smoothscroll"))); 1813 addChild_Widget(values, iClob(makeToggle_Widget("prefs.smoothscroll")));
1812 addChild_Widget(headings, iClob(makeHeading_Widget("Load image on scroll:"))); 1814 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.imageloadscroll}")));
1813 addChild_Widget(values, iClob(makeToggle_Widget("prefs.imageloadscroll"))); 1815 addChild_Widget(values, iClob(makeToggle_Widget("prefs.imageloadscroll")));
1814 if (deviceType_App() == phone_AppDeviceType) { 1816 if (deviceType_App() == phone_AppDeviceType) {
1815 addChild_Widget(headings, iClob(makeHeading_Widget("Hide toolbar on scroll:"))); 1817 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.hidetoolbarscroll}")));
1816 addChild_Widget(values, iClob(makeToggle_Widget("prefs.hidetoolbarscroll"))); 1818 addChild_Widget(values, iClob(makeToggle_Widget("prefs.hidetoolbarscroll")));
1817 } 1819 }
1818 } 1820 }
1819 /* Window. */ { 1821 /* Window. */ {
1820 appendTwoColumnPage_(tabs, "Interface", '2', &headings, &values); 1822 appendTwoColumnPage_(tabs, "${heading.prefs.interface}", '2', &headings, &values);
1821#if defined (iPlatformApple) || defined (iPlatformMSys) 1823#if defined (iPlatformApple) || defined (iPlatformMSys)
1822 addChild_Widget(headings, iClob(makeHeading_Widget("Use system theme:"))); 1824 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.ostheme}")));
1823 addChild_Widget(values, iClob(makeToggle_Widget("prefs.ostheme"))); 1825 addChild_Widget(values, iClob(makeToggle_Widget("prefs.ostheme")));
1824#endif 1826#endif
1825 addChild_Widget(headings, iClob(makeHeading_Widget("Theme:"))); 1827 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.theme}")));
1826 iWidget *themes = new_Widget(); 1828 iWidget *themes = new_Widget();
1827 /* Themes. */ { 1829 /* Themes. */ {
1828 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure Black", "theme.set arg:0"))), "prefs.theme.0"); 1830 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("${prefs.theme.black}", "theme.set arg:0"))), "prefs.theme.0");
1829 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Dark", "theme.set arg:1"))), "prefs.theme.1"); 1831 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("${prefs.theme.dark}", "theme.set arg:1"))), "prefs.theme.1");
1830 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Light", "theme.set arg:2"))), "prefs.theme.2"); 1832 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("${prefs.theme.light}", "theme.set arg:2"))), "prefs.theme.2");
1831 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure White", "theme.set arg:3"))), "prefs.theme.3"); 1833 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("${prefs.theme.white}", "theme.set arg:3"))), "prefs.theme.3");
1832 } 1834 }
1833 addChildFlags_Widget(values, iClob(themes), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1835 addChildFlags_Widget(values, iClob(themes), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1834 /* Accents. */ 1836 /* Accents. */
1835 iWidget *accent = new_Widget(); { 1837 iWidget *accent = new_Widget(); {
1836 setId_Widget(addChild_Widget(accent, iClob(new_LabelWidget("Teal", "accent.set arg:0"))), "prefs.accent.0"); 1838 setId_Widget(addChild_Widget(accent, iClob(new_LabelWidget("${prefs.accent.teal}", "accent.set arg:0"))), "prefs.accent.0");
1837 setId_Widget(addChild_Widget(accent, iClob(new_LabelWidget("Orange", "accent.set arg:1"))), "prefs.accent.1"); 1839 setId_Widget(addChild_Widget(accent, iClob(new_LabelWidget("${prefs.accent.orange}", "accent.set arg:1"))), "prefs.accent.1");
1838 } 1840 }
1839 addChild_Widget(headings, iClob(makeHeading_Widget("Accent color:"))); 1841 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.accent}")));
1840 addChildFlags_Widget(values, iClob(accent), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1842 addChildFlags_Widget(values, iClob(accent), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1841#if defined (LAGRANGE_CUSTOM_FRAME) 1843#if defined (LAGRANGE_CUSTOM_FRAME)
1842 addChild_Widget(headings, iClob(makeHeading_Widget("Custom window frame:"))); 1844 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.customframe}")));
1843 addChild_Widget(values, iClob(makeToggle_Widget("prefs.customframe"))); 1845 addChild_Widget(values, iClob(makeToggle_Widget("prefs.customframe")));
1844#endif 1846#endif
1845 makeTwoColumnHeading_("SIZING", headings, values); 1847 makeTwoColumnHeading_("${heading.prefs.sizing}", headings, values);
1846 addChild_Widget(headings, iClob(makeHeading_Widget("UI scale factor:"))); 1848 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.uiscale}")));
1847 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(8))), "prefs.uiscale"); 1849 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(8))), "prefs.uiscale");
1848 addChild_Widget(headings, iClob(makeHeading_Widget("Retain placement:"))); 1850 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.retainwindow}")));
1849 addChild_Widget(values, iClob(makeToggle_Widget("prefs.retainwindow"))); 1851 addChild_Widget(values, iClob(makeToggle_Widget("prefs.retainwindow")));
1850 makeTwoColumnHeading_("WIDE LAYOUT", headings, values); 1852 makeTwoColumnHeading_("${heading.prefs.widelayout}", headings, values);
1851 addChild_Widget(headings, iClob(makeHeading_Widget("Site icon:"))); 1853 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.sideicon}")));
1852 addChild_Widget(values, iClob(makeToggle_Widget("prefs.sideicon"))); 1854 addChild_Widget(values, iClob(makeToggle_Widget("prefs.sideicon")));
1853 } 1855 }
1854 /* Colors. */ { 1856 /* Colors. */ {
1855 appendTwoColumnPage_(tabs, "Colors", '3', &headings, &values); 1857 appendTwoColumnPage_(tabs, "${heading.prefs.colors}", '3', &headings, &values);
1856 makeTwoColumnHeading_("PAGE CONTENT", headings, values); 1858 makeTwoColumnHeading_("${heading.prefs.pagecontent}", headings, values);
1857 for (int i = 0; i < 2; ++i) { 1859 for (int i = 0; i < 2; ++i) {
1858 const iBool isDark = (i == 0); 1860 const iBool isDark = (i == 0);
1859 const char *mode = isDark ? "dark" : "light"; 1861 const char *mode = isDark ? "dark" : "light";
1860 const iMenuItem themes[] = { 1862 const iMenuItem themes[] = {
1861 { "Colorful Dark", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, colorfulDark_GmDocumentTheme) }, 1863 { "${prefs.doctheme.name.colorfuldark}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, colorfulDark_GmDocumentTheme) },
1862 { "Colorful Light", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, colorfulLight_GmDocumentTheme) }, 1864 { "${prefs.doctheme.name.colorfullight}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, colorfulLight_GmDocumentTheme) },
1863 { "Black", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, black_GmDocumentTheme) }, 1865 { "${prefs.doctheme.name.black}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, black_GmDocumentTheme) },
1864 { "Gray", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, gray_GmDocumentTheme) }, 1866 { "${prefs.doctheme.name.gray}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, gray_GmDocumentTheme) },
1865 { "White", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, white_GmDocumentTheme) }, 1867 { "${prefs.doctheme.name.white}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, white_GmDocumentTheme) },
1866 { "Sepia", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, sepia_GmDocumentTheme) }, 1868 { "${prefs.doctheme.name.sepia}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, sepia_GmDocumentTheme) },
1867 { "High Contrast", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, highContrast_GmDocumentTheme) }, 1869 { "${prefs.doctheme.name.highcontrast}", 0, 0, format_CStr("doctheme.%s.set arg:%d", mode, highContrast_GmDocumentTheme) },
1868 }; 1870 };
1869 addChild_Widget(headings, iClob(makeHeading_Widget(isDark ? "Dark theme:" : "Light theme:"))); 1871 addChild_Widget(headings, iClob(makeHeading_Widget(isDark ? "${prefs.doctheme.dark}" : "${prefs.doctheme.light}")));
1870 iLabelWidget *button = 1872 iLabelWidget *button =
1871 makeMenuButton_LabelWidget(themes[1].label, themes, iElemCount(themes)); 1873 makeMenuButton_LabelWidget(themes[1].label, themes, iElemCount(themes));
1872// setFrameColor_Widget(findChild_Widget(as_Widget(button), "menu"), 1874// setFrameColor_Widget(findChild_Widget(as_Widget(button), "menu"),
@@ -1875,7 +1877,7 @@ iWidget *makePreferences_Widget(void) {
1875 setId_Widget(addChildFlags_Widget(values, iClob(button), alignLeft_WidgetFlag), 1877 setId_Widget(addChildFlags_Widget(values, iClob(button), alignLeft_WidgetFlag),
1876 format_CStr("prefs.doctheme.%s", mode)); 1878 format_CStr("prefs.doctheme.%s", mode));
1877 } 1879 }
1878 addChild_Widget(headings, iClob(makeHeading_Widget("Saturation:"))); 1880 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.saturation}")));
1879 iWidget *sats = new_Widget(); 1881 iWidget *sats = new_Widget();
1880 /* Saturation levels. */ { 1882 /* Saturation levels. */ {
1881 addRadioButton_(sats, "prefs.saturation.3", "100 %%", "saturation.set arg:100"); 1883 addRadioButton_(sats, "prefs.saturation.3", "100 %%", "saturation.set arg:100");
@@ -1886,75 +1888,75 @@ iWidget *makePreferences_Widget(void) {
1886 addChildFlags_Widget(values, iClob(sats), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1888 addChildFlags_Widget(values, iClob(sats), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1887 } 1889 }
1888 /* Layout. */ { 1890 /* Layout. */ {
1889 appendTwoColumnPage_(tabs, "Style", '4', &headings, &values); 1891 appendTwoColumnPage_(tabs, "${heading.prefs.style}", '4', &headings, &values);
1890 makeTwoColumnHeading_("FONTS", headings, values); 1892 makeTwoColumnHeading_("${heading.prefs.fonts}", headings, values);
1891 /* Fonts. */ { 1893 /* Fonts. */ {
1892 iWidget *fonts; 1894 iWidget *fonts;
1893 addChild_Widget(headings, iClob(makeHeading_Widget("Heading font:"))); 1895 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.headingfont}")));
1894 addFontButtons_(values, "headingfont"); 1896 addFontButtons_(values, "headingfont");
1895 addChild_Widget(headings, iClob(makeHeading_Widget("Body font:"))); 1897 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.font}")));
1896 addFontButtons_(values, "font"); 1898 addFontButtons_(values, "font");
1897 addChild_Widget(headings, iClob(makeHeading_Widget("Monospace body:"))); 1899 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.mono}")));
1898 iWidget *mono = new_Widget(); 1900 iWidget *mono = new_Widget();
1899 /* TODO: Needs labels! */ 1901 /* TODO: Needs labels! */
1900 setTextCStr_LabelWidget( 1902 setTextCStr_LabelWidget(
1901 addChild_Widget(mono, iClob(makeToggle_Widget("prefs.mono.gemini"))), "Gemini"); 1903 addChild_Widget(mono, iClob(makeToggle_Widget("prefs.mono.gemini"))), "${prefs.mono.gemini}");
1902 setTextCStr_LabelWidget( 1904 setTextCStr_LabelWidget(
1903 addChild_Widget(mono, iClob(makeToggle_Widget("prefs.mono.gopher"))), "Gopher"); 1905 addChild_Widget(mono, iClob(makeToggle_Widget("prefs.mono.gopher"))), "${prefs.mono.gopher}");
1904 addChildFlags_Widget(values, iClob(mono), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1906 addChildFlags_Widget(values, iClob(mono), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1905 } 1907 }
1906 makeTwoColumnHeading_("PARAGRAPH", headings, values); 1908 makeTwoColumnHeading_("${heading.prefs.paragraph}", headings, values);
1907 addChild_Widget(headings, iClob(makeHeading_Widget("Line width:"))); 1909 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.linewidth}")));
1908 iWidget *widths = new_Widget(); 1910 iWidget *widths = new_Widget();
1909 /* Line widths. */ { 1911 /* Line widths. */ {
1910 addRadioButton_(widths, "prefs.linewidth.30", "\u20132", "linewidth.set arg:30"); 1912 addRadioButton_(widths, "prefs.linewidth.30", "\u20132", "linewidth.set arg:30");
1911 addRadioButton_(widths, "prefs.linewidth.34", "\u20131", "linewidth.set arg:34"); 1913 addRadioButton_(widths, "prefs.linewidth.34", "\u20131", "linewidth.set arg:34");
1912 addRadioButton_(widths, "prefs.linewidth.38", "Normal", "linewidth.set arg:38"); 1914 addRadioButton_(widths, "prefs.linewidth.38", "${prefs.linewidth.normal}", "linewidth.set arg:38");
1913 addRadioButton_(widths, "prefs.linewidth.43", "+1", "linewidth.set arg:43"); 1915 addRadioButton_(widths, "prefs.linewidth.43", "+1", "linewidth.set arg:43");
1914 addRadioButton_(widths, "prefs.linewidth.48", "+2", "linewidth.set arg:48"); 1916 addRadioButton_(widths, "prefs.linewidth.48", "+2", "linewidth.set arg:48");
1915 addRadioButton_(widths, "prefs.linewidth.1000", "Window", "linewidth.set arg:1000"); 1917 addRadioButton_(widths, "prefs.linewidth.1000", "${prefs.linewidth.fill}", "linewidth.set arg:1000");
1916 } 1918 }
1917 addChildFlags_Widget(values, iClob(widths), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1919 addChildFlags_Widget(values, iClob(widths), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1918 addChild_Widget(headings, iClob(makeHeading_Widget("Quote indicator:"))); 1920 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.quoteicon}")));
1919 iWidget *quote = new_Widget(); { 1921 iWidget *quote = new_Widget(); {
1920 addRadioButton_(quote, "prefs.quoteicon.1", "Icon", "quoteicon.set arg:1"); 1922 addRadioButton_(quote, "prefs.quoteicon.1", "${prefs.quoteicon.icon}", "quoteicon.set arg:1");
1921 addRadioButton_(quote, "prefs.quoteicon.0", "Line", "quoteicon.set arg:0"); 1923 addRadioButton_(quote, "prefs.quoteicon.0", "${prefs.quoteicon.line}", "quoteicon.set arg:0");
1922 } 1924 }
1923 addChildFlags_Widget(values, iClob(quote), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1925 addChildFlags_Widget(values, iClob(quote), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1924 addChild_Widget(headings, iClob(makeHeading_Widget("Big 1st paragaph:"))); 1926 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.biglede}")));
1925 addChild_Widget(values, iClob(makeToggle_Widget("prefs.biglede"))); 1927 addChild_Widget(values, iClob(makeToggle_Widget("prefs.biglede")));
1926 addChild_Widget(headings, iClob(makeHeading_Widget("Wrap plain text:"))); 1928 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.plaintext.wrap}")));
1927 addChild_Widget(values, iClob(makeToggle_Widget("prefs.plaintext.wrap"))); 1929 addChild_Widget(values, iClob(makeToggle_Widget("prefs.plaintext.wrap")));
1928 } 1930 }
1929 /* Network. */ { 1931 /* Network. */ {
1930 appendTwoColumnPage_(tabs, "Network", '5', &headings, &values); 1932 appendTwoColumnPage_(tabs, "${heading.prefs.network}", '5', &headings, &values);
1931 addChild_Widget(headings, iClob(makeHeading_Widget("Decode URLs:"))); 1933 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.decodeurls}")));
1932 addChild_Widget(values, iClob(makeToggle_Widget("prefs.decodeurls"))); 1934 addChild_Widget(values, iClob(makeToggle_Widget("prefs.decodeurls")));
1933 addChild_Widget(headings, iClob(makeHeading_Widget("Cache size:"))); 1935 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.cachesize}")));
1934 iWidget *cacheGroup = new_Widget(); { 1936 iWidget *cacheGroup = new_Widget(); {
1935 iInputWidget *cache = new_InputWidget(4); 1937 iInputWidget *cache = new_InputWidget(4);
1936 setSelectAllOnFocus_InputWidget(cache, iTrue); 1938 setSelectAllOnFocus_InputWidget(cache, iTrue);
1937 setId_Widget(addChild_Widget(cacheGroup, iClob(cache)), "prefs.cachesize"); 1939 setId_Widget(addChild_Widget(cacheGroup, iClob(cache)), "prefs.cachesize");
1938 addChildFlags_Widget(cacheGroup, iClob(new_LabelWidget("MB", NULL)), frameless_WidgetFlag); 1940 addChildFlags_Widget(cacheGroup, iClob(new_LabelWidget("${mb}", NULL)), frameless_WidgetFlag);
1939 } 1941 }
1940 addChildFlags_Widget(values, iClob(cacheGroup), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1942 addChildFlags_Widget(values, iClob(cacheGroup), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1941 makeTwoColumnHeading_("CERTIFICATES", headings, values); 1943 makeTwoColumnHeading_("${heading.prefs.certs}", headings, values);
1942 addChild_Widget(headings, iClob(makeHeading_Widget("CA file:"))); 1944 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.ca.file}")));
1943 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.ca.file"); 1945 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.ca.file");
1944 addChild_Widget(headings, iClob(makeHeading_Widget("CA path:"))); 1946 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.ca.path}")));
1945 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.ca.path"); 1947 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.ca.path");
1946 makeTwoColumnHeading_("PROXIES", headings, values); 1948 makeTwoColumnHeading_("${heading.prefs.proxies}", headings, values);
1947 addChild_Widget(headings, iClob(makeHeading_Widget("Gemini proxy:"))); 1949 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.proxy.gemini}")));
1948 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gemini"); 1950 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gemini");
1949 addChild_Widget(headings, iClob(makeHeading_Widget("Gopher proxy:"))); 1951 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.proxy.gopher}")));
1950 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gopher"); 1952 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gopher");
1951 addChild_Widget(headings, iClob(makeHeading_Widget("HTTP proxy:"))); 1953 addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.proxy.http}")));
1952 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.http"); 1954 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.http");
1953 } 1955 }
1954 /* Keybindings. */ 1956 /* Keybindings. */
1955 if (deviceType_App() == desktop_AppDeviceType) { 1957 if (deviceType_App() == desktop_AppDeviceType) {
1956 iBindingsWidget *bind = new_BindingsWidget(); 1958 iBindingsWidget *bind = new_BindingsWidget();
1957 appendFramelessTabPage_(tabs, iClob(bind), "Keys", '6', KMOD_PRIMARY); 1959 appendFramelessTabPage_(tabs, iClob(bind), "${heading.prefs.keys}", '6', KMOD_PRIMARY);
1958 } 1960 }
1959 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI))); 1961 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI)));
1960 resizeToLargestPage_Widget(tabs); 1962 resizeToLargestPage_Widget(tabs);
@@ -1980,20 +1982,20 @@ iWidget *makeBookmarkEditor_Widget(void) {
1980 iWidget *dlg = makeSheet_Widget("bmed"); 1982 iWidget *dlg = makeSheet_Widget("bmed");
1981 setId_Widget(addChildFlags_Widget( 1983 setId_Widget(addChildFlags_Widget(
1982 dlg, 1984 dlg,
1983 iClob(new_LabelWidget(uiHeading_ColorEscape "EDIT BOOKMARK", NULL)), 1985 iClob(new_LabelWidget(uiHeading_ColorEscape "${heading.bookmark.edit}", NULL)),
1984 frameless_WidgetFlag), 1986 frameless_WidgetFlag),
1985 "bmed.heading"); 1987 "bmed.heading");
1986 iWidget *headings, *values; 1988 iWidget *headings, *values;
1987 addChild_Widget(dlg, iClob(makeTwoColumnWidget_(&headings, &values))); 1989 addChild_Widget(dlg, iClob(makeTwoColumnWidget_(&headings, &values)));
1988 iInputWidget *inputs[4]; 1990 iInputWidget *inputs[4];
1989 addChild_Widget(headings, iClob(makeHeading_Widget("Title:"))); 1991 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.bookmark.title}")));
1990 setId_Widget(addChild_Widget(values, iClob(inputs[0] = new_InputWidget(0))), "bmed.title"); 1992 setId_Widget(addChild_Widget(values, iClob(inputs[0] = new_InputWidget(0))), "bmed.title");
1991 addChild_Widget(headings, iClob(makeHeading_Widget("URL:"))); 1993 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.bookmark.url}")));
1992 setId_Widget(addChild_Widget(values, iClob(inputs[1] = new_InputWidget(0))), "bmed.url"); 1994 setId_Widget(addChild_Widget(values, iClob(inputs[1] = new_InputWidget(0))), "bmed.url");
1993 setUrlContent_InputWidget(inputs[1], iTrue); 1995 setUrlContent_InputWidget(inputs[1], iTrue);
1994 addChild_Widget(headings, iClob(makeHeading_Widget("Tags:"))); 1996 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.bookmark.tags}")));
1995 setId_Widget(addChild_Widget(values, iClob(inputs[2] = new_InputWidget(0))), "bmed.tags"); 1997 setId_Widget(addChild_Widget(values, iClob(inputs[2] = new_InputWidget(0))), "bmed.tags");
1996 addChild_Widget(headings, iClob(makeHeading_Widget("Icon:"))); 1998 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.bookmark.icon}")));
1997 setId_Widget(addChild_Widget(values, iClob(inputs[3] = new_InputWidget(1))), "bmed.icon"); 1999 setId_Widget(addChild_Widget(values, iClob(inputs[3] = new_InputWidget(1))), "bmed.icon");
1998 arrange_Widget(dlg); 2000 arrange_Widget(dlg);
1999 for (int i = 0; i < 3; ++i) { 2001 for (int i = 0; i < 3; ++i) {
@@ -2002,7 +2004,7 @@ iWidget *makeBookmarkEditor_Widget(void) {
2002 addChild_Widget( 2004 addChild_Widget(
2003 dlg, 2005 dlg,
2004 iClob(makeDialogButtons_Widget((iMenuItem[]){ { "${cancel}", 0, 0, NULL }, 2006 iClob(makeDialogButtons_Widget((iMenuItem[]){ { "${cancel}", 0, 0, NULL },
2005 { uiTextCaution_ColorEscape "Save Bookmark", 2007 { uiTextCaution_ColorEscape "${dlg.bookmark.save}",
2006 SDLK_RETURN, 2008 SDLK_RETURN,
2007 KMOD_PRIMARY, 2009 KMOD_PRIMARY,
2008 "bmed.accept" } }, 2010 "bmed.accept" } },
@@ -2045,7 +2047,7 @@ iWidget *makeBookmarkCreation_Widget(const iString *url, const iString *title, i
2045 iWidget *dlg = makeBookmarkEditor_Widget(); 2047 iWidget *dlg = makeBookmarkEditor_Widget();
2046 setId_Widget(dlg, "bmed.create"); 2048 setId_Widget(dlg, "bmed.create");
2047 setTextCStr_LabelWidget(findChild_Widget(dlg, "bmed.heading"), 2049 setTextCStr_LabelWidget(findChild_Widget(dlg, "bmed.heading"),
2048 uiHeading_ColorEscape "ADD BOOKMARK"); 2050 uiHeading_ColorEscape "${heading.bookmark.add}");
2049 iUrl parts; 2051 iUrl parts;
2050 init_Url(&parts, url); 2052 init_Url(&parts, url);
2051 setTextCStr_InputWidget(findChild_Widget(dlg, "bmed.title"), 2053 setTextCStr_InputWidget(findChild_Widget(dlg, "bmed.title"),
@@ -2112,28 +2114,28 @@ iWidget *makeFeedSettings_Widget(uint32_t bookmarkId) {
2112 iWidget *dlg = makeSheet_Widget("feedcfg"); 2114 iWidget *dlg = makeSheet_Widget("feedcfg");
2113 setId_Widget(addChildFlags_Widget( 2115 setId_Widget(addChildFlags_Widget(
2114 dlg, 2116 dlg,
2115 iClob(new_LabelWidget(bookmarkId ? uiHeading_ColorEscape "FEED SETTINGS" 2117 iClob(new_LabelWidget(bookmarkId ? uiHeading_ColorEscape "${heading.feedcfg}"
2116 : uiHeading_ColorEscape "SUBSCRIBE TO PAGE", 2118 : uiHeading_ColorEscape "${heading.subscribe}",
2117 NULL)), 2119 NULL)),
2118 frameless_WidgetFlag), 2120 frameless_WidgetFlag),
2119 "feedcfg.heading"); 2121 "feedcfg.heading");
2120 iWidget *headings, *values; 2122 iWidget *headings, *values;
2121 addChild_Widget(dlg, iClob(makeTwoColumnWidget_(&headings, &values))); 2123 addChild_Widget(dlg, iClob(makeTwoColumnWidget_(&headings, &values)));
2122 addChild_Widget(headings, iClob(makeHeading_Widget("Title:"))); 2124 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.feed.title}")));
2123 iInputWidget *input = new_InputWidget(0); 2125 iInputWidget *input = new_InputWidget(0);
2124 setId_Widget(addChild_Widget(values, iClob(input)), "feedcfg.title"); 2126 setId_Widget(addChild_Widget(values, iClob(input)), "feedcfg.title");
2125 addChild_Widget(headings, iClob(makeHeading_Widget("Entry type:"))); 2127 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.feed.entrytype}")));
2126 iWidget *types = new_Widget(); { 2128 iWidget *types = new_Widget(); {
2127 addRadioButton_(types, "feedcfg.type.gemini", "YYYY-MM-DD Links", "feedcfg.type arg:0"); 2129 addRadioButton_(types, "feedcfg.type.gemini", "${dlg.feed.type.gemini}", "feedcfg.type arg:0");
2128 addRadioButton_(types, "feedcfg.type.headings", "New Headings", "feedcfg.type arg:1"); 2130 addRadioButton_(types, "feedcfg.type.headings", "${dlg.feed.type.headings}", "feedcfg.type arg:1");
2129 } 2131 }
2130 addChildFlags_Widget(values, iClob(types), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 2132 addChildFlags_Widget(values, iClob(types), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
2131 iWidget *buttons = 2133 iWidget *buttons =
2132 addChild_Widget(dlg, 2134 addChild_Widget(dlg,
2133 iClob(makeDialogButtons_Widget( 2135 iClob(makeDialogButtons_Widget(
2134 (iMenuItem[]){ { "${cancel}", 0, 0, NULL }, 2136 (iMenuItem[]){ { "${cancel}", 0, 0, NULL },
2135 { bookmarkId ? uiTextCaution_ColorEscape "Save Settings" 2137 { bookmarkId ? uiTextCaution_ColorEscape "${dlg.feed.save}"
2136 : uiTextCaution_ColorEscape "Subscribe", 2138 : uiTextCaution_ColorEscape "${dlg.feed.sub}",
2137 SDLK_RETURN, 2139 SDLK_RETURN,
2138 KMOD_PRIMARY, 2140 KMOD_PRIMARY,
2139 format_CStr("feedcfg.accept bmid:%d", bookmarkId) } }, 2141 format_CStr("feedcfg.accept bmid:%d", bookmarkId) } },
@@ -2161,14 +2163,14 @@ iWidget *makeIdentityCreation_Widget(void) {
2161 iWidget *dlg = makeSheet_Widget("ident"); 2163 iWidget *dlg = makeSheet_Widget("ident");
2162 setId_Widget(addChildFlags_Widget( 2164 setId_Widget(addChildFlags_Widget(
2163 dlg, 2165 dlg,
2164 iClob(new_LabelWidget(uiHeading_ColorEscape "NEW IDENTITY", NULL)), 2166 iClob(new_LabelWidget(uiHeading_ColorEscape "${heading.newident}", NULL)),
2165 frameless_WidgetFlag), 2167 frameless_WidgetFlag),
2166 "ident.heading"); 2168 "ident.heading");
2167 iWidget *page = new_Widget(); 2169 iWidget *page = new_Widget();
2168 addChildFlags_Widget( 2170 addChildFlags_Widget(
2169 dlg, 2171 dlg,
2170 iClob( 2172 iClob(
2171 new_LabelWidget("Creating a self-signed 2048-bit RSA certificate.", NULL)), 2173 new_LabelWidget("${dlg.newident.rsa.selfsign}", NULL)),
2172 frameless_WidgetFlag); 2174 frameless_WidgetFlag);
2173 addChild_Widget(dlg, iClob(page)); 2175 addChild_Widget(dlg, iClob(page));
2174 setFlags_Widget(page, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 2176 setFlags_Widget(page, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);
@@ -2177,35 +2179,35 @@ iWidget *makeIdentityCreation_Widget(void) {
2177 iWidget *values = addChildFlags_Widget( 2179 iWidget *values = addChildFlags_Widget(
2178 page, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag); 2180 page, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag);
2179 iInputWidget *inputs[6]; 2181 iInputWidget *inputs[6];
2180 addChild_Widget(headings, iClob(makeHeading_Widget("Valid until:"))); 2182 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.until}")));
2181 setId_Widget(addChild_Widget(values, iClob(newHint_InputWidget(19, "YYYY-MM-DD HH:MM:SS"))), "ident.until"); 2183 setId_Widget(addChild_Widget(values, iClob(newHint_InputWidget(19, "${hint.newident.date}"))), "ident.until");
2182 addChild_Widget(headings, iClob(makeHeading_Widget("Common name:"))); 2184 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.commonname}")));
2183 setId_Widget(addChild_Widget(values, iClob(inputs[0] = new_InputWidget(0))), "ident.common"); 2185 setId_Widget(addChild_Widget(values, iClob(inputs[0] = new_InputWidget(0))), "ident.common");
2184 /* Temporary? */ { 2186 /* Temporary? */ {
2185 addChild_Widget(headings, iClob(makeHeading_Widget("Temporary:"))); 2187 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.temp}")));
2186 iWidget *tmpGroup = new_Widget(); 2188 iWidget *tmpGroup = new_Widget();
2187 setFlags_Widget(tmpGroup, arrangeSize_WidgetFlag | arrangeHorizontal_WidgetFlag, iTrue); 2189 setFlags_Widget(tmpGroup, arrangeSize_WidgetFlag | arrangeHorizontal_WidgetFlag, iTrue);
2188 addChild_Widget(tmpGroup, iClob(makeToggle_Widget("ident.temp"))); 2190 addChild_Widget(tmpGroup, iClob(makeToggle_Widget("ident.temp")));
2189 setId_Widget( 2191 setId_Widget(
2190 addChildFlags_Widget( 2192 addChildFlags_Widget(
2191 tmpGroup, 2193 tmpGroup,
2192 iClob(new_LabelWidget(uiTextCaution_ColorEscape "\u26a0 not saved to disk", NULL)), 2194 iClob(new_LabelWidget(uiTextCaution_ColorEscape "\u26a0 ${dlg.newident.notsaved}", NULL)),
2193 hidden_WidgetFlag | frameless_WidgetFlag), 2195 hidden_WidgetFlag | frameless_WidgetFlag),
2194 "ident.temp.note"); 2196 "ident.temp.note");
2195 addChild_Widget(values, iClob(tmpGroup)); 2197 addChild_Widget(values, iClob(tmpGroup));
2196 } 2198 }
2197 addChild_Widget(headings, iClob(makePadding_Widget(gap_UI))); 2199 addChild_Widget(headings, iClob(makePadding_Widget(gap_UI)));
2198 addChild_Widget(values, iClob(makePadding_Widget(gap_UI))); 2200 addChild_Widget(values, iClob(makePadding_Widget(gap_UI)));
2199 addChild_Widget(headings, iClob(makeHeading_Widget("Email:"))); 2201 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.email}")));
2200 setId_Widget(addChild_Widget(values, iClob(inputs[1] = newHint_InputWidget(0, "optional"))), "ident.email"); 2202 setId_Widget(addChild_Widget(values, iClob(inputs[1] = newHint_InputWidget(0, "${hint.newident.optional}"))), "ident.email");
2201 addChild_Widget(headings, iClob(makeHeading_Widget("User ID:"))); 2203 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.userid}")));
2202 setId_Widget(addChild_Widget(values, iClob(inputs[2] = newHint_InputWidget(0, "optional"))), "ident.userid"); 2204 setId_Widget(addChild_Widget(values, iClob(inputs[2] = newHint_InputWidget(0, "${hint.newident.optional}"))), "ident.userid");
2203 addChild_Widget(headings, iClob(makeHeading_Widget("Domain:"))); 2205 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.domain}")));
2204 setId_Widget(addChild_Widget(values, iClob(inputs[3] = newHint_InputWidget(0, "optional"))), "ident.domain"); 2206 setId_Widget(addChild_Widget(values, iClob(inputs[3] = newHint_InputWidget(0, "${hint.newident.optional}"))), "ident.domain");
2205 addChild_Widget(headings, iClob(makeHeading_Widget("Organization:"))); 2207 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.org}")));
2206 setId_Widget(addChild_Widget(values, iClob(inputs[4] = newHint_InputWidget(0, "optional"))), "ident.org"); 2208 setId_Widget(addChild_Widget(values, iClob(inputs[4] = newHint_InputWidget(0, "${hint.newident.optional}"))), "ident.org");
2207 addChild_Widget(headings, iClob(makeHeading_Widget("Country:"))); 2209 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.newident.country}")));
2208 setId_Widget(addChild_Widget(values, iClob(inputs[5] = newHint_InputWidget(0, "optional"))), "ident.country"); 2210 setId_Widget(addChild_Widget(values, iClob(inputs[5] = newHint_InputWidget(0, "${hint.newident.optional}"))), "ident.country");
2209 arrange_Widget(dlg); 2211 arrange_Widget(dlg);
2210 for (size_t i = 0; i < iElemCount(inputs); ++i) { 2212 for (size_t i = 0; i < iElemCount(inputs); ++i) {
2211 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x; 2213 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x;
@@ -2213,7 +2215,7 @@ iWidget *makeIdentityCreation_Widget(void) {
2213 addChild_Widget( 2215 addChild_Widget(
2214 dlg, 2216 dlg,
2215 iClob(makeDialogButtons_Widget((iMenuItem[]){ { "${cancel}", 0, 0, NULL }, 2217 iClob(makeDialogButtons_Widget((iMenuItem[]){ { "${cancel}", 0, 0, NULL },
2216 { uiTextAction_ColorEscape "Create Identity", 2218 { uiTextAction_ColorEscape "${dlg.newident.create}",
2217 SDLK_RETURN, 2219 SDLK_RETURN,
2218 KMOD_PRIMARY, 2220 KMOD_PRIMARY,
2219 "ident.accept" } }, 2221 "ident.accept" } },
@@ -2224,17 +2226,17 @@ iWidget *makeIdentityCreation_Widget(void) {
2224} 2226}
2225 2227
2226static const iMenuItem languages[] = { 2228static const iMenuItem languages[] = {
2227 { "Arabic", 0, 0, "xlt.lang id:ar" }, 2229 { "${lang.ar}", 0, 0, "xlt.lang id:ar" },
2228 { "Chinese", 0, 0, "xlt.lang id:zh" }, 2230 { "${lang.zh}", 0, 0, "xlt.lang id:zh" },
2229 { "English", 0, 0, "xlt.lang id:en" }, 2231 { "${lang.en}", 0, 0, "xlt.lang id:en" },
2230 { "French", 0, 0, "xlt.lang id:fr" }, 2232 { "${lang.fr}", 0, 0, "xlt.lang id:fr" },
2231 { "German", 0, 0, "xlt.lang id:de" }, 2233 { "${lang.de}", 0, 0, "xlt.lang id:de" },
2232 { "Hindi", 0, 0, "xlt.lang id:hi" }, 2234 { "${lang.hi}", 0, 0, "xlt.lang id:hi" },
2233 { "Italian", 0, 0, "xlt.lang id:it" }, 2235 { "${lang.it}", 0, 0, "xlt.lang id:it" },
2234 { "Japanese", 0, 0, "xlt.lang id:ja" }, 2236 { "${lang.ja}", 0, 0, "xlt.lang id:ja" },
2235 { "Portuguese", 0, 0, "xlt.lang id:pt" }, 2237 { "${lang.pt}", 0, 0, "xlt.lang id:pt" },
2236 { "Russian", 0, 0, "xlt.lang id:ru" }, 2238 { "${lang.ru}", 0, 0, "xlt.lang id:ru" },
2237 { "Spanish", 0, 0, "xlt.lang id:es" }, 2239 { "${lang.es}", 0, 0, "xlt.lang id:es" },
2238}; 2240};
2239 2241
2240static iBool translationHandler_(iWidget *dlg, const char *cmd) { 2242static iBool translationHandler_(iWidget *dlg, const char *cmd) {
@@ -2251,7 +2253,7 @@ static iBool translationHandler_(iWidget *dlg, const char *cmd) {
2251 2253
2252const char *languageId_String(const iString *menuItemLabel) { 2254const char *languageId_String(const iString *menuItemLabel) {
2253 iForIndices(i, languages) { 2255 iForIndices(i, languages) {
2254 if (!cmp_String(menuItemLabel, languages[i].label)) { 2256 if (!cmp_String(menuItemLabel, translateCStr_Lang(languages[i].label))) {
2255 return cstr_Rangecc(range_Command(languages[i].command, "id")); 2257 return cstr_Rangecc(range_Command(languages[i].command, "id"));
2256 } 2258 }
2257 } 2259 }
@@ -2272,7 +2274,7 @@ iWidget *makeTranslation_Widget(iWidget *parent) {
2272 setFlags_Widget(dlg, keepOnTop_WidgetFlag, iFalse); 2274 setFlags_Widget(dlg, keepOnTop_WidgetFlag, iFalse);
2273 setCommandHandler_Widget(dlg, translationHandler_); 2275 setCommandHandler_Widget(dlg, translationHandler_);
2274 addChildFlags_Widget(dlg, 2276 addChildFlags_Widget(dlg,
2275 iClob(new_LabelWidget(uiHeading_ColorEscape "TRANSLATE PAGE", NULL)), 2277 iClob(new_LabelWidget(uiHeading_ColorEscape "${heading.translate}", NULL)),
2276 frameless_WidgetFlag); 2278 frameless_WidgetFlag);
2277 addChild_Widget(dlg, iClob(makePadding_Widget(lineHeight_Text(uiLabel_FontId)))); 2279 addChild_Widget(dlg, iClob(makePadding_Widget(lineHeight_Text(uiLabel_FontId))));
2278 iWidget *headings, *values; 2280 iWidget *headings, *values;
@@ -2281,11 +2283,11 @@ iWidget *makeTranslation_Widget(iWidget *parent) {
2281 setId_Widget(page, "xlt.langs"); 2283 setId_Widget(page, "xlt.langs");
2282 iLabelWidget *fromLang, *toLang; 2284 iLabelWidget *fromLang, *toLang;
2283 /* Source language. */ { 2285 /* Source language. */ {
2284 addChild_Widget(headings, iClob(makeHeading_Widget("From:"))); 2286 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.translate.from}")));
2285 setId_Widget( 2287 setId_Widget(
2286 addChildFlags_Widget(values, 2288 addChildFlags_Widget(values,
2287 iClob(fromLang = makeMenuButton_LabelWidget( 2289 iClob(fromLang = makeMenuButton_LabelWidget(
2288 "Portuguese", languages, iElemCount(languages))), 2290 "${lang.pt}", languages, iElemCount(languages))),
2289 alignLeft_WidgetFlag), 2291 alignLeft_WidgetFlag),
2290 "xlt.from"); 2292 "xlt.from");
2291 iWidget *langMenu = findChild_Widget(as_Widget(fromLang), "menu"); 2293 iWidget *langMenu = findChild_Widget(as_Widget(fromLang), "menu");
@@ -2294,10 +2296,10 @@ iWidget *makeTranslation_Widget(iWidget *parent) {
2294 setBackgroundColor_Widget(langMenu, uiBackgroundMenu_ColorId); 2296 setBackgroundColor_Widget(langMenu, uiBackgroundMenu_ColorId);
2295 } 2297 }
2296 /* Target language. */ { 2298 /* Target language. */ {
2297 addChild_Widget(headings, iClob(makeHeading_Widget("To:"))); 2299 addChild_Widget(headings, iClob(makeHeading_Widget("${dlg.translate.to}")));
2298 setId_Widget(addChildFlags_Widget(values, 2300 setId_Widget(addChildFlags_Widget(values,
2299 iClob(toLang = makeMenuButton_LabelWidget( 2301 iClob(toLang = makeMenuButton_LabelWidget(
2300 "Portuguese", languages, iElemCount(languages))), 2302 "${lang.pt}", languages, iElemCount(languages))),
2301 alignLeft_WidgetFlag), 2303 alignLeft_WidgetFlag),
2302 "xlt.to"); 2304 "xlt.to");
2303 iWidget *langMenu = findChild_Widget(as_Widget(toLang), "menu"); 2305 iWidget *langMenu = findChild_Widget(as_Widget(toLang), "menu");
@@ -2311,7 +2313,7 @@ iWidget *makeTranslation_Widget(iWidget *parent) {
2311 iClob(makeDialogButtons_Widget( 2313 iClob(makeDialogButtons_Widget(
2312 (iMenuItem[]){ 2314 (iMenuItem[]){
2313 { "${cancel}", SDLK_ESCAPE, 0, "translation.cancel" }, 2315 { "${cancel}", SDLK_ESCAPE, 0, "translation.cancel" },
2314 { uiTextAction_ColorEscape "Translate", SDLK_RETURN, 0, "translation.submit" } }, 2316 { uiTextAction_ColorEscape "${dlg.translate}", SDLK_RETURN, 0, "translation.submit" } },
2315 2))); 2317 2)));
2316 addChild_Widget(parent, iClob(dlg)); 2318 addChild_Widget(parent, iClob(dlg));
2317 arrange_Widget(dlg); 2319 arrange_Widget(dlg);