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