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