Source/WebCore: AXDescription for HTML5 footer
[WebKit-https.git] / Source / WebCore / platform / gtk / LocalizedStringsGtk.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
4  * Copyright (C) 2007 Holger Hans Peter Freyther
5  * Copyright (C) 2008 Christian Dywan <christian@imendio.com>
6  * Copyright (C) 2008 Nuanti Ltd.
7  * Copyright (C) 2010 Igalia S.L
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32
33 #include "LocalizedStrings.h"
34 #include "GOwnPtr.h"
35 #include "IntSize.h"
36 #include "NotImplemented.h"
37 #include "PlatformString.h"
38 #include <wtf/text/CString.h>
39
40 #include <glib/gi18n-lib.h>
41 #include <gtk/gtk.h>
42 #include <math.h>
43
44 namespace WebCore {
45
46 static const char* gtkStockLabel(const char* stockID)
47 {
48     GtkStockItem item;
49     if (!gtk_stock_lookup(stockID, &item))
50         return stockID;
51     return item.label;
52 }
53
54 String submitButtonDefaultLabel()
55 {
56     return String::fromUTF8(_("Submit"));
57 }
58
59 String inputElementAltText()
60 {
61     return String::fromUTF8(_("Submit"));
62 }
63
64 String resetButtonDefaultLabel()
65 {
66     return String::fromUTF8(_("Reset"));
67 }
68
69 String defaultDetailsSummaryText()
70 {
71     return String::fromUTF8(_("Details"));
72 }
73
74 String searchableIndexIntroduction()
75 {
76     return String::fromUTF8(_("This is a searchable index. Enter search keywords: "));
77 }
78
79 String fileButtonChooseFileLabel()
80 {
81     return String::fromUTF8(_("Choose File"));
82 }
83
84 String fileButtonChooseMultipleFilesLabel()
85 {
86     return String::fromUTF8(_("Choose Files"));
87 }
88
89 String fileButtonNoFileSelectedLabel()
90 {
91     return String::fromUTF8(_("(None)"));
92 }
93
94 String fileButtonNoFilesSelectedLabel()
95 {
96     return String::fromUTF8(_("(None)"));
97 }
98
99 String contextMenuItemTagOpenLinkInNewWindow()
100 {
101     return String::fromUTF8(_("Open Link in New _Window"));
102 }
103
104 String contextMenuItemTagDownloadLinkToDisk()
105 {
106     return String::fromUTF8(_("_Download Linked File"));
107 }
108
109 String contextMenuItemTagCopyLinkToClipboard()
110 {
111     return String::fromUTF8(_("Copy Link Loc_ation"));
112 }
113
114 String contextMenuItemTagOpenImageInNewWindow()
115 {
116     return String::fromUTF8(_("Open _Image in New Window"));
117 }
118
119 String contextMenuItemTagDownloadImageToDisk()
120 {
121     return String::fromUTF8(_("Sa_ve Image As"));
122 }
123
124 String contextMenuItemTagCopyImageToClipboard()
125 {
126     return String::fromUTF8(_("Cop_y Image"));
127 }
128
129 String contextMenuItemTagCopyImageUrlToClipboard()
130 {
131     return String::fromUTF8(_("Copy Image _Address"));
132 }
133
134 String contextMenuItemTagOpenVideoInNewWindow()
135 {
136     return String::fromUTF8(_("Open _Video in New Window"));
137 }
138
139 String contextMenuItemTagOpenAudioInNewWindow()
140 {
141     return String::fromUTF8(_("Open _Audio in New Window"));
142 }
143
144 String contextMenuItemTagCopyVideoLinkToClipboard()
145 {
146     return String::fromUTF8(_("Cop_y Video Link Location"));
147 }
148
149 String contextMenuItemTagCopyAudioLinkToClipboard()
150 {
151     return String::fromUTF8(_("Cop_y Audio Link Location"));
152 }
153
154 String contextMenuItemTagToggleMediaControls()
155 {
156     return String::fromUTF8(_("_Toggle Media Controls"));
157 }
158
159 String contextMenuItemTagToggleMediaLoop()
160 {
161     return String::fromUTF8(_("Toggle Media _Loop Playback"));
162 }
163
164 String contextMenuItemTagEnterVideoFullscreen()
165 {
166     return String::fromUTF8(_("Switch Video to _Fullscreen"));
167 }
168
169 String contextMenuItemTagMediaPlay()
170 {
171     return String::fromUTF8(_("_Play"));
172 }
173
174 String contextMenuItemTagMediaPause()
175 {
176     return String::fromUTF8(_("_Pause"));
177 }
178
179 String contextMenuItemTagMediaMute()
180 {
181     return String::fromUTF8(_("_Mute"));
182 }
183
184 String contextMenuItemTagOpenFrameInNewWindow()
185 {
186     return String::fromUTF8(_("Open _Frame in New Window"));
187 }
188
189 String contextMenuItemTagCopy()
190 {
191     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_COPY));
192     return stockLabel;
193 }
194
195 String contextMenuItemTagDelete()
196 {
197     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_DELETE));
198     return stockLabel;
199 }
200
201 String contextMenuItemTagSelectAll()
202 {
203     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_SELECT_ALL));
204     return stockLabel;
205 }
206
207 String contextMenuItemTagUnicode()
208 {
209     return String::fromUTF8(_("_Insert Unicode Control Character"));
210 }
211
212 String contextMenuItemTagInputMethods()
213 {
214     return String::fromUTF8(_("Input _Methods"));
215 }
216
217 String contextMenuItemTagGoBack()
218 {
219     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_GO_BACK));
220     return stockLabel;
221 }
222
223 String contextMenuItemTagGoForward()
224 {
225     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_GO_FORWARD));
226     return stockLabel;
227 }
228
229 String contextMenuItemTagStop()
230 {
231     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_STOP));
232     return stockLabel;
233 }
234
235 String contextMenuItemTagReload()
236 {
237     return String::fromUTF8(_("_Reload"));
238 }
239
240 String contextMenuItemTagCut()
241 {
242     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_CUT));
243     return stockLabel;
244 }
245
246 String contextMenuItemTagPaste()
247 {
248     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_PASTE));
249     return stockLabel;
250 }
251
252 String contextMenuItemTagNoGuessesFound()
253 {
254     return String::fromUTF8(_("No Guesses Found"));
255 }
256
257 String contextMenuItemTagIgnoreSpelling()
258 {
259     return String::fromUTF8(_("_Ignore Spelling"));
260 }
261
262 String contextMenuItemTagLearnSpelling()
263 {
264     return String::fromUTF8(_("_Learn Spelling"));
265 }
266
267 String contextMenuItemTagSearchWeb()
268 {
269     return String::fromUTF8(_("_Search the Web"));
270 }
271
272 String contextMenuItemTagLookUpInDictionary(const String&)
273 {
274     return String::fromUTF8(_("_Look Up in Dictionary"));
275 }
276
277 String contextMenuItemTagOpenLink()
278 {
279     return String::fromUTF8(_("_Open Link"));
280 }
281
282 String contextMenuItemTagIgnoreGrammar()
283 {
284     return String::fromUTF8(_("Ignore _Grammar"));
285 }
286
287 String contextMenuItemTagSpellingMenu()
288 {
289     return String::fromUTF8(_("Spelling and _Grammar"));
290 }
291
292 String contextMenuItemTagShowSpellingPanel(bool show)
293 {
294     return String::fromUTF8(show ? _("_Show Spelling and Grammar") : _("_Hide Spelling and Grammar"));
295 }
296
297 String contextMenuItemTagCheckSpelling()
298 {
299     return String::fromUTF8(_("_Check Document Now"));
300 }
301
302 String contextMenuItemTagCheckSpellingWhileTyping()
303 {
304     return String::fromUTF8(_("Check Spelling While _Typing"));
305 }
306
307 String contextMenuItemTagCheckGrammarWithSpelling()
308 {
309     return String::fromUTF8(_("Check _Grammar With Spelling"));
310 }
311
312 String contextMenuItemTagFontMenu()
313 {
314     return String::fromUTF8(_("_Font"));
315 }
316
317 String contextMenuItemTagBold()
318 {
319     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_BOLD));
320     return stockLabel;
321 }
322
323 String contextMenuItemTagItalic()
324 {
325     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_ITALIC));
326     return stockLabel;
327 }
328
329 String contextMenuItemTagUnderline()
330 {
331     static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_UNDERLINE));
332     return stockLabel;
333 }
334
335 String contextMenuItemTagOutline()
336 {
337     return String::fromUTF8(_("_Outline"));
338 }
339
340 String contextMenuItemTagInspectElement()
341 {
342     return String::fromUTF8(_("Inspect _Element"));
343 }
344
345 String searchMenuNoRecentSearchesText()
346 {
347     return String::fromUTF8(_("No recent searches"));
348 }
349
350 String searchMenuRecentSearchesText()
351 {
352     return String::fromUTF8(_("Recent searches"));
353 }
354
355 String searchMenuClearRecentSearchesText()
356 {
357     return String::fromUTF8(_("_Clear recent searches"));
358 }
359
360 String AXDefinitionListTermText()
361 {
362     return String::fromUTF8(_("term"));
363 }
364
365 String AXDefinitionListDefinitionText()
366 {
367     return String::fromUTF8(_("definition"));
368 }
369
370 String AXFooterRoleDescriptionText()
371 {
372     return String::fromUTF8(_("footer"));
373 }
374
375 String AXButtonActionVerb()
376 {
377     return String::fromUTF8(_("press"));
378 }
379
380 String AXRadioButtonActionVerb()
381 {
382     return String::fromUTF8(_("select"));
383 }
384
385 String AXTextFieldActionVerb()
386 {
387     return String::fromUTF8(_("activate"));
388 }
389
390 String AXCheckedCheckBoxActionVerb()
391 {
392     return String::fromUTF8(_("uncheck"));
393 }
394
395 String AXUncheckedCheckBoxActionVerb()
396 {
397     return String::fromUTF8(_("check"));
398 }
399
400 String AXLinkActionVerb()
401 {
402     return String::fromUTF8(_("jump"));
403 }
404
405 String AXMenuListPopupActionVerb()
406 {
407     return String();
408 }
409
410 String AXMenuListActionVerb()
411 {
412     return String();
413 }
414     
415 String missingPluginText()
416 {
417     return String::fromUTF8(_("Missing Plug-in"));
418 }
419
420 String crashedPluginText()
421 {
422     notImplemented();
423     return String::fromUTF8(_("Plug-in Failure"));
424 }
425
426 String multipleFileUploadText(unsigned numberOfFiles)
427 {
428     // FIXME: If this file gets localized, this should really be localized as one string with a wildcard for the number.
429     return String::number(numberOfFiles) + String::fromUTF8(_(" files"));
430 }
431
432 String unknownFileSizeText()
433 {
434     return String::fromUTF8(_("Unknown"));
435 }
436
437 String imageTitle(const String& filename, const IntSize& size)
438 {
439     GOwnPtr<gchar> string(g_strdup_printf(C_("Title string for images", "%s  (%dx%d pixels)"),
440                                           filename.utf8().data(),
441                                           size.width(), size.height()));
442
443     return String::fromUTF8(string.get());
444 }
445
446
447 #if ENABLE(VIDEO)
448
449 String mediaElementLoadingStateText()
450 {
451     return String::fromUTF8(_("Loading..."));
452 }
453
454 String mediaElementLiveBroadcastStateText()
455 {
456     return String::fromUTF8(_("Live Broadcast"));
457 }
458
459 String localizedMediaControlElementString(const String& name)
460 {
461     if (name == "AudioElement")
462         return String::fromUTF8(_("audio element controller"));
463     if (name == "VideoElement")
464         return String::fromUTF8(_("video element controller"));
465     if (name == "MuteButton")
466         return String::fromUTF8(_("mute"));
467     if (name == "UnMuteButton")
468         return String::fromUTF8(_("unmute"));
469     if (name == "PlayButton")
470         return String::fromUTF8(_("play"));
471     if (name == "PauseButton")
472         return String::fromUTF8(_("pause"));
473     if (name == "Slider")
474         return String::fromUTF8(_("movie time"));
475     if (name == "SliderThumb")
476         return String::fromUTF8(_("timeline slider thumb"));
477     if (name == "RewindButton")
478         return String::fromUTF8(_("back 30 seconds"));
479     if (name == "ReturnToRealtimeButton")
480         return String::fromUTF8(_("return to realtime"));
481     if (name == "CurrentTimeDisplay")
482         return String::fromUTF8(_("elapsed time"));
483     if (name == "TimeRemainingDisplay")
484         return String::fromUTF8(_("remaining time"));
485     if (name == "StatusDisplay")
486         return String::fromUTF8(_("status"));
487     if (name == "FullscreenButton")
488         return String::fromUTF8(_("fullscreen"));
489     if (name == "SeekForwardButton")
490         return String::fromUTF8(_("fast forward"));
491     if (name == "SeekBackButton")
492         return String::fromUTF8(_("fast reverse"));
493     if (name == "ShowClosedCaptionsButton")
494         return String::fromUTF8(_("show closed captions"));
495     if (name == "HideClosedCaptionsButton")
496         return String::fromUTF8(_("hide closed captions"));
497
498     ASSERT_NOT_REACHED();
499     return String();
500 }
501
502 String localizedMediaControlElementHelpText(const String& name)
503 {
504     if (name == "AudioElement")
505         return String::fromUTF8(_("audio element playback controls and status display"));
506     if (name == "VideoElement")
507         return String::fromUTF8(_("video element playback controls and status display"));
508     if (name == "MuteButton")
509         return String::fromUTF8(_("mute audio tracks"));
510     if (name == "UnMuteButton")
511         return String::fromUTF8(_("unmute audio tracks"));
512     if (name == "PlayButton")
513         return String::fromUTF8(_("begin playback"));
514     if (name == "PauseButton")
515         return String::fromUTF8(_("pause playback"));
516     if (name == "Slider")
517         return String::fromUTF8(_("movie time scrubber"));
518     if (name == "SliderThumb")
519         return String::fromUTF8(_("movie time scrubber thumb"));
520     if (name == "RewindButton")
521         return String::fromUTF8(_("seek movie back 30 seconds"));
522     if (name == "ReturnToRealtimeButton")
523         return String::fromUTF8(_("return streaming movie to real time"));
524     if (name == "CurrentTimeDisplay")
525         return String::fromUTF8(_("current movie time in seconds"));
526     if (name == "TimeRemainingDisplay")
527         return String::fromUTF8(_("number of seconds of movie remaining"));
528     if (name == "StatusDisplay")
529         return String::fromUTF8(_("current movie status"));
530     if (name == "SeekBackButton")
531         return String::fromUTF8(_("seek quickly back"));
532     if (name == "SeekForwardButton")
533         return String::fromUTF8(_("seek quickly forward"));
534     if (name == "FullscreenButton")
535         return String::fromUTF8(_("Play movie in fullscreen mode"));
536     if (name == "ShowClosedCaptionsButton")
537         return String::fromUTF8(_("start displaying closed captions"));
538     if (name == "HideClosedCaptionsButton")
539         return String::fromUTF8(_("stop displaying closed captions"));
540
541     ASSERT_NOT_REACHED();
542     return String();
543 }
544
545 String localizedMediaTimeDescription(float time)
546 {
547     if (!isfinite(time))
548         return String::fromUTF8(_("indefinite time"));
549
550     int seconds = (int)fabsf(time);
551     int days = seconds / (60 * 60 * 24);
552     int hours = seconds / (60 * 60);
553     int minutes = (seconds / 60) % 60;
554     seconds %= 60;
555
556     if (days) {
557         GOwnPtr<gchar> string(g_strdup_printf("%d days %d hours %d minutes %d seconds", days, hours, minutes, seconds));
558         return String::fromUTF8(string.get());
559     }
560
561     if (hours) {
562         GOwnPtr<gchar> string(g_strdup_printf("%d hours %d minutes %d seconds", hours, minutes, seconds));
563         return String::fromUTF8(string.get());
564     }
565
566     if (minutes) {
567         GOwnPtr<gchar> string(g_strdup_printf("%d minutes %d seconds", minutes, seconds));
568         return String::fromUTF8(string.get());
569     }
570
571     GOwnPtr<gchar> string(g_strdup_printf("%d seconds", seconds));
572     return String::fromUTF8(string.get());
573 }
574 #endif  // ENABLE(VIDEO)
575
576 String validationMessageValueMissingText()
577 {
578     return String::fromUTF8(_("value missing"));
579 }
580
581 String validationMessageValueMissingForCheckboxText()
582 {
583     notImplemented();
584     return validationMessageValueMissingText();
585 }
586
587 String validationMessageValueMissingForFileText()
588 {
589     notImplemented();
590     return validationMessageValueMissingText();
591 }
592
593 String validationMessageValueMissingForMultipleFileText()
594 {
595     notImplemented();
596     return validationMessageValueMissingText();
597 }
598
599 String validationMessageValueMissingForRadioText()
600 {
601     notImplemented();
602     return validationMessageValueMissingText();
603 }
604
605 String validationMessageValueMissingForSelectText()
606 {
607     notImplemented();
608     return validationMessageValueMissingText();
609 }
610
611 String validationMessageTypeMismatchText()
612 {
613     notImplemented();
614     return String::fromUTF8(_("type mismatch"));
615 }
616
617 String validationMessageTypeMismatchForEmailText()
618 {
619     notImplemented();
620     return validationMessageTypeMismatchText();
621 }
622
623 String validationMessageTypeMismatchForMultipleEmailText()
624 {
625     notImplemented();
626     return validationMessageTypeMismatchText();
627 }
628
629 String validationMessageTypeMismatchForURLText()
630 {
631     notImplemented();
632     return validationMessageTypeMismatchText();
633 }
634
635 String validationMessagePatternMismatchText()
636 {
637     return String::fromUTF8(_("pattern mismatch"));
638 }
639
640 String validationMessageTooLongText(int, int)
641 {
642     return String::fromUTF8(_("too long"));
643 }
644
645 String validationMessageRangeUnderflowText(const String&)
646 {
647     return String::fromUTF8(_("range underflow"));
648 }
649
650 String validationMessageRangeOverflowText(const String&)
651 {
652     return String::fromUTF8(_("range overflow"));
653 }
654
655 String validationMessageStepMismatchText(const String&, const String&)
656 {
657     return String::fromUTF8(_("step mismatch"));
658 }
659
660 String localizedString(const char* key)
661 {
662     return String::fromUTF8(key, strlen(key));
663 }
664
665 }