i18n.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // @ts-ignore
  2. const userLangCode: string = (navigator.language || navigator.userLanguage || 'en').toLowerCase();
  3. const langPrefix: string = userLangCode.split('-')[0];
  4. export let customMessage: { [msgid: string]: string } = {};
  5. const translations: { [lang: string]: { [msgid: string]: string } } = {
  6. "en": {
  7. "disconnected_with_server": "Disconnected from the server, please refresh the page",
  8. "connect_fail": "Failed to connect to server!",
  9. "error_in_input": "There is an error with the input, please fix the error first",
  10. "file_size_exceed": 'File "%1" size exceeds limit: the size of a single file must not exceed %2',
  11. "file_total_size_exceed": "The total file size exceeds the limit: the total file size must not exceed %1",
  12. "submit": "Submit",
  13. "reset": "Reset",
  14. "cancel": "Cancel",
  15. "duplicated_pin_name": "This pin widget has expired (due to the output of a new pin widget with the same name).",
  16. "browse_file": "Browse",
  17. "duplicated_scope_name": "Error: The name of this scope is duplicated with the previous one!",
  18. },
  19. "zh": {
  20. "disconnected_with_server": "与服务器连接已断开,请刷新页面重新操作",
  21. "connect_fail": "连接服务器失败!",
  22. "error_in_input": "输入项存在错误,请消除错误后再提交",
  23. "file_size_exceed": '文件"%1"大小超过限制: 单个文件大小不超过%2',
  24. "file_total_size_exceed": "文件总大小超过限制: 文件总大小不超过%1",
  25. "submit": "提交",
  26. "reset": "重置",
  27. "cancel": "取消",
  28. "duplicated_pin_name": "该 Pin widget 已失效(由于输出了新的同名 pin widget)",
  29. "browse_file": "浏览文件",
  30. "duplicated_scope_name": "错误: 此scope与已有scope重复!",
  31. },
  32. "ru": {
  33. "disconnected_with_server": "Соединение с сервером потеряно, пожалуйста перезагрузите страницу",
  34. "connect_fail": "Ошибка подключения к серверу!",
  35. "error_in_input": "Пожалуйста, сначала исправьте ошибку",
  36. "file_size_exceed": 'Файл "%1" весит слишком много: максимально допустимый размер файла - %2',
  37. "file_total_size_exceed": "Общий размер файлов превышен: максимально допустимый объем - %1",
  38. "submit": "Отправить",
  39. "reset": "Сброс",
  40. "cancel": "Отмена",
  41. "duplicated_pin_name": "Этот закреп виджет устарел (виджет с таким же именем был выведен).",
  42. "browse_file": "Обзор",
  43. },
  44. "de": {
  45. "disconnected_with_server": "Verbindung zum Server unterbrochen. Bitte laden Sie die Seite neu.",
  46. "connect_fail": "Verbindung zum Server nicht möglich!",
  47. "error_in_input": "Die Eingabe ist fehlerhaft. Bitte beheben Sie zuerst den Fehler.",
  48. "file_size_exceed": 'Die Größe der Datei "%1" überschreitet das zulässige Maximum: eine einzelne Datei darf nicht größer sein als %2.',
  49. "file_total_size_exceed": "Die Gesamtdateigröße überschreitet das zulässige Maximum: alle Dateien zusammen dürfen nicht größer sein als %1.",
  50. "submit": "Übermitteln",
  51. "reset": "Zurücksetzen",
  52. "cancel": "Abbrechen",
  53. "duplicated_pin_name": "Dieses Pin-Widget ist nicht mehr gültig (Grund: Der Output enthält ein neues Pin-Widget mit dem gleichen Namen).",
  54. "browse_file": "Durchsuchen",
  55. "duplicated_scope_name": "Fehler: Der Name dieses Scopes ist mit dem vorhergehenden identisch!",
  56. },
  57. "fa": {
  58. "disconnected_with_server": "اتصال به سرور قطع شده است، لطفا صفحه را رفرش کنید",
  59. "connect_fail": "ناموفق در اتصال به سرور!",
  60. "error_in_input": "یک خطا با ورودی وجود دارد، لطفا ابتدا خطا را برطرف کنید",
  61. "file_size_exceed": 'اندازه فایل "%1" از حد مجاز بیشتر است: اندازه یک فایل تکی نباید از %2 بیشتر باشد',
  62. "file_total_size_exceed": "اندازه کلی فایل از حد مجاز بیشتر است: اندازه کلی فایل نباید از %1 بیشتر باشد",
  63. "submit": "ارسال",
  64. "reset": "بازنشانی",
  65. "cancel": "لغو",
  66. "duplicated_pin_name": "این Pin Widget منقضی شده است (به دلیل خروجی یک Pin Widget جدید با نام یکسان)",
  67. "browse_file": "مرور",
  68. "duplicated_scope_name": "خطا: نام این Scope با نام قبلی تکراری است!",
  69. },
  70. };
  71. translations['custom'] = customMessage // use to customize the message text.
  72. // sprintf equivalent, takes a string and some arguments to make a computed string
  73. // eg: strfmt("%1 dogs are in %2", 7, "the kitchen"); => "7 dogs are in the kitchen"
  74. // eg: strfmt("I like %1, bananas and %1", "apples"); => "I like apples, bananas and apples"
  75. function strfmt(fmt: string) {
  76. let args = arguments;
  77. return fmt
  78. // put space after double % to prevent placeholder replacement of such matches
  79. .replace(/%%/g, '%% ')
  80. // replace placeholders
  81. .replace(/%(\d+)/g, function (str, p1) {
  82. return args[p1];
  83. })
  84. // replace double % and space with single %
  85. .replace(/%% /g, '%')
  86. }
  87. export function t(msgid: string, ...args:string[]): string {
  88. let fmt = null;
  89. for (let lang of ['custom', userLangCode, langPrefix, 'en']) {
  90. if (translations[lang] && translations[lang][msgid]){
  91. fmt = translations[lang][msgid];
  92. break;
  93. }
  94. }
  95. if (fmt === null)
  96. throw Error(`No translation for "${msgid}" in "${userLangCode}"`);
  97. return strfmt.apply(null, [fmt, ...args]);
  98. }