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