1 /* 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 3 * Copyright (C) 2006 Michael Emmel mike.emmel (at) gmail.com 4 * Copyright (C) 2007 Holger Hans Peter Freyther 5 * Copyright (C) 2008 Christian Dywan <christian (at) imendio.com> 6 * Copyright (C) 2008 Nuanti Ltd. 7 * Copyright (C) 2010 Igalia S.L 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 26 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 33 #include "LocalizedStrings.h" 34 #include "GOwnPtr.h" 35 #include "IntSize.h" 36 #include "NotImplemented.h" 37 #include "PlatformString.h" 38 #include <wtf/text/CString.h> 39 40 #include <glib/gi18n-lib.h> 41 #include <gtk/gtk.h> 42 #include <math.h> 43 44 namespace WebCore { 45 46 static const char* gtkStockLabel(const char* stockID) 47 { 48 GtkStockItem item; 49 if (!gtk_stock_lookup(stockID, &item)) 50 return stockID; 51 return item.label; 52 } 53 54 String submitButtonDefaultLabel() 55 { 56 return String::fromUTF8(_("Submit")); 57 } 58 59 String inputElementAltText() 60 { 61 return String::fromUTF8(_("Submit")); 62 } 63 64 String resetButtonDefaultLabel() 65 { 66 return String::fromUTF8(_("Reset")); 67 } 68 69 String defaultDetailsSummaryText() 70 { 71 return String::fromUTF8(_("Details")); 72 } 73 74 String searchableIndexIntroduction() 75 { 76 return String::fromUTF8(_("This is a searchable index. Enter search keywords: ")); 77 } 78 79 String fileButtonChooseFileLabel() 80 { 81 return String::fromUTF8(_("Choose File")); 82 } 83 84 String fileButtonNoFileSelectedLabel() 85 { 86 return String::fromUTF8(_("(None)")); 87 } 88 89 String contextMenuItemTagOpenLinkInNewWindow() 90 { 91 return String::fromUTF8(_("Open Link in New _Window")); 92 } 93 94 String contextMenuItemTagDownloadLinkToDisk() 95 { 96 return String::fromUTF8(_("_Download Linked File")); 97 } 98 99 String contextMenuItemTagCopyLinkToClipboard() 100 { 101 return String::fromUTF8(_("Copy Link Loc_ation")); 102 } 103 104 String contextMenuItemTagOpenImageInNewWindow() 105 { 106 return String::fromUTF8(_("Open _Image in New Window")); 107 } 108 109 String contextMenuItemTagDownloadImageToDisk() 110 { 111 return String::fromUTF8(_("Sa_ve Image As")); 112 } 113 114 String contextMenuItemTagCopyImageToClipboard() 115 { 116 return String::fromUTF8(_("Cop_y Image")); 117 } 118 119 String contextMenuItemTagCopyImageUrlToClipboard() 120 { 121 return String::fromUTF8(_("Copy Image _Address")); 122 } 123 124 String contextMenuItemTagOpenVideoInNewWindow() 125 { 126 return String::fromUTF8(_("Open _Video in New Window")); 127 } 128 129 String contextMenuItemTagOpenAudioInNewWindow() 130 { 131 return String::fromUTF8(_("Open _Audio in New Window")); 132 } 133 134 String contextMenuItemTagCopyVideoLinkToClipboard() 135 { 136 return String::fromUTF8(_("Cop_y Video Link Location")); 137 } 138 139 String contextMenuItemTagCopyAudioLinkToClipboard() 140 { 141 return String::fromUTF8(_("Cop_y Audio Link Location")); 142 } 143 144 String contextMenuItemTagToggleMediaControls() 145 { 146 return String::fromUTF8(_("_Toggle Media Controls")); 147 } 148 149 String contextMenuItemTagToggleMediaLoop() 150 { 151 return String::fromUTF8(_("Toggle Media _Loop Playback")); 152 } 153 154 String contextMenuItemTagEnterVideoFullscreen() 155 { 156 return String::fromUTF8(_("Switch Video to _Fullscreen")); 157 } 158 159 String contextMenuItemTagMediaPlay() 160 { 161 return String::fromUTF8(_("_Play")); 162 } 163 164 String contextMenuItemTagMediaPause() 165 { 166 return String::fromUTF8(_("_Pause")); 167 } 168 169 String contextMenuItemTagMediaMute() 170 { 171 return String::fromUTF8(_("_Mute")); 172 } 173 174 String contextMenuItemTagOpenFrameInNewWindow() 175 { 176 return String::fromUTF8(_("Open _Frame in New Window")); 177 } 178 179 String contextMenuItemTagCopy() 180 { 181 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_COPY)); 182 return stockLabel; 183 } 184 185 String contextMenuItemTagDelete() 186 { 187 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_DELETE)); 188 return stockLabel; 189 } 190 191 String contextMenuItemTagSelectAll() 192 { 193 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_SELECT_ALL)); 194 return stockLabel; 195 } 196 197 String contextMenuItemTagUnicode() 198 { 199 return String::fromUTF8(_("_Insert Unicode Control Character")); 200 } 201 202 String contextMenuItemTagInputMethods() 203 { 204 return String::fromUTF8(_("Input _Methods")); 205 } 206 207 String contextMenuItemTagGoBack() 208 { 209 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_GO_BACK)); 210 return stockLabel; 211 } 212 213 String contextMenuItemTagGoForward() 214 { 215 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_GO_FORWARD)); 216 return stockLabel; 217 } 218 219 String contextMenuItemTagStop() 220 { 221 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_STOP)); 222 return stockLabel; 223 } 224 225 String contextMenuItemTagReload() 226 { 227 return String::fromUTF8(_("_Reload")); 228 } 229 230 String contextMenuItemTagCut() 231 { 232 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_CUT)); 233 return stockLabel; 234 } 235 236 String contextMenuItemTagPaste() 237 { 238 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_PASTE)); 239 return stockLabel; 240 } 241 242 String contextMenuItemTagNoGuessesFound() 243 { 244 return String::fromUTF8(_("No Guesses Found")); 245 } 246 247 String contextMenuItemTagIgnoreSpelling() 248 { 249 return String::fromUTF8(_("_Ignore Spelling")); 250 } 251 252 String contextMenuItemTagLearnSpelling() 253 { 254 return String::fromUTF8(_("_Learn Spelling")); 255 } 256 257 String contextMenuItemTagSearchWeb() 258 { 259 return String::fromUTF8(_("_Search the Web")); 260 } 261 262 String contextMenuItemTagLookUpInDictionary(const String&) 263 { 264 return String::fromUTF8(_("_Look Up in Dictionary")); 265 } 266 267 String contextMenuItemTagOpenLink() 268 { 269 return String::fromUTF8(_("_Open Link")); 270 } 271 272 String contextMenuItemTagIgnoreGrammar() 273 { 274 return String::fromUTF8(_("Ignore _Grammar")); 275 } 276 277 String contextMenuItemTagSpellingMenu() 278 { 279 return String::fromUTF8(_("Spelling and _Grammar")); 280 } 281 282 String contextMenuItemTagShowSpellingPanel(bool show) 283 { 284 return String::fromUTF8(show ? _("_Show Spelling and Grammar") : _("_Hide Spelling and Grammar")); 285 } 286 287 String contextMenuItemTagCheckSpelling() 288 { 289 return String::fromUTF8(_("_Check Document Now")); 290 } 291 292 String contextMenuItemTagCheckSpellingWhileTyping() 293 { 294 return String::fromUTF8(_("Check Spelling While _Typing")); 295 } 296 297 String contextMenuItemTagCheckGrammarWithSpelling() 298 { 299 return String::fromUTF8(_("Check _Grammar With Spelling")); 300 } 301 302 String contextMenuItemTagFontMenu() 303 { 304 return String::fromUTF8(_("_Font")); 305 } 306 307 String contextMenuItemTagBold() 308 { 309 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_BOLD)); 310 return stockLabel; 311 } 312 313 String contextMenuItemTagItalic() 314 { 315 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_ITALIC)); 316 return stockLabel; 317 } 318 319 String contextMenuItemTagUnderline() 320 { 321 static String stockLabel = String::fromUTF8(gtkStockLabel(GTK_STOCK_UNDERLINE)); 322 return stockLabel; 323 } 324 325 String contextMenuItemTagOutline() 326 { 327 return String::fromUTF8(_("_Outline")); 328 } 329 330 String contextMenuItemTagInspectElement() 331 { 332 return String::fromUTF8(_("Inspect _Element")); 333 } 334 335 String searchMenuNoRecentSearchesText() 336 { 337 return String::fromUTF8(_("No recent searches")); 338 } 339 340 String searchMenuRecentSearchesText() 341 { 342 return String::fromUTF8(_("Recent searches")); 343 } 344 345 String searchMenuClearRecentSearchesText() 346 { 347 return String::fromUTF8(_("_Clear recent searches")); 348 } 349 350 String AXDefinitionListTermText() 351 { 352 return String::fromUTF8(_("term")); 353 } 354 355 String AXDefinitionListDefinitionText() 356 { 357 return String::fromUTF8(_("definition")); 358 } 359 360 String AXButtonActionVerb() 361 { 362 return String::fromUTF8(_("press")); 363 } 364 365 String AXRadioButtonActionVerb() 366 { 367 return String::fromUTF8(_("select")); 368 } 369 370 String AXTextFieldActionVerb() 371 { 372 return String::fromUTF8(_("activate")); 373 } 374 375 String AXCheckedCheckBoxActionVerb() 376 { 377 return String::fromUTF8(_("uncheck")); 378 } 379 380 String AXUncheckedCheckBoxActionVerb() 381 { 382 return String::fromUTF8(_("check")); 383 } 384 385 String AXLinkActionVerb() 386 { 387 return String::fromUTF8(_("jump")); 388 } 389 390 String AXMenuListPopupActionVerb() 391 { 392 return String(); 393 } 394 395 String AXMenuListActionVerb() 396 { 397 return String(); 398 } 399 400 String missingPluginText() 401 { 402 return String::fromUTF8(_("Missing Plug-in")); 403 } 404 405 String crashedPluginText() 406 { 407 notImplemented(); 408 return String::fromUTF8(_("Plug-in Failure")); 409 } 410 411 String multipleFileUploadText(unsigned numberOfFiles) 412 { 413 // FIXME: If this file gets localized, this should really be localized as one string with a wildcard for the number. 414 return String::number(numberOfFiles) + String::fromUTF8(_(" files")); 415 } 416 417 String unknownFileSizeText() 418 { 419 return String::fromUTF8(_("Unknown")); 420 } 421 422 String imageTitle(const String& filename, const IntSize& size) 423 { 424 GOwnPtr<gchar> string(g_strdup_printf(C_("Title string for images", "%s (%dx%d pixels)"), 425 filename.utf8().data(), 426 size.width(), size.height())); 427 428 return String::fromUTF8(string.get()); 429 } 430 431 432 #if ENABLE(VIDEO) 433 434 String mediaElementLoadingStateText() 435 { 436 return String::fromUTF8(_("Loading...")); 437 } 438 439 String mediaElementLiveBroadcastStateText() 440 { 441 return String::fromUTF8(_("Live Broadcast")); 442 } 443 444 String localizedMediaControlElementString(const String& name) 445 { 446 if (name == "AudioElement") 447 return String::fromUTF8(_("audio element controller")); 448 if (name == "VideoElement") 449 return String::fromUTF8(_("video element controller")); 450 if (name == "MuteButton") 451 return String::fromUTF8(_("mute")); 452 if (name == "UnMuteButton") 453 return String::fromUTF8(_("unmute")); 454 if (name == "PlayButton") 455 return String::fromUTF8(_("play")); 456 if (name == "PauseButton") 457 return String::fromUTF8(_("pause")); 458 if (name == "Slider") 459 return String::fromUTF8(_("movie time")); 460 if (name == "SliderThumb") 461 return String::fromUTF8(_("timeline slider thumb")); 462 if (name == "RewindButton") 463 return String::fromUTF8(_("back 30 seconds")); 464 if (name == "ReturnToRealtimeButton") 465 return String::fromUTF8(_("return to realtime")); 466 if (name == "CurrentTimeDisplay") 467 return String::fromUTF8(_("elapsed time")); 468 if (name == "TimeRemainingDisplay") 469 return String::fromUTF8(_("remaining time")); 470 if (name == "StatusDisplay") 471 return String::fromUTF8(_("status")); 472 if (name == "FullscreenButton") 473 return String::fromUTF8(_("fullscreen")); 474 if (name == "SeekForwardButton") 475 return String::fromUTF8(_("fast forward")); 476 if (name == "SeekBackButton") 477 return String::fromUTF8(_("fast reverse")); 478 if (name == "ShowClosedCaptionsButton") 479 return String::fromUTF8(_("show closed captions")); 480 if (name == "HideClosedCaptionsButton") 481 return String::fromUTF8(_("hide closed captions")); 482 483 ASSERT_NOT_REACHED(); 484 return String(); 485 } 486 487 String localizedMediaControlElementHelpText(const String& name) 488 { 489 if (name == "AudioElement") 490 return String::fromUTF8(_("audio element playback controls and status display")); 491 if (name == "VideoElement") 492 return String::fromUTF8(_("video element playback controls and status display")); 493 if (name == "MuteButton") 494 return String::fromUTF8(_("mute audio tracks")); 495 if (name == "UnMuteButton") 496 return String::fromUTF8(_("unmute audio tracks")); 497 if (name == "PlayButton") 498 return String::fromUTF8(_("begin playback")); 499 if (name == "PauseButton") 500 return String::fromUTF8(_("pause playback")); 501 if (name == "Slider") 502 return String::fromUTF8(_("movie time scrubber")); 503 if (name == "SliderThumb") 504 return String::fromUTF8(_("movie time scrubber thumb")); 505 if (name == "RewindButton") 506 return String::fromUTF8(_("seek movie back 30 seconds")); 507 if (name == "ReturnToRealtimeButton") 508 return String::fromUTF8(_("return streaming movie to real time")); 509 if (name == "CurrentTimeDisplay") 510 return String::fromUTF8(_("current movie time in seconds")); 511 if (name == "TimeRemainingDisplay") 512 return String::fromUTF8(_("number of seconds of movie remaining")); 513 if (name == "StatusDisplay") 514 return String::fromUTF8(_("current movie status")); 515 if (name == "SeekBackButton") 516 return String::fromUTF8(_("seek quickly back")); 517 if (name == "SeekForwardButton") 518 return String::fromUTF8(_("seek quickly forward")); 519 if (name == "FullscreenButton") 520 return String::fromUTF8(_("Play movie in fullscreen mode")); 521 if (name == "ShowClosedCaptionsButton") 522 return String::fromUTF8(_("start displaying closed captions")); 523 if (name == "HideClosedCaptionsButton") 524 return String::fromUTF8(_("stop displaying closed captions")); 525 526 ASSERT_NOT_REACHED(); 527 return String(); 528 } 529 530 String localizedMediaTimeDescription(float time) 531 { 532 if (!isfinite(time)) 533 return String::fromUTF8(_("indefinite time")); 534 535 int seconds = (int)fabsf(time); 536 int days = seconds / (60 * 60 * 24); 537 int hours = seconds / (60 * 60); 538 int minutes = (seconds / 60) % 60; 539 seconds %= 60; 540 541 if (days) { 542 GOwnPtr<gchar> string(g_strdup_printf("%d days %d hours %d minutes %d seconds", days, hours, minutes, seconds)); 543 return String::fromUTF8(string.get()); 544 } 545 546 if (hours) { 547 GOwnPtr<gchar> string(g_strdup_printf("%d hours %d minutes %d seconds", hours, minutes, seconds)); 548 return String::fromUTF8(string.get()); 549 } 550 551 if (minutes) { 552 GOwnPtr<gchar> string(g_strdup_printf("%d minutes %d seconds", minutes, seconds)); 553 return String::fromUTF8(string.get()); 554 } 555 556 GOwnPtr<gchar> string(g_strdup_printf("%d seconds", seconds)); 557 return String::fromUTF8(string.get()); 558 } 559 #endif // ENABLE(VIDEO) 560 561 String validationMessageValueMissingText() 562 { 563 return String::fromUTF8(_("value missing")); 564 } 565 566 String validationMessageValueMissingForCheckboxText() 567 { 568 notImplemented(); 569 return validationMessageValueMissingText(); 570 } 571 572 String validationMessageValueMissingForFileText() 573 { 574 notImplemented(); 575 return validationMessageValueMissingText(); 576 } 577 578 String validationMessageValueMissingForMultipleFileText() 579 { 580 notImplemented(); 581 return validationMessageValueMissingText(); 582 } 583 584 String validationMessageValueMissingForRadioText() 585 { 586 notImplemented(); 587 return validationMessageValueMissingText(); 588 } 589 590 String validationMessageValueMissingForSelectText() 591 { 592 notImplemented(); 593 return validationMessageValueMissingText(); 594 } 595 596 String validationMessageTypeMismatchText() 597 { 598 notImplemented(); 599 return String::fromUTF8(_("type mismatch")); 600 } 601 602 String validationMessageTypeMismatchForEmailText() 603 { 604 notImplemented(); 605 return validationMessageTypeMismatchText(); 606 } 607 608 String validationMessageTypeMismatchForMultipleEmailText() 609 { 610 notImplemented(); 611 return validationMessageTypeMismatchText(); 612 } 613 614 String validationMessageTypeMismatchForURLText() 615 { 616 notImplemented(); 617 return validationMessageTypeMismatchText(); 618 } 619 620 String validationMessagePatternMismatchText() 621 { 622 return String::fromUTF8(_("pattern mismatch")); 623 } 624 625 String validationMessageTooLongText(int, int) 626 { 627 return String::fromUTF8(_("too long")); 628 } 629 630 String validationMessageRangeUnderflowText(const String&) 631 { 632 return String::fromUTF8(_("range underflow")); 633 } 634 635 String validationMessageRangeOverflowText(const String&) 636 { 637 return String::fromUTF8(_("range overflow")); 638 } 639 640 String validationMessageStepMismatchText(const String&, const String&) 641 { 642 return String::fromUTF8(_("step mismatch")); 643 } 644 645 String localizedString(const char* key) 646 { 647 return String::fromUTF8(key, strlen(key)); 648 } 649 650 } 651