6da35b2530bebe3c22efabe33e9247a9a472f933
[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 <wtf/MathExtras.h>
33 #include <wtf/NeverDestroyed.h>
34 #include <wtf/text/TextBreakIterator.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 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
511
512 String contextMenuItemTagEnterVideoEnhancedFullscreen()
513 {
514     return WEB_UI_STRING("Enter Picture in Picture", "menu item");
515 }
516
517 String contextMenuItemTagExitVideoEnhancedFullscreen()
518 {
519     return WEB_UI_STRING("Exit Picture in Picture", "menu item");
520 }
521
522 #endif
523
524 String contextMenuItemTagMediaPlay()
525 {
526     return WEB_UI_STRING("Play", "Media Play context menu item");
527 }
528
529 String contextMenuItemTagMediaPause()
530 {
531     return WEB_UI_STRING("Pause", "Media Pause context menu item");
532 }
533
534 String contextMenuItemTagMediaMute()
535 {
536     return WEB_UI_STRING("Mute", "Media Mute context menu item");
537 }
538     
539 String contextMenuItemTagInspectElement()
540 {
541     return WEB_UI_STRING("Inspect Element", "Inspect Element context menu item");
542 }
543
544 #endif // ENABLE(CONTEXT_MENUS)
545
546 #if !PLATFORM(IOS)
547 String searchMenuNoRecentSearchesText()
548 {
549     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");
550 }
551
552 String searchMenuRecentSearchesText()
553 {
554     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");
555 }
556
557 String searchMenuClearRecentSearchesText()
558 {
559     return WEB_UI_STRING("Clear Recent Searches", "menu item in Recent Searches menu that empties menu's contents");
560 }
561 #endif // !PLATFORM(IOS)
562
563 String AXWebAreaText()
564 {
565     return WEB_UI_STRING("HTML content", "accessibility role description for web area");
566 }
567
568 String AXLinkText()
569 {
570     return WEB_UI_STRING("link", "accessibility role description for link");
571 }
572
573 String AXListMarkerText()
574 {
575     return WEB_UI_STRING("list marker", "accessibility role description for list marker");
576 }
577
578 String AXImageMapText()
579 {
580     return WEB_UI_STRING("image map", "accessibility role description for image map");
581 }
582
583 String AXHeadingText()
584 {
585     return WEB_UI_STRING("heading", "accessibility role description for headings");
586 }
587
588 String AXDefinitionText()
589 {
590     return WEB_UI_STRING("definition", "role description of ARIA definition role");
591 }
592
593 String AXDescriptionListText()
594 {
595     return WEB_UI_STRING("description list", "accessibility role description of a description list");
596 }
597
598 String AXDescriptionListTermText()
599 {
600     return WEB_UI_STRING("term", "term word of a description list");
601 }
602
603 String AXDescriptionListDetailText()
604 {
605     return WEB_UI_STRING("description", "description detail");
606 }
607
608 String AXFooterRoleDescriptionText()
609 {
610     return WEB_UI_STRING("footer", "accessibility role description for a footer");
611 }
612
613 String AXFileUploadButtonText()
614 {
615     return WEB_UI_STRING("file upload button", "accessibility role description for a file upload button");
616 }
617
618 String AXAttachmentRoleText()
619 {
620     return WEB_UI_STRING("attachment", "accessibility role description for an attachment element");
621 }
622     
623 String AXSearchFieldCancelButtonText()
624 {
625     return WEB_UI_STRING("cancel", "accessibility description for a search field cancel button");
626 }
627
628 String AXButtonActionVerb()
629 {
630     return WEB_UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
631 }
632
633 String AXRadioButtonActionVerb()
634 {
635     return WEB_UI_STRING("select", "Verb stating the action that will occur when a radio button is clicked, as used by accessibility");
636 }
637
638 String AXTextFieldActionVerb()
639 {
640     return WEB_UI_STRING("activate", "Verb stating the action that will occur when a text field is selected, as used by accessibility");
641 }
642
643 String AXCheckedCheckBoxActionVerb()
644 {
645     return WEB_UI_STRING("uncheck", "Verb stating the action that will occur when a checked checkbox is clicked, as used by accessibility");
646 }
647
648 String AXUncheckedCheckBoxActionVerb()
649 {
650     return WEB_UI_STRING("check", "Verb stating the action that will occur when an unchecked checkbox is clicked, as used by accessibility");
651 }
652
653 String AXLinkActionVerb()
654 {
655     return WEB_UI_STRING("jump", "Verb stating the action that will occur when a link is clicked, as used by accessibility");
656 }
657
658 String AXMenuListPopupActionVerb()
659 {
660     notImplemented();
661     return "select";
662 }
663
664 String AXMenuListActionVerb()
665 {
666     notImplemented();
667     return "select";
668 }
669
670 String AXListItemActionVerb()
671 {
672     notImplemented();
673     return "select";
674 }
675
676 String AXAutoFillCredentialsLabel()
677 {
678     return WEB_UI_STRING("password auto fill", "Label for the auto fill credentials button inside a text field.");
679 }
680
681 String AXAutoFillContactsLabel()
682 {
683     return WEB_UI_STRING("contact info auto fill", "Label for the auto fill contacts button inside a text field.");
684 }
685     
686 #if PLATFORM(COCOA)
687 String AXARIAContentGroupText(const String& ariaType)
688 {
689     if (ariaType == "ARIAApplicationAlert")
690         return WEB_UI_STRING("alert", "An ARIA accessibility group that acts as an alert.");
691     if (ariaType == "ARIAApplicationAlertDialog")
692         return WEB_UI_STRING("web alert dialog", "An ARIA accessibility group that acts as an alert dialog.");
693     if (ariaType == "ARIAApplicationDialog")
694         return WEB_UI_STRING("web dialog", "An ARIA accessibility group that acts as an dialog.");
695     if (ariaType == "ARIAApplicationLog")
696         return WEB_UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
697     if (ariaType == "ARIAApplicationMarquee")
698         return WEB_UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");
699     if (ariaType == "ARIAApplicationStatus")
700         return WEB_UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");
701     if (ariaType == "ARIAApplicationTimer")
702         return WEB_UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");
703     if (ariaType == "ARIADocument")
704         return WEB_UI_STRING("document", "An ARIA accessibility group that acts as a document.");
705     if (ariaType == "ARIADocumentArticle")
706         return WEB_UI_STRING("article", "An ARIA accessibility group that acts as an article.");
707     if (ariaType == "ARIADocumentNote")
708         return WEB_UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");
709     if (ariaType == "ARIAWebApplication")
710         return WEB_UI_STRING("web application", "An ARIA accessibility group that acts as an application.");
711     if (ariaType == "ARIALandmarkBanner")
712         return WEB_UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");
713     if (ariaType == "ARIALandmarkComplementary")
714         return WEB_UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");
715     if (ariaType == "ARIALandmarkContentInfo")
716         return WEB_UI_STRING("content information", "An ARIA accessibility group that contains content.");
717     if (ariaType == "ARIALandmarkMain")
718         return WEB_UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");
719     if (ariaType == "ARIALandmarkNavigation")
720         return WEB_UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");
721     if (ariaType == "ARIALandmarkRegion")
722         return WEB_UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");
723     if (ariaType == "ARIALandmarkSearch")
724         return WEB_UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");
725     if (ariaType == "ARIAUserInterfaceTooltip")
726         return WEB_UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");
727     if (ariaType == "ARIATabPanel")
728         return WEB_UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab.");
729     if (ariaType == "ARIADocumentMath")
730         return WEB_UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols.");
731     return String();
732 }
733
734 String AXHorizontalRuleDescriptionText()
735 {
736     return WEB_UI_STRING("separator", "accessibility role description for a horizontal rule [<hr>]");
737 }
738     
739 #endif // PLATFORM(COCOA)
740
741 String missingPluginText()
742 {
743     return WEB_UI_STRING("Missing Plug-in", "Label text to be used when a plugin is missing");
744 }
745
746 String crashedPluginText()
747 {
748     return WEB_UI_STRING("Plug-in Failure", "Label text to be used if plugin host process has crashed");
749 }
750
751 String blockedPluginByContentSecurityPolicyText()
752 {
753     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");
754 }
755
756 String insecurePluginVersionText()
757 {
758     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");
759 }
760
761 String multipleFileUploadText(unsigned numberOfFiles)
762 {
763     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);
764 }
765
766 String unknownFileSizeText()
767 {
768     return WEB_UI_STRING_KEY("Unknown", "Unknown (filesize)", "Unknown filesize FTP directory listing item");
769 }
770
771 #if PLATFORM(WIN)
772 String uploadFileText()
773 {
774     notImplemented();
775     return "upload";
776 }
777
778 String allFilesText()
779 {
780     notImplemented();
781     return "all files";
782 }
783 #endif
784
785 #if PLATFORM(COCOA)
786 String builtInPDFPluginName()
787 {
788     // Also exposed to DOM.
789     return WEB_UI_STRING("WebKit built-in PDF", "Pseudo plug-in name, visible in the Installed Plug-ins page in Safari.");
790 }
791
792 String pdfDocumentTypeDescription()
793 {
794     // Also exposed to DOM.
795     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.");
796 }
797
798 String postScriptDocumentTypeDescription()
799 {
800     // Also exposed to DOM.
801     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.");
802 }
803
804 String keygenMenuItem512()
805 {
806     return WEB_UI_STRING("512 (Low Grade)", "Menu item title for KEYGEN pop-up menu");
807 }
808
809 String keygenMenuItem1024()
810 {
811     return WEB_UI_STRING("1024 (Medium Grade)", "Menu item title for KEYGEN pop-up menu");
812 }
813
814 String keygenMenuItem2048()
815 {
816     return WEB_UI_STRING("2048 (High Grade)", "Menu item title for KEYGEN pop-up menu");
817 }
818
819 String keygenKeychainItemName(const String& host)
820 {
821     return formatLocalizedString(WEB_UI_STRING("Key from %@", "Name of keychain key generated by the KEYGEN tag"), host.createCFString().get());
822 }
823
824 #endif
825
826 #if PLATFORM(IOS)
827 String htmlSelectMultipleItems(size_t count)
828 {
829     switch (count) {
830     case 0:
831         return WEB_UI_STRING("0 Items", "Present the element <select multiple> when no <option> items are selected (iOS only)");
832     case 1:
833         return WEB_UI_STRING("1 Item", "Present the element <select multiple> when a single <option> is selected (iOS only)");
834     default:
835         return formatLocalizedString(WEB_UI_STRING("%zu Items", "Present the number of selected <option> items in a <select multiple> element (iOS only)"), count);
836     }
837 }
838
839 String fileButtonChooseMediaFileLabel()
840 {
841     return WEB_UI_STRING("Choose Media (Single)", "Title for file button used in HTML forms for media files");
842 }
843
844 String fileButtonChooseMultipleMediaFilesLabel()
845 {
846     return WEB_UI_STRING("Choose Media (Multiple)", "Title for file button used in HTML5 forms for multiple media files");
847 }
848
849 String fileButtonNoMediaFileSelectedLabel()
850 {
851     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");
852 }
853
854 String fileButtonNoMediaFilesSelectedLabel()
855 {
856     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");
857 }
858 #endif
859
860 String imageTitle(const String& filename, const IntSize& size)
861 {
862 #if USE(CF)
863     RetainPtr<CFLocaleRef> locale = adoptCF(CFLocaleCopyCurrent());
864     RetainPtr<CFNumberFormatterRef> formatter = adoptCF(CFNumberFormatterCreate(0, locale.get(), kCFNumberFormatterDecimalStyle));
865
866     int widthInt = size.width();
867     RetainPtr<CFNumberRef> width = adoptCF(CFNumberCreate(0, kCFNumberIntType, &widthInt));
868     RetainPtr<CFStringRef> widthString = adoptCF(CFNumberFormatterCreateStringWithNumber(0, formatter.get(), width.get()));
869
870     int heightInt = size.height();
871     RetainPtr<CFNumberRef> height = adoptCF(CFNumberCreate(0, kCFNumberIntType, &heightInt));
872     RetainPtr<CFStringRef> heightString = adoptCF(CFNumberFormatterCreateStringWithNumber(0, formatter.get(), height.get()));
873
874     return formatLocalizedString(WEB_UI_STRING("%@ %@×%@ pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename.createCFString().get(), widthString.get(), heightString.get());
875 #else
876     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);
877 #endif
878 }
879
880 String mediaElementLoadingStateText()
881 {
882     return WEB_UI_STRING("Loading...", "Media controller status message when the media is loading");
883 }
884
885 String mediaElementLiveBroadcastStateText()
886 {
887     return WEB_UI_STRING("Live Broadcast", "Media controller status message when watching a live broadcast");
888 }
889
890 String localizedMediaControlElementString(const String& name)
891 {
892     if (name == "AudioElement")
893         return WEB_UI_STRING("audio playback", "accessibility label for audio element controller");
894     if (name == "VideoElement")
895         return WEB_UI_STRING("video playback", "accessibility label for video element controller");
896     if (name == "MuteButton")
897         return WEB_UI_STRING("mute", "accessibility label for mute button");
898     if (name == "UnMuteButton")
899         return WEB_UI_STRING("unmute", "accessibility label for turn mute off button");
900     if (name == "PlayButton")
901         return WEB_UI_STRING("play", "accessibility label for play button");
902     if (name == "PauseButton")
903         return WEB_UI_STRING("pause", "accessibility label for pause button");
904     if (name == "Slider")
905         return WEB_UI_STRING("movie time", "accessibility label for timeline slider");
906     if (name == "SliderThumb")
907         return WEB_UI_STRING("timeline slider thumb", "accessibility label for timeline thumb");
908     if (name == "RewindButton")
909         return WEB_UI_STRING("back 30 seconds", "accessibility label for seek back 30 seconds button");
910     if (name == "ReturnToRealtimeButton")
911         return WEB_UI_STRING("return to realtime", "accessibility label for return to real time button");
912     if (name == "CurrentTimeDisplay")
913         return WEB_UI_STRING("elapsed time", "accessibility label for elapsed time display");
914     if (name == "TimeRemainingDisplay")
915         return WEB_UI_STRING("remaining time", "accessibility label for time remaining display");
916     if (name == "StatusDisplay")
917         return WEB_UI_STRING("status", "accessibility label for movie status");
918     if (name == "EnterFullscreenButton")
919         return WEB_UI_STRING("enter fullscreen", "accessibility label for enter fullscreen button");
920     if (name == "ExitFullscreenButton")
921         return WEB_UI_STRING("exit fullscreen", "accessibility label for exit fullscreen button");
922     if (name == "SeekForwardButton")
923         return WEB_UI_STRING("fast forward", "accessibility label for fast forward button");
924     if (name == "SeekBackButton")
925         return WEB_UI_STRING("fast reverse", "accessibility label for fast reverse button");
926     if (name == "ShowClosedCaptionsButton")
927         return WEB_UI_STRING("show closed captions", "accessibility label for show closed captions button");
928     if (name == "HideClosedCaptionsButton")
929         return WEB_UI_STRING("hide closed captions", "accessibility label for hide closed captions button");
930
931     // FIXME: the ControlsPanel container should never be visible in the accessibility hierarchy.
932     if (name == "ControlsPanel")
933         return String();
934
935     ASSERT_NOT_REACHED();
936     return String();
937 }
938
939 String localizedMediaControlElementHelpText(const String& name)
940 {
941     if (name == "AudioElement")
942         return WEB_UI_STRING("audio element playback controls and status display", "accessibility help text for audio element controller");
943     if (name == "VideoElement")
944         return WEB_UI_STRING("video element playback controls and status display", "accessibility help text for video element controller");
945     if (name == "MuteButton")
946         return WEB_UI_STRING("mute audio tracks", "accessibility help text for mute button");
947     if (name == "UnMuteButton")
948         return WEB_UI_STRING("unmute audio tracks", "accessibility help text for un mute button");
949     if (name == "PlayButton")
950         return WEB_UI_STRING("begin playback", "accessibility help text for play button");
951     if (name == "PauseButton")
952         return WEB_UI_STRING("pause playback", "accessibility help text for pause button");
953     if (name == "Slider")
954         return WEB_UI_STRING("movie time scrubber", "accessibility help text for timeline slider");
955     if (name == "SliderThumb")
956         return WEB_UI_STRING("movie time scrubber thumb", "accessibility help text for timeline slider thumb");
957     if (name == "RewindButton")
958         return WEB_UI_STRING("seek movie back 30 seconds", "accessibility help text for jump back 30 seconds button");
959     if (name == "ReturnToRealtimeButton")
960         return WEB_UI_STRING("return streaming movie to real time", "accessibility help text for return streaming movie to real time button");
961     if (name == "CurrentTimeDisplay")
962         return WEB_UI_STRING("current movie time in seconds", "accessibility help text for elapsed time display");
963     if (name == "TimeRemainingDisplay")
964         return WEB_UI_STRING("number of seconds of movie remaining", "accessibility help text for remaining time display");
965     if (name == "StatusDisplay")
966         return WEB_UI_STRING("current movie status", "accessibility help text for movie status display");
967     if (name == "SeekBackButton")
968         return WEB_UI_STRING("seek quickly back", "accessibility help text for fast rewind button");
969     if (name == "SeekForwardButton")
970         return WEB_UI_STRING("seek quickly forward", "accessibility help text for fast forward button");
971     if (name == "FullscreenButton")
972         return WEB_UI_STRING("Play movie in fullscreen mode", "accessibility help text for enter fullscreen button");
973     if (name == "ShowClosedCaptionsButton")
974         return WEB_UI_STRING("start displaying closed captions", "accessibility help text for show closed captions button");
975     if (name == "HideClosedCaptionsButton")
976         return WEB_UI_STRING("stop displaying closed captions", "accessibility help text for hide closed captions button");
977
978     // The description of this button is descriptive enough that it doesn't require help text.
979     if (name == "EnterFullscreenButton")
980         return String();
981     
982     ASSERT_NOT_REACHED();
983     return String();
984 }
985
986 String localizedMediaTimeDescription(float time)
987 {
988     if (!std::isfinite(time))
989         return WEB_UI_STRING("indefinite time", "accessibility help text for an indefinite media controller time value");
990
991     int seconds = static_cast<int>(fabsf(time));
992     int days = seconds / (60 * 60 * 24);
993     int hours = seconds / (60 * 60);
994     int minutes = (seconds / 60) % 60;
995     seconds %= 60;
996
997     if (days)
998         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);
999     if (hours)
1000         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);
1001     if (minutes)
1002         return formatLocalizedString(WEB_UI_STRING("%1$d minutes %2$d seconds", "accessibility help text for media controller time value >= 60 seconds"), minutes, seconds);
1003     return formatLocalizedString(WEB_UI_STRING("%1$d seconds", "accessibility help text for media controller time value < 60 seconds"), seconds);
1004 }
1005
1006 String validationMessageValueMissingText()
1007 {
1008     return WEB_UI_STRING("value missing", "Validation message for required form control elements that have no value");
1009 }
1010
1011 String validationMessageValueMissingForCheckboxText()
1012 {
1013     return validationMessageValueMissingText();
1014 }
1015
1016 String validationMessageValueMissingForFileText()
1017 {
1018     return validationMessageValueMissingText();
1019 }
1020
1021 String validationMessageValueMissingForMultipleFileText()
1022 {
1023     return validationMessageValueMissingText();
1024 }
1025
1026 String validationMessageValueMissingForRadioText()
1027 {
1028     return validationMessageValueMissingText();
1029 }
1030
1031 String validationMessageValueMissingForSelectText()
1032 {
1033     return validationMessageValueMissingText();
1034 }
1035
1036 String validationMessageTypeMismatchText()
1037 {
1038     return WEB_UI_STRING("type mismatch", "Validation message for input form controls with a value not matching type");
1039 }
1040
1041 String validationMessageTypeMismatchForEmailText()
1042 {
1043     return validationMessageTypeMismatchText();
1044 }
1045
1046 String validationMessageTypeMismatchForMultipleEmailText()
1047 {
1048     return validationMessageTypeMismatchText();
1049 }
1050
1051 String validationMessageTypeMismatchForURLText()
1052 {
1053     return validationMessageTypeMismatchText();
1054 }
1055
1056 String validationMessagePatternMismatchText()
1057 {
1058     return WEB_UI_STRING("pattern mismatch", "Validation message for input form controls requiring a constrained value according to pattern");
1059 }
1060
1061 String validationMessageTooLongText(int, int)
1062 {
1063     return WEB_UI_STRING("too long", "Validation message for form control elements with a value longer than maximum allowed length");
1064 }
1065
1066 String validationMessageRangeUnderflowText(const String&)
1067 {
1068     return WEB_UI_STRING("range underflow", "Validation message for input form controls with value lower than allowed minimum");
1069 }
1070
1071 String validationMessageRangeOverflowText(const String&)
1072 {
1073     return WEB_UI_STRING("range overflow", "Validation message for input form controls with value higher than allowed maximum");
1074 }
1075
1076 String validationMessageStepMismatchText(const String&, const String&)
1077 {
1078     return WEB_UI_STRING("step mismatch", "Validation message for input form controls with value not respecting the step attribute");
1079 }
1080
1081 String validationMessageBadInputForNumberText()
1082 {
1083     notImplemented();
1084     return validationMessageTypeMismatchText();
1085 }
1086
1087 String clickToExitFullScreenText()
1088 {
1089     return WEB_UI_STRING("Click to Exit Full Screen", "Message to display in browser window when in webkit full screen mode.");
1090 }
1091
1092 #if ENABLE(VIDEO_TRACK)
1093 String textTrackSubtitlesText()
1094 {
1095     return WEB_UI_STRING("Subtitles", "Menu section heading for subtitles");
1096 }
1097
1098 String textTrackOffMenuItemText()
1099 {
1100     return WEB_UI_STRING("Off", "Menu item label for the track that represents disabling closed captions");
1101 }
1102
1103 String textTrackAutomaticMenuItemText()
1104 {
1105     return formatLocalizedString(WEB_UI_STRING("Auto (Recommended)", "Menu item label for automatic track selection behavior"));
1106 }
1107
1108 String textTrackNoLabelText()
1109 {
1110     return WEB_UI_STRING_KEY("Unknown", "Unknown (text track)", "Menu item label for a text track that has no other name");
1111 }
1112
1113 String audioTrackNoLabelText()
1114 {
1115     return WEB_UI_STRING_KEY("Unknown", "Unknown (audio track)", "Menu item label for an audio track that has no other name");
1116 }
1117
1118 #if PLATFORM(COCOA) || PLATFORM(WIN)
1119 String textTrackCountryAndLanguageMenuItemText(const String& title, const String& country, const String& language)
1120 {
1121     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());
1122 }
1123
1124 String textTrackLanguageMenuItemText(const String& title, const String& language)
1125 {
1126     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());
1127 }
1128
1129 String closedCaptionTrackMenuItemText(const String& title)
1130 {
1131     return formatLocalizedString(WEB_UI_STRING("%@ CC", "Text track contains closed captions"), title.createCFString().get());
1132 }
1133
1134 String sdhTrackMenuItemText(const String& title)
1135 {
1136     return formatLocalizedString(WEB_UI_STRING("%@ SDH", "Text track contains subtitles for the deaf and hard of hearing"), title.createCFString().get());
1137 }
1138
1139 String easyReaderTrackMenuItemText(const String& title)
1140 {
1141     return formatLocalizedString(WEB_UI_STRING("%@ Easy Reader", "Text track contains simplified (3rd grade level) subtitles"), title.createCFString().get());
1142 }
1143
1144 String forcedTrackMenuItemText(const String& title)
1145 {
1146     return formatLocalizedString(WEB_UI_STRING("%@ Forced", "Text track contains forced subtitles"), title.createCFString().get());
1147 }
1148
1149 String audioDescriptionTrackSuffixText(const String& title)
1150 {
1151     return formatLocalizedString(WEB_UI_STRING("%@ AD", "Text track contains Audio Descriptions"), title.createCFString().get());
1152 }
1153 #endif
1154
1155 #endif
1156
1157 String snapshottedPlugInLabelTitle()
1158 {
1159     return WEB_UI_STRING("Snapshotted Plug-In", "Title of the label to show on a snapshotted plug-in");
1160 }
1161
1162 String snapshottedPlugInLabelSubtitle()
1163 {
1164     return WEB_UI_STRING("Click to restart", "Subtitle of the label to show on a snapshotted plug-in");
1165 }
1166
1167 String useBlockedPlugInContextMenuTitle()
1168 {
1169     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"));
1170 }
1171
1172 #if ENABLE(SUBTLE_CRYPTO)
1173 String webCryptoMasterKeyKeychainLabel(const String& localizedApplicationName)
1174 {
1175     return formatLocalizedString(WEB_UI_STRING("%@ WebCrypto Master Key", "Name of application's single WebCrypto master key in Keychain"), localizedApplicationName.createCFString().get());
1176 }
1177
1178 String webCryptoMasterKeyKeychainComment()
1179 {
1180     return WEB_UI_STRING("Used to encrypt WebCrypto keys in persistent storage, such as IndexedDB", "Description of WebCrypto master keys in Keychain");
1181 }
1182 #endif
1183
1184 #if PLATFORM(MAC)
1185 String insertListTypeNone()
1186 {
1187     return WEB_UI_STRING("None", "Option in segmented control for choosing list type in text editing");
1188 }
1189
1190 String insertListTypeBulleted()
1191 {
1192     return WEB_UI_STRING("•", "Option in segmented control for choosing list type in text editing");
1193 }
1194
1195 String insertListTypeBulletedAccessibilityTitle()
1196 {
1197     return WEB_UI_STRING("Bulleted list", "Option in segmented control for inserting a bulleted list in text editing");
1198 }
1199
1200 String insertListTypeNumbered()
1201 {
1202     return WEB_UI_STRING("1. 2. 3.…", "Option in segmented control for choosing list type in text editing");
1203 }
1204
1205 String insertListTypeNumberedAccessibilityTitle()
1206 {
1207     return WEB_UI_STRING("Numbered list", "Option in segmented control for inserting a numbered list in text editing");
1208 }
1209 #endif // PLATFORM(MAC)
1210
1211 } // namespace WebCore