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