Unreviewed, rolling out r142343.
[WebKit-https.git] / Source / WebCore / platform / LocalizedStrings.cpp
1 /*
2  * Copyright (C) 2003, 2006, 2009, 2010, 2012 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/UnusedParam.h>
35 #include <wtf/unicode/CharacterNames.h>
36
37 #if USE(CF)
38 #include <wtf/RetainPtr.h>
39 #endif
40
41 #if PLATFORM(MAC)
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 !PLATFORM(MAC) || PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
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     DEFINE_STATIC_LOCAL(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;
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(MAC)
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 #if PLATFORM(QT)
216 String contextMenuItemTagSelectAll()
217 {
218     notImplemented();
219     return "Select All";
220 }
221 #endif
222
223 String contextMenuItemTagNoGuessesFound()
224 {
225     return WEB_UI_STRING("No Guesses Found", "No Guesses Found context menu item");
226 }
227
228 String contextMenuItemTagIgnoreSpelling()
229 {
230     return WEB_UI_STRING("Ignore Spelling", "Ignore Spelling context menu item");
231 }
232
233 String contextMenuItemTagLearnSpelling()
234 {
235     return WEB_UI_STRING("Learn Spelling", "Learn Spelling context menu item");
236 }
237
238 #if PLATFORM(MAC)
239 String contextMenuItemTagSearchInSpotlight()
240 {
241     return WEB_UI_STRING("Search in Spotlight", "Search in Spotlight context menu item");
242 }
243 #endif
244
245 String contextMenuItemTagSearchWeb()
246 {
247 #if PLATFORM(MAC) && (PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
248     RetainPtr<CFStringRef> searchProviderName(AdoptCF, wkCopyDefaultSearchProviderDisplayName());
249     return formatLocalizedString(WEB_UI_STRING("Search with %@", "Search with search provider context menu item with provider name inserted"), searchProviderName.get());
250 #else
251     return WEB_UI_STRING("Search with Google", "Search with Google context menu item");
252 #endif
253 }
254
255 String contextMenuItemTagLookUpInDictionary(const String& selectedString)
256 {
257 #if PLATFORM(MAC) && !PLATFORM(IOS) && __MAC_OS_X_VERSION_MIN_REQUIRED <= 1060
258     UNUSED_PARAM(selectedString);
259     return WEB_UI_STRING("Look Up in Dictionary", "Look Up in Dictionary context menu item");
260 #else
261 #if USE(CF)
262     RetainPtr<CFStringRef> selectedCFString = truncatedStringForLookupMenuItem(selectedString).createCFString();
263     return formatLocalizedString(WEB_UI_STRING("Look Up “%@”", "Look Up context menu item with selected word"), selectedCFString.get());
264 #else
265     return WEB_UI_STRING("Look Up “<selection>”", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));
266 #endif
267 #endif
268 }
269
270 String contextMenuItemTagOpenLink()
271 {
272     return WEB_UI_STRING("Open Link", "Open Link context menu item");
273 }
274
275 String contextMenuItemTagIgnoreGrammar()
276 {
277     return WEB_UI_STRING("Ignore Grammar", "Ignore Grammar context menu item");
278 }
279
280 String contextMenuItemTagSpellingMenu()
281 {
282     return WEB_UI_STRING("Spelling and Grammar", "Spelling and Grammar context sub-menu item");
283 }
284
285 String contextMenuItemTagShowSpellingPanel(bool show)
286 {
287     if (show)
288         return WEB_UI_STRING("Show Spelling and Grammar", "menu item title");
289     return WEB_UI_STRING("Hide Spelling and Grammar", "menu item title");
290 }
291
292 String contextMenuItemTagCheckSpelling()
293 {
294     return WEB_UI_STRING("Check Document Now", "Check spelling context menu item");
295 }
296
297 String contextMenuItemTagCheckSpellingWhileTyping()
298 {
299     return WEB_UI_STRING("Check Spelling While Typing", "Check spelling while typing context menu item");
300 }
301
302 String contextMenuItemTagCheckGrammarWithSpelling()
303 {
304     return WEB_UI_STRING("Check Grammar With Spelling", "Check grammar with spelling context menu item");
305 }
306
307 String contextMenuItemTagFontMenu()
308 {
309     return WEB_UI_STRING("Font", "Font context sub-menu item");
310 }
311
312 #if PLATFORM(MAC)
313 String contextMenuItemTagShowFonts()
314 {
315     return WEB_UI_STRING("Show Fonts", "Show fonts context menu item");
316 }
317 #endif
318
319 String contextMenuItemTagBold()
320 {
321     return WEB_UI_STRING("Bold", "Bold context menu item");
322 }
323
324 String contextMenuItemTagItalic()
325 {
326     return WEB_UI_STRING("Italic", "Italic context menu item");
327 }
328
329 String contextMenuItemTagUnderline()
330 {
331     return WEB_UI_STRING("Underline", "Underline context menu item");
332 }
333
334 String contextMenuItemTagOutline()
335 {
336     return WEB_UI_STRING("Outline", "Outline context menu item");
337 }
338
339 #if PLATFORM(MAC)
340 String contextMenuItemTagStyles()
341 {
342     return WEB_UI_STRING("Styles...", "Styles context menu item");
343 }
344
345 String contextMenuItemTagShowColors()
346 {
347     return WEB_UI_STRING("Show Colors", "Show colors context menu item");
348 }
349
350 String contextMenuItemTagSpeechMenu()
351 {
352     return WEB_UI_STRING("Speech", "Speech context sub-menu item");
353 }
354
355 String contextMenuItemTagStartSpeaking()
356 {
357     return WEB_UI_STRING("Start Speaking", "Start speaking context menu item");
358 }
359
360 String contextMenuItemTagStopSpeaking()
361 {
362     return WEB_UI_STRING("Stop Speaking", "Stop speaking context menu item");
363 }
364 #endif
365
366 String contextMenuItemTagWritingDirectionMenu()
367 {
368     return WEB_UI_STRING("Paragraph Direction", "Paragraph direction context sub-menu item");
369 }
370
371 String contextMenuItemTagTextDirectionMenu()
372 {
373     return WEB_UI_STRING("Selection Direction", "Selection direction context sub-menu item");
374 }
375
376 String contextMenuItemTagDefaultDirection()
377 {
378     return WEB_UI_STRING("Default", "Default writing direction context menu item");
379 }
380
381 String contextMenuItemTagLeftToRight()
382 {
383     return WEB_UI_STRING("Left to Right", "Left to Right context menu item");
384 }
385
386 String contextMenuItemTagRightToLeft()
387 {
388     return WEB_UI_STRING("Right to Left", "Right to Left context menu item");
389 }
390
391 #if PLATFORM(MAC)
392
393 String contextMenuItemTagCorrectSpellingAutomatically()
394 {
395     return WEB_UI_STRING("Correct Spelling Automatically", "Correct Spelling Automatically context menu item");
396 }
397
398 String contextMenuItemTagSubstitutionsMenu()
399 {
400     return WEB_UI_STRING("Substitutions", "Substitutions context sub-menu item");
401 }
402
403 String contextMenuItemTagShowSubstitutions(bool show)
404 {
405     if (show)
406         return WEB_UI_STRING("Show Substitutions", "menu item title");
407     return WEB_UI_STRING("Hide Substitutions", "menu item title");
408 }
409
410 String contextMenuItemTagSmartCopyPaste()
411 {
412     return WEB_UI_STRING("Smart Copy/Paste", "Smart Copy/Paste context menu item");
413 }
414
415 String contextMenuItemTagSmartQuotes()
416 {
417     return WEB_UI_STRING("Smart Quotes", "Smart Quotes context menu item");
418 }
419
420 String contextMenuItemTagSmartDashes()
421 {
422     return WEB_UI_STRING("Smart Dashes", "Smart Dashes context menu item");
423 }
424
425 String contextMenuItemTagSmartLinks()
426 {
427     return WEB_UI_STRING("Smart Links", "Smart Links context menu item");
428 }
429
430 String contextMenuItemTagTextReplacement()
431 {
432     return WEB_UI_STRING("Text Replacement", "Text Replacement context menu item");
433 }
434
435 String contextMenuItemTagTransformationsMenu()
436 {
437     return WEB_UI_STRING("Transformations", "Transformations context sub-menu item");
438 }
439
440 String contextMenuItemTagMakeUpperCase()
441 {
442     return WEB_UI_STRING("Make Upper Case", "Make Upper Case context menu item");
443 }
444
445 String contextMenuItemTagMakeLowerCase()
446 {
447     return WEB_UI_STRING("Make Lower Case", "Make Lower Case context menu item");
448 }
449
450 String contextMenuItemTagCapitalize()
451 {
452     return WEB_UI_STRING("Capitalize", "Capitalize context menu item");
453 }
454
455 String contextMenuItemTagChangeBack(const String& replacedString)
456 {
457     notImplemented();
458     return replacedString;
459 }
460
461 #endif // PLATFORM(MAC)
462
463 String contextMenuItemTagOpenVideoInNewWindow()
464 {
465     return WEB_UI_STRING("Open Video in New Window", "Open Video in New Window context menu item");
466 }
467
468 String contextMenuItemTagOpenAudioInNewWindow()
469 {
470     return WEB_UI_STRING("Open Audio in New Window", "Open Audio in New Window context menu item");
471 }
472
473 String contextMenuItemTagCopyVideoLinkToClipboard()
474 {
475     return WEB_UI_STRING("Copy Video Address", "Copy Video Address Location context menu item");
476 }
477
478 String contextMenuItemTagCopyAudioLinkToClipboard()
479 {
480     return WEB_UI_STRING("Copy Audio Address", "Copy Audio Address Location context menu item");
481 }
482
483 String contextMenuItemTagToggleMediaControls()
484 {
485     return WEB_UI_STRING("Controls", "Media Controls context menu item");
486 }
487
488 String contextMenuItemTagToggleMediaLoop()
489 {
490     return WEB_UI_STRING("Loop", "Media Loop context menu item");
491 }
492
493 String contextMenuItemTagEnterVideoFullscreen()
494 {
495     return WEB_UI_STRING("Enter Fullscreen", "Video Enter Fullscreen context menu item");
496 }
497
498 String contextMenuItemTagMediaPlay()
499 {
500     return WEB_UI_STRING("Play", "Media Play context menu item");
501 }
502
503 String contextMenuItemTagMediaPause()
504 {
505     return WEB_UI_STRING("Pause", "Media Pause context menu item");
506 }
507
508 String contextMenuItemTagMediaMute()
509 {
510     return WEB_UI_STRING("Mute", "Media Mute context menu item");
511 }
512     
513 String contextMenuItemTagInspectElement()
514 {
515     return WEB_UI_STRING("Inspect Element", "Inspect Element context menu item");
516 }
517
518 #endif // ENABLE(CONTEXT_MENUS)
519
520 String searchMenuNoRecentSearchesText()
521 {
522     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");
523 }
524
525 String searchMenuRecentSearchesText()
526 {
527     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");
528 }
529
530 String searchMenuClearRecentSearchesText()
531 {
532     return WEB_UI_STRING("Clear Recent Searches", "menu item in Recent Searches menu that empties menu's contents");
533 }
534
535 String AXWebAreaText()
536 {
537     return WEB_UI_STRING("HTML content", "accessibility role description for web area");
538 }
539
540 String AXLinkText()
541 {
542     return WEB_UI_STRING("link", "accessibility role description for link");
543 }
544
545 String AXListMarkerText()
546 {
547     return WEB_UI_STRING("list marker", "accessibility role description for list marker");
548 }
549
550 String AXImageMapText()
551 {
552     return WEB_UI_STRING("image map", "accessibility role description for image map");
553 }
554
555 String AXHeadingText()
556 {
557     return WEB_UI_STRING("heading", "accessibility role description for headings");
558 }
559
560 String AXDefinitionText()
561 {
562     return WEB_UI_STRING("definition", "role description of ARIA definition role");
563 }
564
565 String AXDescriptionListTermText()
566 {
567     return WEB_UI_STRING("term", "term word of a description list");
568 }
569
570 String AXDescriptionListDetailText()
571 {
572     return WEB_UI_STRING("description", "description detail");
573 }
574
575 String AXFooterRoleDescriptionText()
576 {
577     return WEB_UI_STRING("footer", "accessibility role description for a footer");
578 }
579
580 String AXFileUploadButtonText()
581 {
582     return WEB_UI_STRING("file upload button", "accessibility role description for a file upload button");
583 }
584
585 #if PLATFORM(MAC)
586 String AXARIAContentGroupText(const String& ariaType)
587 {
588     if (ariaType == "ARIAApplicationAlert")
589         return WEB_UI_STRING("alert", "An ARIA accessibility group that acts as an alert.");
590     if (ariaType == "ARIAApplicationAlertDialog")
591         return WEB_UI_STRING("alert dialog", "An ARIA accessibility group that acts as an alert dialog.");
592     if (ariaType == "ARIAApplicationDialog")
593         return WEB_UI_STRING("dialog", "An ARIA accessibility group that acts as an dialog.");
594     if (ariaType == "ARIAApplicationLog")
595         return WEB_UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
596     if (ariaType == "ARIAApplicationMarquee")
597         return WEB_UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");
598     if (ariaType == "ARIAApplicationStatus")
599         return WEB_UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");
600     if (ariaType == "ARIAApplicationTimer")
601         return WEB_UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");
602     if (ariaType == "ARIADocument")
603         return WEB_UI_STRING("document", "An ARIA accessibility group that acts as a document.");
604     if (ariaType == "ARIADocumentArticle")
605         return WEB_UI_STRING("article", "An ARIA accessibility group that acts as an article.");
606     if (ariaType == "ARIADocumentNote")
607         return WEB_UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");
608     if (ariaType == "ARIADocumentRegion")
609         return WEB_UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");
610     if (ariaType == "ARIALandmarkApplication")
611         return WEB_UI_STRING("application", "An ARIA accessibility group that acts as an application.");
612     if (ariaType == "ARIALandmarkBanner")
613         return WEB_UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");
614     if (ariaType == "ARIALandmarkComplementary")
615         return WEB_UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");
616     if (ariaType == "ARIALandmarkContentInfo")
617         return WEB_UI_STRING("content information", "An ARIA accessibility group that contains content.");
618     if (ariaType == "ARIALandmarkMain")
619         return WEB_UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");
620     if (ariaType == "ARIALandmarkNavigation")
621         return WEB_UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");
622     if (ariaType == "ARIALandmarkSearch")
623         return WEB_UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");
624     if (ariaType == "ARIAUserInterfaceTooltip")
625         return WEB_UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");
626     if (ariaType == "ARIATabPanel")
627         return WEB_UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab.");
628     if (ariaType == "ARIADocumentMath")
629         return WEB_UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols.");
630     return String();
631 }
632 #endif
633     
634 String AXButtonActionVerb()
635 {
636     return WEB_UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
637 }
638
639 String AXRadioButtonActionVerb()
640 {
641     return WEB_UI_STRING("select", "Verb stating the action that will occur when a radio button is clicked, as used by accessibility");
642 }
643
644 String AXTextFieldActionVerb()
645 {
646     return WEB_UI_STRING("activate", "Verb stating the action that will occur when a text field is selected, as used by accessibility");
647 }
648
649 String AXCheckedCheckBoxActionVerb()
650 {
651     return WEB_UI_STRING("uncheck", "Verb stating the action that will occur when a checked checkbox is clicked, as used by accessibility");
652 }
653
654 String AXUncheckedCheckBoxActionVerb()
655 {
656     return WEB_UI_STRING("check", "Verb stating the action that will occur when an unchecked checkbox is clicked, as used by accessibility");
657 }
658
659 String AXLinkActionVerb()
660 {
661     return WEB_UI_STRING("jump", "Verb stating the action that will occur when a link is clicked, as used by accessibility");
662 }
663
664 String AXMenuListPopupActionVerb()
665 {
666     notImplemented();
667     return "select";
668 }
669
670 String AXMenuListActionVerb()
671 {
672     notImplemented();
673     return "select";
674 }
675
676 String missingPluginText()
677 {
678     return WEB_UI_STRING("Missing Plug-in", "Label text to be used when a plugin is missing");
679 }
680
681 String crashedPluginText()
682 {
683     return WEB_UI_STRING("Plug-in Failure", "Label text to be used if plugin host process has crashed");
684 }
685
686 String blockedPluginByContentSecurityPolicyText()
687 {
688     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");
689 }
690
691 String insecurePluginVersionText()
692 {
693     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");
694 }
695
696 String inactivePluginText()
697 {
698     return WEB_UI_STRING("Inactive Plug-in", "Label text to be used when a plugin has not been loaded for some time");
699 }
700
701 String multipleFileUploadText(unsigned numberOfFiles)
702 {
703     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);
704 }
705
706 String unknownFileSizeText()
707 {
708     return WEB_UI_STRING_KEY("Unknown", "Unknown (filesize)", "Unknown filesize FTP directory listing item");
709 }
710
711 #if PLATFORM(WIN)
712 String uploadFileText()
713 {
714     notImplemented();
715     return "upload";
716 }
717
718 String allFilesText()
719 {
720     notImplemented();
721     return "all files";
722 }
723 #endif
724
725 #if PLATFORM(MAC)
726 String builtInPDFPluginName()
727 {
728     // Also exposed to DOM.
729     return WEB_UI_STRING("WebKit built-in PDF", "Pseudo plug-in name, visible in the Installed Plug-ins page in Safari.");
730 }
731
732 String pdfDocumentTypeDescription()
733 {
734     // Also exposed to DOM.
735     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.");
736 }
737
738 String postScriptDocumentTypeDescription()
739 {
740     // Also exposed to DOM.
741     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.");
742 }
743
744 String keygenMenuItem512()
745 {
746     return WEB_UI_STRING("512 (Low Grade)", "Menu item title for KEYGEN pop-up menu");
747 }
748
749 String keygenMenuItem1024()
750 {
751     return WEB_UI_STRING("1024 (Medium Grade)", "Menu item title for KEYGEN pop-up menu");
752 }
753
754 String keygenMenuItem2048()
755 {
756     return WEB_UI_STRING("2048 (High Grade)", "Menu item title for KEYGEN pop-up menu");
757 }
758
759 String keygenKeychainItemName(const String& host)
760 {
761     return formatLocalizedString(WEB_UI_STRING("Key from %@", "Name of keychain key generated by the KEYGEN tag"), host.createCFString().get());
762 }
763
764 #endif
765
766 #if PLATFORM(IOS)
767 String htmlSelectMultipleItems(size_t count)
768 {
769     switch (count) {
770     case 0:
771         return WEB_UI_STRING("0 Items", "Present the element <select multiple> when no <option> items are selected (iOS only)");
772     case 1:
773         return WEB_UI_STRING("1 Item", "Present the element <select multiple> when a single <option> is selected (iOS only)");
774     default:
775         return formatLocalizedString(WEB_UI_STRING("%zu Items", "Present the number of selected <option> items in a <select multiple> element (iOS only)"), count);
776     }
777 }
778 #endif
779
780 String imageTitle(const String& filename, const IntSize& size)
781 {
782 #if USE(CF)
783 #if !PLATFORM(MAC) || PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
784     RetainPtr<CFLocaleRef> locale = adoptCF(CFLocaleCopyCurrent());
785     RetainPtr<CFNumberFormatterRef> formatter(AdoptCF, CFNumberFormatterCreate(0, locale.get(), kCFNumberFormatterDecimalStyle));
786
787     int widthInt = size.width();
788     RetainPtr<CFNumberRef> width(AdoptCF, CFNumberCreate(0, kCFNumberIntType, &widthInt));
789     RetainPtr<CFStringRef> widthString(AdoptCF, CFNumberFormatterCreateStringWithNumber(0, formatter.get(), width.get()));
790
791     int heightInt = size.height();
792     RetainPtr<CFNumberRef> height(AdoptCF, CFNumberCreate(0, kCFNumberIntType, &heightInt));
793     RetainPtr<CFStringRef> heightString(AdoptCF, CFNumberFormatterCreateStringWithNumber(0, formatter.get(), height.get()));
794
795     return formatLocalizedString(WEB_UI_STRING("%@ %@×%@ pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename.createCFString().get(), widthString.get(), heightString.get());
796 #else
797     RetainPtr<CFStringRef> filenameCFString(AdoptCF, filename.createCFString());
798     return formatLocalizedString(WEB_UI_STRING("%@ %d×%d pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filenameCFString.get(), size.width(), size.height());
799 #endif
800 #else
801     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);
802 #endif
803 }
804
805 String mediaElementLoadingStateText()
806 {
807     return WEB_UI_STRING("Loading...", "Media controller status message when the media is loading");
808 }
809
810 String mediaElementLiveBroadcastStateText()
811 {
812     return WEB_UI_STRING("Live Broadcast", "Media controller status message when watching a live broadcast");
813 }
814
815 String localizedMediaControlElementString(const String& name)
816 {
817     if (name == "AudioElement")
818         return WEB_UI_STRING("audio element controller", "accessibility role description for audio element controller");
819     if (name == "VideoElement")
820         return WEB_UI_STRING("video element controller", "accessibility role description for video element controller");
821     if (name == "MuteButton")
822         return WEB_UI_STRING("mute", "accessibility role description for mute button");
823     if (name == "UnMuteButton")
824         return WEB_UI_STRING("unmute", "accessibility role description for turn mute off button");
825     if (name == "PlayButton")
826         return WEB_UI_STRING("play", "accessibility role description for play button");
827     if (name == "PauseButton")
828         return WEB_UI_STRING("pause", "accessibility role description for pause button");
829     if (name == "Slider")
830         return WEB_UI_STRING("movie time", "accessibility role description for timeline slider");
831     if (name == "SliderThumb")
832         return WEB_UI_STRING("timeline slider thumb", "accessibility role description for timeline thumb");
833     if (name == "RewindButton")
834         return WEB_UI_STRING("back 30 seconds", "accessibility role description for seek back 30 seconds button");
835     if (name == "ReturnToRealtimeButton")
836         return WEB_UI_STRING("return to realtime", "accessibility role description for return to real time button");
837     if (name == "CurrentTimeDisplay")
838         return WEB_UI_STRING("elapsed time", "accessibility role description for elapsed time display");
839     if (name == "TimeRemainingDisplay")
840         return WEB_UI_STRING("remaining time", "accessibility role description for time remaining display");
841     if (name == "StatusDisplay")
842         return WEB_UI_STRING("status", "accessibility role description for movie status");
843     if (name == "EnterFullscreenButton")
844         return WEB_UI_STRING("enter fullscreen", "accessibility role description for enter fullscreen button");
845     if (name == "ExitFullscreenButton")
846         return WEB_UI_STRING("exit fullscreen", "accessibility role description for exit fullscreen button");
847     if (name == "SeekForwardButton")
848         return WEB_UI_STRING("fast forward", "accessibility role description for fast forward button");
849     if (name == "SeekBackButton")
850         return WEB_UI_STRING("fast reverse", "accessibility role description for fast reverse button");
851     if (name == "ShowClosedCaptionsButton")
852         return WEB_UI_STRING("show closed captions", "accessibility role description for show closed captions button");
853     if (name == "HideClosedCaptionsButton")
854         return WEB_UI_STRING("hide closed captions", "accessibility role description for hide closed captions button");
855
856     // FIXME: the ControlsPanel container should never be visible in the accessibility hierarchy.
857     if (name == "ControlsPanel")
858         return String();
859
860     ASSERT_NOT_REACHED();
861     return String();
862 }
863
864 String localizedMediaControlElementHelpText(const String& name)
865 {
866     if (name == "AudioElement")
867         return WEB_UI_STRING("audio element playback controls and status display", "accessibility role description for audio element controller");
868     if (name == "VideoElement")
869         return WEB_UI_STRING("video element playback controls and status display", "accessibility role description for video element controller");
870     if (name == "MuteButton")
871         return WEB_UI_STRING("mute audio tracks", "accessibility help text for mute button");
872     if (name == "UnMuteButton")
873         return WEB_UI_STRING("unmute audio tracks", "accessibility help text for un mute button");
874     if (name == "PlayButton")
875         return WEB_UI_STRING("begin playback", "accessibility help text for play button");
876     if (name == "PauseButton")
877         return WEB_UI_STRING("pause playback", "accessibility help text for pause button");
878     if (name == "Slider")
879         return WEB_UI_STRING("movie time scrubber", "accessibility help text for timeline slider");
880     if (name == "SliderThumb")
881         return WEB_UI_STRING("movie time scrubber thumb", "accessibility help text for timeline slider thumb");
882     if (name == "RewindButton")
883         return WEB_UI_STRING("seek movie back 30 seconds", "accessibility help text for jump back 30 seconds button");
884     if (name == "ReturnToRealtimeButton")
885         return WEB_UI_STRING("return streaming movie to real time", "accessibility help text for return streaming movie to real time button");
886     if (name == "CurrentTimeDisplay")
887         return WEB_UI_STRING("current movie time in seconds", "accessibility help text for elapsed time display");
888     if (name == "TimeRemainingDisplay")
889         return WEB_UI_STRING("number of seconds of movie remaining", "accessibility help text for remaining time display");
890     if (name == "StatusDisplay")
891         return WEB_UI_STRING("current movie status", "accessibility help text for movie status display");
892     if (name == "SeekBackButton")
893         return WEB_UI_STRING("seek quickly back", "accessibility help text for fast rewind button");
894     if (name == "SeekForwardButton")
895         return WEB_UI_STRING("seek quickly forward", "accessibility help text for fast forward button");
896     if (name == "FullscreenButton")
897         return WEB_UI_STRING("Play movie in fullscreen mode", "accessibility help text for enter fullscreen button");
898     if (name == "ShowClosedCaptionsButton")
899         return WEB_UI_STRING("start displaying closed captions", "accessibility help text for show closed captions button");
900     if (name == "HideClosedCaptionsButton")
901         return WEB_UI_STRING("stop displaying closed captions", "accessibility help text for hide closed captions button");
902
903     // The description of this button is descriptive enough that it doesn't require help text.
904     if (name == "EnterFullscreenButton")
905         return String();
906     
907     ASSERT_NOT_REACHED();
908     return String();
909 }
910
911 String localizedMediaTimeDescription(float time)
912 {
913     if (!isfinite(time))
914         return WEB_UI_STRING("indefinite time", "accessibility help text for an indefinite media controller time value");
915
916     int seconds = static_cast<int>(fabsf(time));
917     int days = seconds / (60 * 60 * 24);
918     int hours = seconds / (60 * 60);
919     int minutes = (seconds / 60) % 60;
920     seconds %= 60;
921
922     if (days)
923         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);
924     if (hours)
925         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);
926     if (minutes)
927         return formatLocalizedString(WEB_UI_STRING("%1$d minutes %2$d seconds", "accessibility help text for media controller time value >= 60 seconds"), minutes, seconds);
928     return formatLocalizedString(WEB_UI_STRING("%1$d seconds", "accessibility help text for media controller time value < 60 seconds"), seconds);
929 }
930
931 String validationMessageValueMissingText()
932 {
933     return WEB_UI_STRING("value missing", "Validation message for required form control elements that have no value");
934 }
935
936 String validationMessageValueMissingForCheckboxText()
937 {
938     return validationMessageValueMissingText();
939 }
940
941 String validationMessageValueMissingForFileText()
942 {
943     return validationMessageValueMissingText();
944 }
945
946 String validationMessageValueMissingForMultipleFileText()
947 {
948     return validationMessageValueMissingText();
949 }
950
951 String validationMessageValueMissingForRadioText()
952 {
953     return validationMessageValueMissingText();
954 }
955
956 String validationMessageValueMissingForSelectText()
957 {
958     return validationMessageValueMissingText();
959 }
960
961 String validationMessageTypeMismatchText()
962 {
963     return WEB_UI_STRING("type mismatch", "Validation message for input form controls with a value not matching type");
964 }
965
966 String validationMessageTypeMismatchForEmailText()
967 {
968     return validationMessageTypeMismatchText();
969 }
970
971 String validationMessageTypeMismatchForMultipleEmailText()
972 {
973     return validationMessageTypeMismatchText();
974 }
975
976 String validationMessageTypeMismatchForURLText()
977 {
978     return validationMessageTypeMismatchText();
979 }
980
981 String validationMessagePatternMismatchText()
982 {
983     return WEB_UI_STRING("pattern mismatch", "Validation message for input form controls requiring a constrained value according to pattern");
984 }
985
986 String validationMessageTooLongText(int, int)
987 {
988     return WEB_UI_STRING("too long", "Validation message for form control elements with a value longer than maximum allowed length");
989 }
990
991 String validationMessageRangeUnderflowText(const String&)
992 {
993     return WEB_UI_STRING("range underflow", "Validation message for input form controls with value lower than allowed minimum");
994 }
995
996 String validationMessageRangeOverflowText(const String&)
997 {
998     return WEB_UI_STRING("range overflow", "Validation message for input form controls with value higher than allowed maximum");
999 }
1000
1001 String validationMessageStepMismatchText(const String&, const String&)
1002 {
1003     return WEB_UI_STRING("step mismatch", "Validation message for input form controls with value not respecting the step attribute");
1004 }
1005
1006 String validationMessageBadInputForNumberText()
1007 {
1008     notImplemented();
1009     return validationMessageTypeMismatchText();
1010 }
1011
1012 String clickToExitFullScreenText()
1013 {
1014     return WEB_UI_STRING("Click to exit full screen mode", "Message to display in browser window when in webkit full screen mode.");
1015 }
1016
1017 #if ENABLE(VIDEO_TRACK)
1018 String textTrackSubtitlesText()
1019 {
1020     return WEB_UI_STRING("Subtitles", "Menu section heading for subtitles");
1021 }
1022
1023 String textTrackOffText()
1024 {
1025     return WEB_UI_STRING("Off", "Menu item label for the track that represents disabling closed captions");
1026 }
1027
1028 String textTrackNoLabelText()
1029 {
1030     return WEB_UI_STRING_KEY("Unknown", "Unknown (closed captions track)", "Menu item label for a closed captions track that has no other name");
1031 }
1032 #endif
1033
1034 String snapshottedPlugInLabelTitle()
1035 {
1036     return WEB_UI_STRING("Snapshotted Plug-In", "Title of the label to show on a snapshotted plug-in");
1037 }
1038
1039 String snapshottedPlugInLabelSubtitle()
1040 {
1041     return WEB_UI_STRING("Click to restart", "Subtitle of the label to show on a snapshotted plug-in");
1042 }
1043
1044 } // namespace WebCore