Name all the GLib timeout sources
[WebKit-https.git] / Source / WebCore / platform / LocalizedStrings.cpp
1 /*
2  * Copyright (C) 2003, 2006, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Igalia S.L
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #include "config.h"
28 #include "LocalizedStrings.h"
29
30 #include "IntSize.h"
31 #include "NotImplemented.h"
32 #include "TextBreakIterator.h"
33 #include <wtf/MathExtras.h>
34 #include <wtf/unicode/CharacterNames.h>
35
36 #if USE(CF)
37 #include <wtf/RetainPtr.h>
38 #endif
39
40 #if PLATFORM(MAC)
41 #include "WebCoreSystemInterface.h"
42 #endif
43
44 namespace WebCore {
45
46 // We can't use String::format for two reasons:
47 //  1) It doesn't handle non-ASCII characters in the format string.
48 //  2) It doesn't handle the %2$d syntax.
49 // Note that because |format| is used as the second parameter to va_start, it cannot be a reference
50 // type according to section 18.7/3 of the C++ N1905 standard.
51 static String formatLocalizedString(String format, ...)
52 {
53 #if USE(CF)
54     va_list arguments;
55     va_start(arguments, format);
56
57 #if COMPILER(CLANG)
58 #pragma clang diagnostic push
59 #pragma clang diagnostic ignored "-Wformat-nonliteral"
60 #endif
61     RetainPtr<CFStringRef> result = adoptCF(CFStringCreateWithFormatAndArguments(0, 0, format.createCFString().get(), arguments));
62 #if COMPILER(CLANG)
63 #pragma clang diagnostic pop
64 #endif
65
66     va_end(arguments);
67     return result.get();
68 #else
69     notImplemented();
70     return format;
71 #endif
72 }
73
74 static String truncatedStringForLookupMenuItem(const String& original)
75 {
76     if (original.isEmpty())
77         return original;
78
79     // Truncate the string if it's too long. This is in consistency with AppKit.
80     unsigned maxNumberOfGraphemeClustersInLookupMenuItem = 24;
81     DEFINE_STATIC_LOCAL(String, ellipsis, (&horizontalEllipsis, 1));
82
83     String trimmed = original.stripWhiteSpace();
84     unsigned numberOfCharacters = numCharactersInGraphemeClusters(trimmed, maxNumberOfGraphemeClustersInLookupMenuItem);
85     return numberOfCharacters == trimmed.length() ? trimmed : trimmed.left(numberOfCharacters) + ellipsis;
86 }
87
88 String inputElementAltText()
89 {
90     return WEB_UI_STRING_KEY("Submit", "Submit (input element)", "alt text for <input> elements with no alt, title, or value");
91 }
92
93 String resetButtonDefaultLabel()
94 {
95     return WEB_UI_STRING("Reset", "default label for Reset buttons in forms on web pages");
96 }
97
98 String searchableIndexIntroduction()
99 {
100     return WEB_UI_STRING("This is a searchable index. Enter search keywords: ",
101                          "text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'");
102 }
103
104 String submitButtonDefaultLabel()
105 {
106     return WEB_UI_STRING("Submit", "default label for Submit buttons in forms on web pages");
107 }
108
109 String fileButtonChooseFileLabel()
110 {
111     return WEB_UI_STRING("Choose File", "title for a single file chooser button used in HTML forms");
112 }
113
114 String fileButtonChooseMultipleFilesLabel()
115 {
116     return WEB_UI_STRING("Choose Files", "title for a multiple file chooser button used in HTML forms. This title should be as short as possible.");
117 }
118
119 String fileButtonNoFileSelectedLabel()
120 {
121     return WEB_UI_STRING("no file selected", "text to display in file button used in HTML forms when no file is selected");
122 }
123
124 String fileButtonNoFilesSelectedLabel()
125 {
126     return WEB_UI_STRING("no files selected", "text to display in file button used in HTML forms when no files are selected and the button allows multiple files to be selected");
127 }
128
129 String defaultDetailsSummaryText()
130 {
131     return WEB_UI_STRING("Details", "text to display in <details> tag when it has no <summary> child");
132 }
133
134 #if PLATFORM(MAC)
135 String copyImageUnknownFileLabel()
136 {
137     return WEB_UI_STRING("unknown", "Unknown filename");
138 }
139 #endif
140
141 #if ENABLE(CONTEXT_MENUS)
142 String contextMenuItemTagOpenLinkInNewWindow()
143 {
144     return WEB_UI_STRING("Open Link in New Window", "Open in New Window context menu item");
145 }
146
147 String contextMenuItemTagDownloadLinkToDisk()
148 {
149     return WEB_UI_STRING("Download Linked File", "Download Linked File context menu item");
150 }
151
152 String contextMenuItemTagCopyLinkToClipboard()
153 {
154     return WEB_UI_STRING("Copy Link", "Copy Link context menu item");
155 }
156
157 String contextMenuItemTagOpenImageInNewWindow()
158 {
159     return WEB_UI_STRING("Open Image in New Window", "Open Image in New Window context menu item");
160 }
161
162 String contextMenuItemTagDownloadImageToDisk()
163 {
164     return WEB_UI_STRING("Download Image", "Download Image context menu item");
165 }
166
167 String contextMenuItemTagCopyImageToClipboard()
168 {
169     return WEB_UI_STRING("Copy Image", "Copy Image context menu item");
170 }
171
172 String contextMenuItemTagOpenFrameInNewWindow()
173 {
174     return WEB_UI_STRING("Open Frame in New Window", "Open Frame in New Window context menu item");
175 }
176
177 String contextMenuItemTagCopy()
178 {
179     return WEB_UI_STRING("Copy", "Copy context menu item");
180 }
181
182 String contextMenuItemTagGoBack()
183 {
184     return WEB_UI_STRING("Back", "Back context menu item");
185 }
186
187 String contextMenuItemTagGoForward()
188 {
189     return WEB_UI_STRING("Forward", "Forward context menu item");
190 }
191
192 String contextMenuItemTagStop()
193 {
194     return WEB_UI_STRING("Stop", "Stop context menu item");
195 }
196
197 String contextMenuItemTagReload()
198 {
199     return WEB_UI_STRING("Reload", "Reload context menu item");
200 }
201
202 String contextMenuItemTagCut()
203 {
204     return WEB_UI_STRING("Cut", "Cut context menu item");
205 }
206
207 String contextMenuItemTagPaste()
208 {
209     return WEB_UI_STRING("Paste", "Paste context menu item");
210 }
211
212 String contextMenuItemTagNoGuessesFound()
213 {
214     return WEB_UI_STRING("No Guesses Found", "No Guesses Found context menu item");
215 }
216
217 String contextMenuItemTagIgnoreSpelling()
218 {
219     return WEB_UI_STRING("Ignore Spelling", "Ignore Spelling context menu item");
220 }
221
222 String contextMenuItemTagLearnSpelling()
223 {
224     return WEB_UI_STRING("Learn Spelling", "Learn Spelling context menu item");
225 }
226
227 #if PLATFORM(MAC)
228 String contextMenuItemTagSearchInSpotlight()
229 {
230     return WEB_UI_STRING("Search in Spotlight", "Search in Spotlight context menu item");
231 }
232 #endif
233
234 String contextMenuItemTagSearchWeb()
235 {
236 #if PLATFORM(MAC)
237     RetainPtr<CFStringRef> searchProviderName = adoptCF(wkCopyDefaultSearchProviderDisplayName());
238     return formatLocalizedString(WEB_UI_STRING("Search with %@", "Search with search provider context menu item with provider name inserted"), searchProviderName.get());
239 #else
240     return WEB_UI_STRING("Search with Google", "Search with Google context menu item");
241 #endif
242 }
243
244 String contextMenuItemTagLookUpInDictionary(const String& selectedString)
245 {
246 #if USE(CF)
247     RetainPtr<CFStringRef> selectedCFString = truncatedStringForLookupMenuItem(selectedString).createCFString();
248     return formatLocalizedString(WEB_UI_STRING("Look Up “%@”", "Look Up context menu item with selected word"), selectedCFString.get());
249 #else
250     return WEB_UI_STRING("Look Up “<selection>”", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));
251 #endif
252 }
253
254 String contextMenuItemTagOpenLink()
255 {
256     return WEB_UI_STRING("Open Link", "Open Link context menu item");
257 }
258
259 String contextMenuItemTagIgnoreGrammar()
260 {
261     return WEB_UI_STRING("Ignore Grammar", "Ignore Grammar context menu item");
262 }
263
264 String contextMenuItemTagSpellingMenu()
265 {
266     return WEB_UI_STRING("Spelling and Grammar", "Spelling and Grammar context sub-menu item");
267 }
268
269 String contextMenuItemTagShowSpellingPanel(bool show)
270 {
271     if (show)
272         return WEB_UI_STRING("Show Spelling and Grammar", "menu item title");
273     return WEB_UI_STRING("Hide Spelling and Grammar", "menu item title");
274 }
275
276 String contextMenuItemTagCheckSpelling()
277 {
278     return WEB_UI_STRING("Check Document Now", "Check spelling context menu item");
279 }
280
281 String contextMenuItemTagCheckSpellingWhileTyping()
282 {
283     return WEB_UI_STRING("Check Spelling While Typing", "Check spelling while typing context menu item");
284 }
285
286 String contextMenuItemTagCheckGrammarWithSpelling()
287 {
288     return WEB_UI_STRING("Check Grammar With Spelling", "Check grammar with spelling context menu item");
289 }
290
291 String contextMenuItemTagFontMenu()
292 {
293     return WEB_UI_STRING("Font", "Font context sub-menu item");
294 }
295
296 #if PLATFORM(MAC)
297 String contextMenuItemTagShowFonts()
298 {
299     return WEB_UI_STRING("Show Fonts", "Show fonts context menu item");
300 }
301 #endif
302
303 String contextMenuItemTagBold()
304 {
305     return WEB_UI_STRING("Bold", "Bold context menu item");
306 }
307
308 String contextMenuItemTagItalic()
309 {
310     return WEB_UI_STRING("Italic", "Italic context menu item");
311 }
312
313 String contextMenuItemTagUnderline()
314 {
315     return WEB_UI_STRING("Underline", "Underline context menu item");
316 }
317
318 String contextMenuItemTagOutline()
319 {
320     return WEB_UI_STRING("Outline", "Outline context menu item");
321 }
322
323 #if PLATFORM(MAC)
324 String contextMenuItemTagStyles()
325 {
326     return WEB_UI_STRING("Styles...", "Styles context menu item");
327 }
328
329 String contextMenuItemTagShowColors()
330 {
331     return WEB_UI_STRING("Show Colors", "Show colors context menu item");
332 }
333
334 String contextMenuItemTagSpeechMenu()
335 {
336     return WEB_UI_STRING("Speech", "Speech context sub-menu item");
337 }
338
339 String contextMenuItemTagStartSpeaking()
340 {
341     return WEB_UI_STRING("Start Speaking", "Start speaking context menu item");
342 }
343
344 String contextMenuItemTagStopSpeaking()
345 {
346     return WEB_UI_STRING("Stop Speaking", "Stop speaking context menu item");
347 }
348 #endif
349
350 String contextMenuItemTagWritingDirectionMenu()
351 {
352     return WEB_UI_STRING("Paragraph Direction", "Paragraph direction context sub-menu item");
353 }
354
355 String contextMenuItemTagTextDirectionMenu()
356 {
357     return WEB_UI_STRING("Selection Direction", "Selection direction context sub-menu item");
358 }
359
360 String contextMenuItemTagDefaultDirection()
361 {
362     return WEB_UI_STRING("Default", "Default writing direction context menu item");
363 }
364
365 String contextMenuItemTagLeftToRight()
366 {
367     return WEB_UI_STRING("Left to Right", "Left to Right context menu item");
368 }
369
370 String contextMenuItemTagRightToLeft()
371 {
372     return WEB_UI_STRING("Right to Left", "Right to Left context menu item");
373 }
374
375 #if PLATFORM(MAC)
376
377 String contextMenuItemTagCorrectSpellingAutomatically()
378 {
379     return WEB_UI_STRING("Correct Spelling Automatically", "Correct Spelling Automatically context menu item");
380 }
381
382 String contextMenuItemTagSubstitutionsMenu()
383 {
384     return WEB_UI_STRING("Substitutions", "Substitutions context sub-menu item");
385 }
386
387 String contextMenuItemTagShowSubstitutions(bool show)
388 {
389     if (show)
390         return WEB_UI_STRING("Show Substitutions", "menu item title");
391     return WEB_UI_STRING("Hide Substitutions", "menu item title");
392 }
393
394 String contextMenuItemTagSmartCopyPaste()
395 {
396     return WEB_UI_STRING("Smart Copy/Paste", "Smart Copy/Paste context menu item");
397 }
398
399 String contextMenuItemTagSmartQuotes()
400 {
401     return WEB_UI_STRING("Smart Quotes", "Smart Quotes context menu item");
402 }
403
404 String contextMenuItemTagSmartDashes()
405 {
406     return WEB_UI_STRING("Smart Dashes", "Smart Dashes context menu item");
407 }
408
409 String contextMenuItemTagSmartLinks()
410 {
411     return WEB_UI_STRING("Smart Links", "Smart Links context menu item");
412 }
413
414 String contextMenuItemTagTextReplacement()
415 {
416     return WEB_UI_STRING("Text Replacement", "Text Replacement context menu item");
417 }
418
419 String contextMenuItemTagTransformationsMenu()
420 {
421     return WEB_UI_STRING("Transformations", "Transformations context sub-menu item");
422 }
423
424 String contextMenuItemTagMakeUpperCase()
425 {
426     return WEB_UI_STRING("Make Upper Case", "Make Upper Case context menu item");
427 }
428
429 String contextMenuItemTagMakeLowerCase()
430 {
431     return WEB_UI_STRING("Make Lower Case", "Make Lower Case context menu item");
432 }
433
434 String contextMenuItemTagCapitalize()
435 {
436     return WEB_UI_STRING("Capitalize", "Capitalize context menu item");
437 }
438
439 String contextMenuItemTagChangeBack(const String& replacedString)
440 {
441     notImplemented();
442     return replacedString;
443 }
444
445 #endif // PLATFORM(MAC)
446
447 String contextMenuItemTagOpenVideoInNewWindow()
448 {
449     return WEB_UI_STRING("Open Video in New Window", "Open Video in New Window context menu item");
450 }
451
452 String contextMenuItemTagOpenAudioInNewWindow()
453 {
454     return WEB_UI_STRING("Open Audio in New Window", "Open Audio in New Window context menu item");
455 }
456
457 String contextMenuItemTagDownloadVideoToDisk()
458 {
459     return WEB_UI_STRING("Download Video", "Download Video To Disk context menu item");
460 }
461
462 String contextMenuItemTagDownloadAudioToDisk()
463 {
464     return WEB_UI_STRING("Download Audio", "Download Audio To Disk context menu item");
465 }
466
467 String contextMenuItemTagCopyVideoLinkToClipboard()
468 {
469     return WEB_UI_STRING("Copy Video Address", "Copy Video Address Location context menu item");
470 }
471
472 String contextMenuItemTagCopyAudioLinkToClipboard()
473 {
474     return WEB_UI_STRING("Copy Audio Address", "Copy Audio Address Location context menu item");
475 }
476
477 String contextMenuItemTagToggleMediaControls()
478 {
479     return WEB_UI_STRING("Controls", "Media Controls context menu item");
480 }
481
482 String contextMenuItemTagShowMediaControls()
483 {
484     return WEB_UI_STRING("Show Controls", "Show Media Controls context menu item");
485 }
486
487 String contextMenuItemTagHideMediaControls()
488 {
489     return WEB_UI_STRING("Hide Controls", "Hide Media Controls context menu item");
490 }
491
492 String contextMenuItemTagToggleMediaLoop()
493 {
494     return WEB_UI_STRING("Loop", "Media Loop context menu item");
495 }
496
497 String contextMenuItemTagEnterVideoFullscreen()
498 {
499     return WEB_UI_STRING("Enter Full Screen", "Video Enter Fullscreen context menu item");
500 }
501
502 String contextMenuItemTagExitVideoFullscreen()
503 {
504     return WEB_UI_STRING("Exit Full Screen", "Video Exit Fullscreen context menu item");
505 }
506
507 String contextMenuItemTagMediaPlay()
508 {
509     return WEB_UI_STRING("Play", "Media Play context menu item");
510 }
511
512 String contextMenuItemTagMediaPause()
513 {
514     return WEB_UI_STRING("Pause", "Media Pause context menu item");
515 }
516
517 String contextMenuItemTagMediaMute()
518 {
519     return WEB_UI_STRING("Mute", "Media Mute context menu item");
520 }
521     
522 String contextMenuItemTagInspectElement()
523 {
524     return WEB_UI_STRING("Inspect Element", "Inspect Element context menu item");
525 }
526
527 #endif // ENABLE(CONTEXT_MENUS)
528
529 #if !PLATFORM(IOS)
530 String searchMenuNoRecentSearchesText()
531 {
532     return WEB_UI_STRING("No recent searches", "Label for only item in menu that appears when clicking on the search field image, when no searches have been performed");
533 }
534
535 String searchMenuRecentSearchesText()
536 {
537     return WEB_UI_STRING("Recent Searches", "label for first item in the menu that appears when clicking on the search field image, used as embedded menu title");
538 }
539
540 String searchMenuClearRecentSearchesText()
541 {
542     return WEB_UI_STRING("Clear Recent Searches", "menu item in Recent Searches menu that empties menu's contents");
543 }
544
545 String AXWebAreaText()
546 {
547     return WEB_UI_STRING("HTML content", "accessibility role description for web area");
548 }
549
550 String AXLinkText()
551 {
552     return WEB_UI_STRING("link", "accessibility role description for link");
553 }
554
555 String AXListMarkerText()
556 {
557     return WEB_UI_STRING("list marker", "accessibility role description for list marker");
558 }
559
560 String AXImageMapText()
561 {
562     return WEB_UI_STRING("image map", "accessibility role description for image map");
563 }
564
565 String AXHeadingText()
566 {
567     return WEB_UI_STRING("heading", "accessibility role description for headings");
568 }
569
570 String AXDefinitionText()
571 {
572     return WEB_UI_STRING("definition", "role description of ARIA definition role");
573 }
574
575 String AXDescriptionListText()
576 {
577     return WEB_UI_STRING("description list", "accessibility role description of a description list");
578 }
579
580 String AXDescriptionListTermText()
581 {
582     return WEB_UI_STRING("term", "term word of a description list");
583 }
584
585 String AXDescriptionListDetailText()
586 {
587     return WEB_UI_STRING("description", "description detail");
588 }
589
590 String AXFooterRoleDescriptionText()
591 {
592     return WEB_UI_STRING("footer", "accessibility role description for a footer");
593 }
594
595 String AXFileUploadButtonText()
596 {
597     return WEB_UI_STRING("file upload button", "accessibility role description for a file upload button");
598 }
599
600 String AXSearchFieldCancelButtonText()
601 {
602     return WEB_UI_STRING("cancel", "accessibility description for a search field cancel button");
603 }
604
605 String AXButtonActionVerb()
606 {
607     return WEB_UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
608 }
609
610 String AXRadioButtonActionVerb()
611 {
612     return WEB_UI_STRING("select", "Verb stating the action that will occur when a radio button is clicked, as used by accessibility");
613 }
614
615 String AXTextFieldActionVerb()
616 {
617     return WEB_UI_STRING("activate", "Verb stating the action that will occur when a text field is selected, as used by accessibility");
618 }
619
620 String AXCheckedCheckBoxActionVerb()
621 {
622     return WEB_UI_STRING("uncheck", "Verb stating the action that will occur when a checked checkbox is clicked, as used by accessibility");
623 }
624
625 String AXUncheckedCheckBoxActionVerb()
626 {
627     return WEB_UI_STRING("check", "Verb stating the action that will occur when an unchecked checkbox is clicked, as used by accessibility");
628 }
629
630 String AXLinkActionVerb()
631 {
632     return WEB_UI_STRING("jump", "Verb stating the action that will occur when a link is clicked, as used by accessibility");
633 }
634
635 String AXMenuListPopupActionVerb()
636 {
637     notImplemented();
638     return "select";
639 }
640
641 String AXMenuListActionVerb()
642 {
643     notImplemented();
644     return "select";
645 }
646
647 String AXListItemActionVerb()
648 {
649     notImplemented();
650     return "select";
651 }
652 #endif // !PLATFORM(IOS)
653
654 #if PLATFORM(MAC) || PLATFORM(IOS)
655 String AXARIAContentGroupText(const String& ariaType)
656 {
657     if (ariaType == "ARIAApplicationAlert")
658         return WEB_UI_STRING("alert", "An ARIA accessibility group that acts as an alert.");
659     if (ariaType == "ARIAApplicationAlertDialog")
660         return WEB_UI_STRING("alert dialog", "An ARIA accessibility group that acts as an alert dialog.");
661     if (ariaType == "ARIAApplicationDialog")
662         return WEB_UI_STRING("dialog", "An ARIA accessibility group that acts as an dialog.");
663     if (ariaType == "ARIAApplicationLog")
664         return WEB_UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
665     if (ariaType == "ARIAApplicationMarquee")
666         return WEB_UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");
667     if (ariaType == "ARIAApplicationStatus")
668         return WEB_UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");
669     if (ariaType == "ARIAApplicationTimer")
670         return WEB_UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");
671     if (ariaType == "ARIADocument")
672         return WEB_UI_STRING("document", "An ARIA accessibility group that acts as a document.");
673     if (ariaType == "ARIADocumentArticle")
674         return WEB_UI_STRING("article", "An ARIA accessibility group that acts as an article.");
675     if (ariaType == "ARIADocumentNote")
676         return WEB_UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");
677     if (ariaType == "ARIADocumentRegion")
678         return WEB_UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");
679     if (ariaType == "ARIALandmarkApplication")
680         return WEB_UI_STRING("application", "An ARIA accessibility group that acts as an application.");
681     if (ariaType == "ARIALandmarkBanner")
682         return WEB_UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");
683     if (ariaType == "ARIALandmarkComplementary")
684         return WEB_UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");
685     if (ariaType == "ARIALandmarkContentInfo")
686         return WEB_UI_STRING("content information", "An ARIA accessibility group that contains content.");
687     if (ariaType == "ARIALandmarkMain")
688         return WEB_UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");
689     if (ariaType == "ARIALandmarkNavigation")
690         return WEB_UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");
691     if (ariaType == "ARIALandmarkSearch")
692         return WEB_UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");
693     if (ariaType == "ARIAUserInterfaceTooltip")
694         return WEB_UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");
695     if (ariaType == "ARIATabPanel")
696         return WEB_UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab.");
697     if (ariaType == "ARIADocumentMath")
698         return WEB_UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols.");
699     return String();
700 }
701 #endif // PLATFORM(MAC) || PLATFORM(IOS)
702
703 String missingPluginText()
704 {
705     return WEB_UI_STRING("Missing Plug-in", "Label text to be used when a plugin is missing");
706 }
707
708 String crashedPluginText()
709 {
710     return WEB_UI_STRING("Plug-in Failure", "Label text to be used if plugin host process has crashed");
711 }
712
713 String blockedPluginByContentSecurityPolicyText()
714 {
715     return WEB_UI_STRING_KEY("Blocked Plug-in", "Blocked Plug-In (Blocked by page's Content Security Policy)", "Label text to be used if plugin is blocked by a page's Content Security Policy");
716 }
717
718 String insecurePluginVersionText()
719 {
720     return WEB_UI_STRING_KEY("Blocked Plug-in", "Blocked Plug-In (Insecure plug-in)", "Label text to be used when an insecure plug-in version was blocked from loading");
721 }
722
723 String multipleFileUploadText(unsigned numberOfFiles)
724 {
725     return formatLocalizedString(WEB_UI_STRING("%d files", "Label to describe the number of files selected in a file upload control that allows multiple files"), numberOfFiles);
726 }
727
728 String unknownFileSizeText()
729 {
730     return WEB_UI_STRING_KEY("Unknown", "Unknown (filesize)", "Unknown filesize FTP directory listing item");
731 }
732
733 #if PLATFORM(WIN)
734 String uploadFileText()
735 {
736     notImplemented();
737     return "upload";
738 }
739
740 String allFilesText()
741 {
742     notImplemented();
743     return "all files";
744 }
745 #endif
746
747 #if PLATFORM(MAC)
748 String builtInPDFPluginName()
749 {
750     // Also exposed to DOM.
751     return WEB_UI_STRING("WebKit built-in PDF", "Pseudo plug-in name, visible in the Installed Plug-ins page in Safari.");
752 }
753
754 String pdfDocumentTypeDescription()
755 {
756     // Also exposed to DOM.
757     return WEB_UI_STRING("Portable Document Format", "Description of the primary type supported by the PDF pseudo plug-in. Visible in the Installed Plug-ins page in Safari.");
758 }
759
760 String postScriptDocumentTypeDescription()
761 {
762     // Also exposed to DOM.
763     return WEB_UI_STRING("PostScript", "Description of the PostScript type supported by the PDF pseudo plug-in. Visible in the Installed Plug-ins page in Safari.");
764 }
765
766 String keygenMenuItem512()
767 {
768     return WEB_UI_STRING("512 (Low Grade)", "Menu item title for KEYGEN pop-up menu");
769 }
770
771 String keygenMenuItem1024()
772 {
773     return WEB_UI_STRING("1024 (Medium Grade)", "Menu item title for KEYGEN pop-up menu");
774 }
775
776 String keygenMenuItem2048()
777 {
778     return WEB_UI_STRING("2048 (High Grade)", "Menu item title for KEYGEN pop-up menu");
779 }
780
781 String keygenKeychainItemName(const String& host)
782 {
783     return formatLocalizedString(WEB_UI_STRING("Key from %@", "Name of keychain key generated by the KEYGEN tag"), host.createCFString().get());
784 }
785
786 #endif
787
788 #if PLATFORM(IOS)
789 String htmlSelectMultipleItems(size_t count)
790 {
791     switch (count) {
792     case 0:
793         return WEB_UI_STRING("0 Items", "Present the element <select multiple> when no <option> items are selected (iOS only)");
794     case 1:
795         return WEB_UI_STRING("1 Item", "Present the element <select multiple> when a single <option> is selected (iOS only)");
796     default:
797         return formatLocalizedString(WEB_UI_STRING("%zu Items", "Present the number of selected <option> items in a <select multiple> element (iOS only)"), count);
798     }
799 }
800 #endif
801
802 String imageTitle(const String& filename, const IntSize& size)
803 {
804 #if USE(CF)
805     RetainPtr<CFLocaleRef> locale = adoptCF(CFLocaleCopyCurrent());
806     RetainPtr<CFNumberFormatterRef> formatter = adoptCF(CFNumberFormatterCreate(0, locale.get(), kCFNumberFormatterDecimalStyle));
807
808     int widthInt = size.width();
809     RetainPtr<CFNumberRef> width = adoptCF(CFNumberCreate(0, kCFNumberIntType, &widthInt));
810     RetainPtr<CFStringRef> widthString = adoptCF(CFNumberFormatterCreateStringWithNumber(0, formatter.get(), width.get()));
811
812     int heightInt = size.height();
813     RetainPtr<CFNumberRef> height = adoptCF(CFNumberCreate(0, kCFNumberIntType, &heightInt));
814     RetainPtr<CFStringRef> heightString = adoptCF(CFNumberFormatterCreateStringWithNumber(0, formatter.get(), height.get()));
815
816     return formatLocalizedString(WEB_UI_STRING("%@ %@×%@ pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename.createCFString().get(), widthString.get(), heightString.get());
817 #else
818     return formatLocalizedString(WEB_UI_STRING("<filename> %d×%d pixels", "window title for a standalone image (uses multiplication symbol, not x)"), size.width(), size.height()).replace("<filename>", filename);
819 #endif
820 }
821
822 String mediaElementLoadingStateText()
823 {
824     return WEB_UI_STRING("Loading...", "Media controller status message when the media is loading");
825 }
826
827 String mediaElementLiveBroadcastStateText()
828 {
829     return WEB_UI_STRING("Live Broadcast", "Media controller status message when watching a live broadcast");
830 }
831
832 String localizedMediaControlElementString(const String& name)
833 {
834     if (name == "AudioElement")
835         return WEB_UI_STRING("audio playback", "accessibility label for audio element controller");
836     if (name == "VideoElement")
837         return WEB_UI_STRING("video playback", "accessibility label for video element controller");
838     if (name == "MuteButton")
839         return WEB_UI_STRING("mute", "accessibility label for mute button");
840     if (name == "UnMuteButton")
841         return WEB_UI_STRING("unmute", "accessibility label for turn mute off button");
842     if (name == "PlayButton")
843         return WEB_UI_STRING("play", "accessibility label for play button");
844     if (name == "PauseButton")
845         return WEB_UI_STRING("pause", "accessibility label for pause button");
846     if (name == "Slider")
847         return WEB_UI_STRING("movie time", "accessibility label for timeline slider");
848     if (name == "SliderThumb")
849         return WEB_UI_STRING("timeline slider thumb", "accessibility label for timeline thumb");
850     if (name == "RewindButton")
851         return WEB_UI_STRING("back 30 seconds", "accessibility label for seek back 30 seconds button");
852     if (name == "ReturnToRealtimeButton")
853         return WEB_UI_STRING("return to realtime", "accessibility label for return to real time button");
854     if (name == "CurrentTimeDisplay")
855         return WEB_UI_STRING("elapsed time", "accessibility label for elapsed time display");
856     if (name == "TimeRemainingDisplay")
857         return WEB_UI_STRING("remaining time", "accessibility label for time remaining display");
858     if (name == "StatusDisplay")
859         return WEB_UI_STRING("status", "accessibility label for movie status");
860     if (name == "EnterFullscreenButton")
861         return WEB_UI_STRING("enter fullscreen", "accessibility label for enter fullscreen button");
862     if (name == "ExitFullscreenButton")
863         return WEB_UI_STRING("exit fullscreen", "accessibility label for exit fullscreen button");
864     if (name == "SeekForwardButton")
865         return WEB_UI_STRING("fast forward", "accessibility label for fast forward button");
866     if (name == "SeekBackButton")
867         return WEB_UI_STRING("fast reverse", "accessibility label for fast reverse button");
868     if (name == "ShowClosedCaptionsButton")
869         return WEB_UI_STRING("show closed captions", "accessibility label for show closed captions button");
870     if (name == "HideClosedCaptionsButton")
871         return WEB_UI_STRING("hide closed captions", "accessibility label for hide closed captions button");
872
873     // FIXME: the ControlsPanel container should never be visible in the accessibility hierarchy.
874     if (name == "ControlsPanel")
875         return String();
876
877     ASSERT_NOT_REACHED();
878     return String();
879 }
880
881 String localizedMediaControlElementHelpText(const String& name)
882 {
883     if (name == "AudioElement")
884         return WEB_UI_STRING("audio element playback controls and status display", "accessibility help text for audio element controller");
885     if (name == "VideoElement")
886         return WEB_UI_STRING("video element playback controls and status display", "accessibility help text for video element controller");
887     if (name == "MuteButton")
888         return WEB_UI_STRING("mute audio tracks", "accessibility help text for mute button");
889     if (name == "UnMuteButton")
890         return WEB_UI_STRING("unmute audio tracks", "accessibility help text for un mute button");
891     if (name == "PlayButton")
892         return WEB_UI_STRING("begin playback", "accessibility help text for play button");
893     if (name == "PauseButton")
894         return WEB_UI_STRING("pause playback", "accessibility help text for pause button");
895     if (name == "Slider")
896         return WEB_UI_STRING("movie time scrubber", "accessibility help text for timeline slider");
897     if (name == "SliderThumb")
898         return WEB_UI_STRING("movie time scrubber thumb", "accessibility help text for timeline slider thumb");
899     if (name == "RewindButton")
900         return WEB_UI_STRING("seek movie back 30 seconds", "accessibility help text for jump back 30 seconds button");
901     if (name == "ReturnToRealtimeButton")
902         return WEB_UI_STRING("return streaming movie to real time", "accessibility help text for return streaming movie to real time button");
903     if (name == "CurrentTimeDisplay")
904         return WEB_UI_STRING("current movie time in seconds", "accessibility help text for elapsed time display");
905     if (name == "TimeRemainingDisplay")
906         return WEB_UI_STRING("number of seconds of movie remaining", "accessibility help text for remaining time display");
907     if (name == "StatusDisplay")
908         return WEB_UI_STRING("current movie status", "accessibility help text for movie status display");
909     if (name == "SeekBackButton")
910         return WEB_UI_STRING("seek quickly back", "accessibility help text for fast rewind button");
911     if (name == "SeekForwardButton")
912         return WEB_UI_STRING("seek quickly forward", "accessibility help text for fast forward button");
913     if (name == "FullscreenButton")
914         return WEB_UI_STRING("Play movie in fullscreen mode", "accessibility help text for enter fullscreen button");
915     if (name == "ShowClosedCaptionsButton")
916         return WEB_UI_STRING("start displaying closed captions", "accessibility help text for show closed captions button");
917     if (name == "HideClosedCaptionsButton")
918         return WEB_UI_STRING("stop displaying closed captions", "accessibility help text for hide closed captions button");
919
920     // The description of this button is descriptive enough that it doesn't require help text.
921     if (name == "EnterFullscreenButton")
922         return String();
923     
924     ASSERT_NOT_REACHED();
925     return String();
926 }
927
928 String localizedMediaTimeDescription(float time)
929 {
930     if (!std::isfinite(time))
931         return WEB_UI_STRING("indefinite time", "accessibility help text for an indefinite media controller time value");
932
933     int seconds = static_cast<int>(fabsf(time));
934     int days = seconds / (60 * 60 * 24);
935     int hours = seconds / (60 * 60);
936     int minutes = (seconds / 60) % 60;
937     seconds %= 60;
938
939     if (days)
940         return formatLocalizedString(WEB_UI_STRING("%1$d days %2$d hours %3$d minutes %4$d seconds", "accessibility help text for media controller time value >= 1 day"), days, hours, minutes, seconds);
941     if (hours)
942         return formatLocalizedString(WEB_UI_STRING("%1$d hours %2$d minutes %3$d seconds", "accessibility help text for media controller time value >= 60 minutes"), hours, minutes, seconds);
943     if (minutes)
944         return formatLocalizedString(WEB_UI_STRING("%1$d minutes %2$d seconds", "accessibility help text for media controller time value >= 60 seconds"), minutes, seconds);
945     return formatLocalizedString(WEB_UI_STRING("%1$d seconds", "accessibility help text for media controller time value < 60 seconds"), seconds);
946 }
947
948 String validationMessageValueMissingText()
949 {
950     return WEB_UI_STRING("value missing", "Validation message for required form control elements that have no value");
951 }
952
953 String validationMessageValueMissingForCheckboxText()
954 {
955     return validationMessageValueMissingText();
956 }
957
958 String validationMessageValueMissingForFileText()
959 {
960     return validationMessageValueMissingText();
961 }
962
963 String validationMessageValueMissingForMultipleFileText()
964 {
965     return validationMessageValueMissingText();
966 }
967
968 String validationMessageValueMissingForRadioText()
969 {
970     return validationMessageValueMissingText();
971 }
972
973 String validationMessageValueMissingForSelectText()
974 {
975     return validationMessageValueMissingText();
976 }
977
978 String validationMessageTypeMismatchText()
979 {
980     return WEB_UI_STRING("type mismatch", "Validation message for input form controls with a value not matching type");
981 }
982
983 String validationMessageTypeMismatchForEmailText()
984 {
985     return validationMessageTypeMismatchText();
986 }
987
988 String validationMessageTypeMismatchForMultipleEmailText()
989 {
990     return validationMessageTypeMismatchText();
991 }
992
993 String validationMessageTypeMismatchForURLText()
994 {
995     return validationMessageTypeMismatchText();
996 }
997
998 String validationMessagePatternMismatchText()
999 {
1000     return WEB_UI_STRING("pattern mismatch", "Validation message for input form controls requiring a constrained value according to pattern");
1001 }
1002
1003 String validationMessageTooLongText(int, int)
1004 {
1005     return WEB_UI_STRING("too long", "Validation message for form control elements with a value longer than maximum allowed length");
1006 }
1007
1008 String validationMessageRangeUnderflowText(const String&)
1009 {
1010     return WEB_UI_STRING("range underflow", "Validation message for input form controls with value lower than allowed minimum");
1011 }
1012
1013 String validationMessageRangeOverflowText(const String&)
1014 {
1015     return WEB_UI_STRING("range overflow", "Validation message for input form controls with value higher than allowed maximum");
1016 }
1017
1018 String validationMessageStepMismatchText(const String&, const String&)
1019 {
1020     return WEB_UI_STRING("step mismatch", "Validation message for input form controls with value not respecting the step attribute");
1021 }
1022
1023 String validationMessageBadInputForNumberText()
1024 {
1025     notImplemented();
1026     return validationMessageTypeMismatchText();
1027 }
1028
1029 String clickToExitFullScreenText()
1030 {
1031     return WEB_UI_STRING("Click to exit full screen mode", "Message to display in browser window when in webkit full screen mode.");
1032 }
1033
1034 #if ENABLE(VIDEO_TRACK)
1035 String textTrackSubtitlesText()
1036 {
1037     return WEB_UI_STRING("Subtitles", "Menu section heading for subtitles");
1038 }
1039
1040 String textTrackOffMenuItemText()
1041 {
1042     return WEB_UI_STRING("Off", "Menu item label for the track that represents disabling closed captions");
1043 }
1044
1045 String textTrackAutomaticMenuItemText()
1046 {
1047     return formatLocalizedString(WEB_UI_STRING("Auto (Recommended)", "Menu item label for automatic track selection behavior"));
1048 }
1049
1050 String textTrackNoLabelText()
1051 {
1052     return WEB_UI_STRING_KEY("Unknown", "Unknown (text track)", "Menu item label for a text track that has no other name");
1053 }
1054     
1055 #if PLATFORM(MAC) || PLATFORM(WIN)
1056 String textTrackCountryAndLanguageMenuItemText(const String& title, const String& country, const String& language)
1057 {
1058     return formatLocalizedString(WEB_UI_STRING("%@ (%@-%@)", "Text track display name format that includes the country and language of the subtitle, in the form of 'Title (Language-Country)'"), title.createCFString().get(), language.createCFString().get(), country.createCFString().get());
1059 }
1060
1061 String textTrackLanguageMenuItemText(const String& title, const String& language)
1062 {
1063     return formatLocalizedString(WEB_UI_STRING("%@ (%@)", "Text track display name format that includes the language of the subtitle, in the form of 'Title (Language)'"), title.createCFString().get(), language.createCFString().get());
1064 }
1065
1066 String closedCaptionTrackMenuItemText(const String& title)
1067 {
1068     return formatLocalizedString(WEB_UI_STRING("%@ CC", "Text track contains closed captions"), title.createCFString().get());
1069 }
1070
1071 String sdhTrackMenuItemText(const String& title)
1072 {
1073     return formatLocalizedString(WEB_UI_STRING("%@ SDH", "Text track contains subtitles for the deaf and hard of hearing"), title.createCFString().get());
1074 }
1075
1076 String easyReaderTrackMenuItemText(const String& title)
1077 {
1078     return formatLocalizedString(WEB_UI_STRING("%@ Easy Reader", "Text track contains simplified (3rd grade level) subtitles"), title.createCFString().get());
1079 }
1080 #endif
1081
1082 #endif
1083
1084 String snapshottedPlugInLabelTitle()
1085 {
1086     return WEB_UI_STRING("Snapshotted Plug-In", "Title of the label to show on a snapshotted plug-in");
1087 }
1088
1089 String snapshottedPlugInLabelSubtitle()
1090 {
1091     return WEB_UI_STRING("Click to restart", "Subtitle of the label to show on a snapshotted plug-in");
1092 }
1093
1094 } // namespace WebCore