Преглед на файлове

Merge remote-tracking branch 'upstream/master' into style/short-array-syntax-1640

# Conflicts:
#	tst/Bootstrap.php
#	tst/RequestTest.php
Matt Van Horn преди 1 седмица
родител
ревизия
077fc16695
променени са 71 файла, в които са добавени 713 реда и са изтрити 558 реда
  1. 6 4
      .github/workflows/codacy-analysis.yml
  2. 6 4
      .github/workflows/codeql-analysis.yml
  3. 5 4
      .github/workflows/eslint.yml
  4. 4 3
      .github/workflows/release.yml
  5. 6 4
      .github/workflows/snyk-scan.yml
  6. 19 11
      .github/workflows/tests.yml
  7. 11 1
      CHANGELOG.md
  8. 2 2
      Makefile
  9. 1 1
      README.md
  10. 8 6
      SECURITY.md
  11. 0 20
      css/bootstrap/privatebin.css
  12. 0 28
      css/bootstrap5/privatebin.css
  13. 1 1
      doc/Installation.md
  14. 6 3
      i18n/ar.json
  15. 6 3
      i18n/bg.json
  16. 6 3
      i18n/ca.json
  17. 6 3
      i18n/co.json
  18. 6 3
      i18n/cs.json
  19. 6 3
      i18n/de.json
  20. 6 3
      i18n/el.json
  21. 6 3
      i18n/en.json
  22. 6 3
      i18n/es.json
  23. 6 3
      i18n/et.json
  24. 6 3
      i18n/fa.json
  25. 6 3
      i18n/fi.json
  26. 6 3
      i18n/fr.json
  27. 16 13
      i18n/he.json
  28. 6 3
      i18n/hi.json
  29. 6 3
      i18n/hu.json
  30. 6 3
      i18n/id.json
  31. 6 3
      i18n/it.json
  32. 6 3
      i18n/ja.json
  33. 6 3
      i18n/jbo.json
  34. 6 3
      i18n/ko.json
  35. 6 3
      i18n/ku.json
  36. 6 3
      i18n/la.json
  37. 6 3
      i18n/lt.json
  38. 6 3
      i18n/nl.json
  39. 6 3
      i18n/no.json
  40. 6 3
      i18n/oc.json
  41. 6 3
      i18n/pl.json
  42. 6 3
      i18n/pt.json
  43. 6 3
      i18n/ro.json
  44. 20 17
      i18n/ru.json
  45. 6 3
      i18n/sk.json
  46. 6 3
      i18n/sl.json
  47. 6 3
      i18n/sv.json
  48. 6 3
      i18n/th.json
  49. 6 3
      i18n/tr.json
  50. 10 7
      i18n/uk.json
  51. 6 3
      i18n/zh.json
  52. 1 1
      js/common.js
  53. 165 230
      js/package-lock.json
  54. 4 3
      js/package.json
  55. 61 45
      js/privatebin.js
  56. 0 1
      js/purify-3.4.1.js
  57. 1 0
      js/purify-3.4.12.js
  58. 27 25
      js/test/CopyToClipboard.js
  59. 34 0
      js/test/PasteStatus.js
  60. 2 2
      lib/Configuration.php
  61. 1 1
      lib/Controller.php
  62. 13 0
      lib/I18n.php
  63. 2 2
      lib/Proxy/YourlsProxy.php
  64. 2 2
      lib/Request.php
  65. 13 6
      tpl/bootstrap.php
  66. 11 8
      tpl/bootstrap5.php
  67. 5 1
      tpl/shortenerproxy.php
  68. 5 0
      tst/Bootstrap.php
  69. 15 0
      tst/I18nTest.php
  70. 3 0
      tst/RequestTest.php
  71. 23 0
      tst/YourlsProxyTest.php

+ 6 - 4
.github/workflows/codacy-analysis.yml

@@ -17,18 +17,20 @@ on:
   schedule:
     - cron: '45 16 * * 1'
 
-permissions:
-  contents: read
-  security-events: write
+permissions: {}
 
 jobs:
   codacy-security-scan:
     name: Codacy Security Scan
+    permissions:
+      security-events: write
     runs-on: ubuntu-latest
     steps:
       # Checkout the repository to the GitHub Actions runner
       - name: Checkout code
-        uses: actions/checkout@v6
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Remove folders causing errors in report
         run: rm -rf doc img *.md

+ 6 - 4
.github/workflows/codeql-analysis.yml

@@ -18,13 +18,13 @@ on:
   schedule:
     - cron: '28 22 * * 5'
 
-permissions:
-  contents: read
-  security-events: write
+permissions: {}
 
 jobs:
   analyze:
     name: Analyze
+    permissions:
+      security-events: write
     runs-on: ubuntu-latest
 
     strategy:
@@ -37,7 +37,9 @@ jobs:
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v6
+      uses: actions/checkout@v7
+      with:
+        persist-credentials: false
 
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL

+ 5 - 4
.github/workflows/eslint.yml

@@ -12,18 +12,19 @@ on:
       - 'js/package-lock.json'
       - .github/workflows/eslint.yml
 
-permissions:
-  contents: read
+permissions: {}
 
 jobs:
   eslint:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v6
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Node.js
-        uses: actions/setup-node@v6
+        uses: actions/setup-node@v7
         with:
           node-version: '20'
 

+ 4 - 3
.github/workflows/release.yml

@@ -13,8 +13,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Fetch changelog from tag
-        uses: actions/checkout@v6
+        uses: actions/checkout@v7
         with:
+          persist-credentials: false
           sparse-checkout: CHANGELOG.md
           sparse-checkout-cone-mode: false
 
@@ -32,8 +33,8 @@ jobs:
     steps:
       - name: Collect artifacts
         run: |
-          wget -q https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.tar.gz
-          wget -q https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.zip
+          wget -q "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.tar.gz"
+          wget -q "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.zip"
 
       - name: Generate hashes
         shell: bash

+ 6 - 4
.github/workflows/snyk-scan.yml

@@ -9,13 +9,13 @@ on:
   pull_request:
     branches: [ master ]
 
-permissions:
-  contents: read
-  security-events: write
+permissions: {}
 
 jobs:
   # https://github.com/snyk/actions/tree/master/php
   snyk-php:
+    permissions:
+      security-events: write
     runs-on: ubuntu-latest
     if: |
       github.repository == 'PrivateBin/PrivateBin' && (
@@ -24,7 +24,9 @@ jobs:
       github.event.pull_request.author_association == 'MEMBER' ||
       github.event.pull_request.author_association == 'OWNER' )
     steps:
-      - uses: actions/checkout@v6
+      - uses: actions/checkout@v7
+        with:
+          persist-credentials: false
       - name: Run Snyk to check for vulnerabilities
         uses: snyk/actions/php@master
         continue-on-error: true # To make sure that SARIF upload gets called

+ 19 - 11
.github/workflows/tests.yml

@@ -14,7 +14,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
     - name: Checkout
-      uses: actions/checkout@v6
+      uses: actions/checkout@v7
+      with:
+        persist-credentials: false
     - name: Validate composer.json and composer.lock
       run: composer validate
     - name: Install dependencies
@@ -41,7 +43,9 @@ jobs:
 
     # let's get started!
     - name: Checkout
-      uses: actions/checkout@v6
+      uses: actions/checkout@v7
+      with:
+        persist-credentials: false
 
     # cache PHP extensions
     - name: Setup cache environment
@@ -53,7 +57,7 @@ jobs:
         key: ${{ runner.os }}-${{ env.extensions-cache-key }}
 
     - name: Cache extensions
-      uses: actions/cache@v5
+      uses: actions/cache@v6
       with:
         path: ${{ steps.extcache.outputs.dir }}
         key: ${{ steps.extcache.outputs.key }}
@@ -89,7 +93,7 @@ jobs:
       shell: bash
 
     - name: Cache dependencies
-      uses: actions/cache@v5
+      uses: actions/cache@v6
       with:
         path: "${{ steps.composer-cache.outputs.dir }}"
         key: "${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}"
@@ -121,7 +125,7 @@ jobs:
     name: PHP configuration combination unit tests
     runs-on: ubuntu-latest
     env:
-      php-version: '8.4'
+      php-version: '8.5'
       extensions: gd, sqlite3
       extensions-cache-key-name: phpextensions
 
@@ -129,7 +133,9 @@ jobs:
 
     # let's get started!
     - name: Checkout
-      uses: actions/checkout@v6
+      uses: actions/checkout@v7
+      with:
+        persist-credentials: false
 
     # cache PHP extensions
     - name: Setup cache environment
@@ -141,7 +147,7 @@ jobs:
         key: ${{ runner.os }}-${{ env.extensions-cache-key }}
 
     - name: Cache extensions
-      uses: actions/cache@v5
+      uses: actions/cache@v6
       with:
         path: ${{ steps.extcache.outputs.dir }}
         key: ${{ steps.extcache.outputs.key }}
@@ -177,7 +183,7 @@ jobs:
       shell: bash
 
     - name: Cache dependencies
-      uses: actions/cache@v5
+      uses: actions/cache@v6
       with:
         path: "${{ steps.composer-cache.outputs.dir }}"
         key: "${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}"
@@ -213,12 +219,14 @@ jobs:
     steps:
 
     - name: Checkout
-      uses: actions/checkout@v6
+      uses: actions/checkout@v7
+      with:
+        persist-credentials: false
 
     - name: Setup Node
-      uses: actions/setup-node@v6
+      uses: actions/setup-node@v7
       with:
-        node-version: '18'
+        node-version: '20'
         cache: 'npm'
         cache-dependency-path: 'js/package-lock.json'
 

+ 11 - 1
CHANGELOG.md

@@ -1,6 +1,16 @@
 # PrivateBin version history
 
-## 2.0.5 (not yet released)
+## 2.0.6 (not yet released)
+* CHANGED: Upgrading libraries to: DOMpurify 3.4.12
+* FIXED: Gracefully handle YOURLS replies with a 200 status code but no shorturl, instead of raising a TypeError
+
+## 2.0.5 (2026-07-11)
+* CHANGED: Show OS-specific copy hotkey hint (Cmd+c on Mac, Ctrl+c on others) (#1506)
+* FIXED: Prevent browsers from rendering unsafe attachments like HTML in a new tab
+* FIXED: State corruption after "Remove attachment" (#1824)
+* FIXED: Copy button is hidden if the document is made as markdown (#1703)
+* FIXED: Shortened URLs from YOURLS received but failed to parse (#1844)
+* FIXED: Insert only base path in JSON API responses, without GET parameters
 
 ## 2.0.4 (2026-05-03)
 * ADDED: Translations for Swedish & Persian

+ 2 - 2
Makefile

@@ -1,7 +1,7 @@
 .PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help
 
-CURRENT_VERSION = 2.0.4
-VERSION ?= 2.0.5
+CURRENT_VERSION = 2.0.5
+VERSION ?= 2.0.6
 VERSION_FILES = README.md SECURITY.md doc/Installation.md js/package.json lib/Controller.php Makefile
 REGEX_CURRENT_VERSION := $(shell echo $(CURRENT_VERSION) | sed "s/\./\\\./g")
 REGEX_VERSION := $(shell echo $(VERSION) | sed "s/\./\\\./g")

+ 1 - 1
README.md

@@ -1,6 +1,6 @@
 # [![PrivateBin](https://raw.githubusercontent.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/)
 
-*Current version: 2.0.4*
+*Current version: 2.0.5*
 
 **PrivateBin** is a minimalist, open source online
 [pastebin](https://en.wikipedia.org/wiki/Pastebin)

+ 8 - 6
SECURITY.md

@@ -4,18 +4,20 @@
 
 | Version | Supported          |
 | ------- | ------------------ |
-| 2.0.4   | :heavy_check_mark: |
-| < 2.0.4 | :x:                |
+| 2.0.5   | :heavy_check_mark: |
+| < 2.0.5 | :x:                |
 
 ## Reporting a Vulnerability
 
-You can send us email at security@privatebin.org. You should be able to get
+We suggest to [use the corresponding GitHub form](https://github.com/PrivateBin/PrivateBin/security/advisories/new)
+to report a new vulnerability directly on GitHub. [It can be handled there](https://docs.github.com/code-security/how-tos/report-and-fix-vulnerabilities/report-privately)
+and all necessary steps like verifying the vulnerability, crediting the finder
+and drafting a security advisory will be done there.
+
+You can also send us email at security@privatebin.org. You should be able to get
 a response within a week (usually during the next weekend). The respondee will
 reply from their personal address and can offer you their GPG public key to
 support end-to-end encrypted communication on sensitive topics or attachments.
 
-You can also [use the corresponding GitHub form](https://github.com/PrivateBin/PrivateBin/security/advisories/new)
-to report a new vulnerability directly on GitHub.
-
 You can also contact us via the regular issue tracker if the risk of early
 publication is low or you would request input from other PrivateBin users.

+ 0 - 20
css/bootstrap/privatebin.css

@@ -143,26 +143,6 @@ html[dir="rtl"] #deletelink, html[dir="rtl"] #qrcodemodalClose {
 	padding-right: 30px;
 }
 
-#prettyMessageCopyBtn {
-	position: absolute;
-	top: 8px;
-	right: 25px;
-	left: auto;
-	padding: 0;
-	background: none;
-	border: none;
-	z-index: 1;
-}
-
-html[dir="rtl"] #prettyMessageCopyBtn {
-	left: 25px;
-	right: auto;
-}
-
-#copySuccessIcon {
-	display: none;
-}
-
 #copyShortcutHint {
 	margin-bottom: 5px;
 }

+ 0 - 28
css/bootstrap5/privatebin.css

@@ -57,34 +57,6 @@ html[dir="rtl"] #deletelink, html[dir="rtl"] #qrcodemodalClose {
 	padding-right: 30px;
 }
 
-#prettyMessageCopyBtn {
-	position: absolute;
-	top: 8px;
-	right: 8px;
-	left: auto;
-	width: 20px;
-	height: 20px;
-	padding: 0;
-	background: none;
-	border: none;
-	z-index: 1;
-}
-
-html[dir="rtl"] #prettyMessageCopyBtn {
-	left: 8px;
-	right: auto;
-}
-
-#prettyMessageCopyBtn svg {
-	width: 100%;
-	height: 100%;
-	vertical-align: baseline;
-}
-
-#copySuccessIcon {
-	display: none;
-}
-
 #sendbutton svg {
 	transform: translateY(1.5px);
 }

+ 1 - 1
doc/Installation.md

@@ -206,7 +206,7 @@ CREATE INDEX parent ON prefix_comment(pasteid);
 CREATE TABLE prefix_config (
     id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
 );
-INSERT INTO prefix_config VALUES('VERSION', '2.0.4');
+INSERT INTO prefix_config VALUES('VERSION', '2.0.5');
 ```
 
 In **PostgreSQL**, the `data`, `attachment`, `nickname` and `vizhash` columns

+ 6 - 3
i18n/ar.json

@@ -151,7 +151,7 @@
     "server error or not responding": "خطأ في الخادم أو لا يستجيب",
     "Could not post comment: %s": "لا يمكن نشر تعليق: %s",
     "Sending document…": "يُرسل لصق…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "لصقك هو <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(اضغط على <kbd>Ctrl</kbd> + <kbd>c</kbd> للنسخ)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "لصقك هو <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(اضغط على <kbd>%s</kbd> + <kbd>c</kbd> للنسخ)</span>",
     "Delete data": "حذف البيانات",
     "Could not create document: %s": "تعذر إنشاء اللصق: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "لا يمكن فك تشفير اللصق: مفتاح فك التشفير مفقود في URL (هل استخدمت معيد توجيه أو أداة تقصير لعناوين URL تزيل جزءًا من عنوان URL؟)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "خطأ في فك ضغط اللصق، متصفحك لا يدعم WebAssembly. الرجاء استخدام متصفح آخر لعرض هذه اللصقة.",
     "Start over": "ابدأ من جديد",
     "Document copied to clipboard": "نُسخ اللصق إلى الحافظة",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "لنسخ اللصق انقر على زر النسخ أو استخدم اختصار الحافظة <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "لنسخ اللصق انقر على زر النسخ أو استخدم اختصار الحافظة <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "نسخ الرابط",
     "Link copied to clipboard": "نُسخ الرابط إلى الحافظة",
     "Document text": "لصق النص",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "مفتاح التبويب يعمل كشخصية (انقر <kbd>Ctrl</kbd>+<kbd>m</kbd> أو <kbd>Esc</kbd> للتبديل)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "السمة"
+    "Theme": "السمة",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/bg.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Грешка в сървъра или не отговаря",
     "Could not post comment: %s": "Публикуването на коментара Ви беше неуспешно: %s",
     "Sending document…": "Изпращане на информацията Ви…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Вашата връзка е <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Натиснете <kbd>Ctrl</kbd>+<kbd>c</kbd> за да копирате)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Вашата връзка е <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Натиснете <kbd>%s</kbd>+<kbd>c</kbd> за да копирате)</span>",
     "Delete data": "Изтриване на информацията",
     "Could not create document: %s": "Създаването на връзката ви беше неуспешно: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Дешифроването на информацията беше неуспешно: Ключа за декриптиране липсва във връзката (Да не сте използвали услуга за пренасочване или скъсяване на връзката, което би изрязало части от нея?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/ca.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "No s'ha pogut publicar el comentari: %s",
     "Sending document…": "Enviant document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Esborrar les dades",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "No es pot desxifrar la nota: falta la clau de desxifrat a l'URL (vau utilitzar un adreçament o un escurçador d'URL que elimina part de l'URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/co.json

@@ -151,7 +151,7 @@
     "server error or not responding": "sbagliu di u servitore o u servitore ùn risponde micca",
     "Could not post comment: %s": "Ùn si pò micca impustà u cummentu : %s",
     "Sending document…": "Inviu di u ducumentu…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "U vostru ducumentu si trova à l’indirizzu <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appughjate nant’à <kbd>Ctrl</kbd>+<kbd>c</kbd> per cupià u liame)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "U vostru ducumentu si trova à l’indirizzu <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appughjate nant’à <kbd>%s</kbd>+<kbd>c</kbd> per cupià u liame)</span>",
     "Delete data": "Squassà i dati",
     "Could not create document: %s": "Ùn si pò micca creà u ducumentu : %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ùn si pò micca dicifrà u ducumentu : A chjave di dicifratura hè assente in l’indirizzu. Averiate impiegatu un orientadore d’indirizzu o un riduttore chì ammuzzeghja una parte di l’indirizzu ?",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Sbagliu durante a scumpressione di u ducumentu, perchè u vostru navigatore ùn accetteghja micca WebAssembly. Ci vole à impiegà un altru navigatore per affissà stu ducumentu.",
     "Start over": "Principià torna",
     "Document copied to clipboard": "U ducumentu hè statu cupiatu in u preme’papei",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Per cupià u ducumentu, appughjate nant’à u buttone di copia o impiegate l’accurtatoghju di tastera <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Per cupià u ducumentu, appughjate nant’à u buttone di copia o impiegate l’accurtatoghju di tastera <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Cupià u liame",
     "Link copied to clipboard": "U liame hè statu cupiatu in u preme’papei",
     "Document text": "Testu di u ducumentu",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "U tastu di tabulazione ghjova cum’è un caratteru (Appughjate nant’à <kbd>Ctrl</kbd>+<kbd>m</kbd> o <kbd>Scapp</kbd> per scambià)",
     "Show password": "Affissà a parolla d’intesa",
     "Hide password": "Piattà a parolla d’intesa",
-    "Theme": "Tema"
+    "Theme": "Tema",
+    "Copy": "Cupià",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/cs.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Chyba na serveru nebo server neodpovídá",
     "Could not post comment: %s": "Nelze odeslat komentář: %s",
     "Sending document…": "Odesílání příspěvku…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Váš příspěvek je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte <kbd>Ctrl</kbd>+<kbd>c</kbd> pro zkopírování)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Váš příspěvek je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte <kbd>%s</kbd>+<kbd>c</kbd> pro zkopírování)</span>",
     "Delete data": "Odstranit data",
     "Could not create document: %s": "Nepodařilo se vytvořit příspěvek: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Nepoužili jste přesměrovač nebo zkracovač URL, který maže části URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Chyba při dekomprimování příspěvku, váš prohlížeč nepodporuje WebAssembly. Pro zobrazení tohoto příspěvku prosím použijte jiný prohlížeč.",
     "Start over": "Začít znovu",
     "Document copied to clipboard": "Dokument zkopírován do schránky",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Pro zkopírování dokumentu klikněte na tlačítko nebo použijte klávesovou zkratku schránky <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Pro zkopírování dokumentu klikněte na tlačítko nebo použijte klávesovou zkratku schránky <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Zkopírovat odkaz",
     "Link copied to clipboard": "Odkaz zkopírován do schránky",
     "Document text": "Text dokumentu",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulátor funguje jako znak (pro přepnutí stiskněte <kbd>Ctrl</kbd>+<kbd>m</kbd> nebo <kbd>Esc</kbd>)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Vzhled"
+    "Theme": "Vzhled",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/de.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Fehler auf dem Server oder keine Antwort vom Server",
     "Could not post comment: %s": "Konnte Kommentar nicht senden: %s",
     "Sending document…": "Sende Document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Dein Dokument ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke <kbd>Strg</kbd>+<kbd>c</kbd> um den Link zu kopieren)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Dein Dokument ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke <kbd>Strg</kbd>+<kbd>c</kbd> um den Link zu kopieren)</span>",
     "Delete data": "Lösche Daten",
     "Could not create document: %s": "Dokument konnte nicht erstellt werden: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Konnte Document nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Fehler beim Dekomprimieren des Dokumentes. Dein Browser unterstützt WebAssembly nicht. Bitte verwende einen anderen Browser, um dieses Dokument anzuzeigen.",
     "Start over": "Neues Dokument erstellen",
     "Document copied to clipboard": "Dokument wurde in Zwischenablage kopiert.",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Zum Kopieren des Textes drücken Sie die Kopieren-Schaltfläche oder verwenden Sie die Tastenkombination <kbd>Strg</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Zum Kopieren des Textes drücken Sie die Kopieren-Schaltfläche oder verwenden Sie die Tastenkombination <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Verknüpfung kopieren",
     "Link copied to clipboard": "Verknüpfung wurde in die Zwischenablage kopiert.",
     "Document text": "Text des Dokuments",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulatortaste als Zeichen interpretieren (Umschalten durch <kbd>Strg</kbd>+<kbd>m</kbd> oder <kbd>Esc</kbd>)",
     "Show password": "Passwort anzeigen",
     "Hide password": "Passwort verbergen",
-    "Theme": "Design"
+    "Theme": "Design",
+    "Copy": "Kopieren",
+    "Cmd": "Cmd",
+    "Ctrl": "Strg"
 }

+ 6 - 3
i18n/el.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Πρόβλημα του διακομιστή ή δεν υπάρχει απάντηση",
     "Could not post comment: %s": "Δεν ήταν δυνατή η δημοσίευση του σχολίου: %s",
     "Sending document…": "Η επικόλληση αποστέλλεται…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Η επικόλλησή σας είναι <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Πληκτρολογήστε <kbd>Ctrl</kbd>+<kbd>c</kbd> για αντιγραφή)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Η επικόλλησή σας είναι <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Πληκτρολογήστε <kbd>%s</kbd>+<kbd>c</kbd> για αντιγραφή)</span>",
     "Delete data": "Διαγραφή δεδομένων",
     "Could not create document: %s": "Δεν ήταν δυνατή η δημιουργία επικόλλησης: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Δεν ήταν δυνατή η αποκρυπτογράφηση της επικόλλησης: Το κλειδί αποκρυπτογράφησης λείπει από τον σύνδεσμο (Μήπως χρησιμοποιήσατε ανακατεύθυνση συνδέσμου ή υπηρεσία συντόμευσης συνδέσμου;)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Σφάλμα αποσυμπίεσης της επικόλλησης, ο περιηγητής σας δεν υποστηρίζει WebAssembly. Παρακαλούμε χρησιμοποιήστε έναν άλλο περιηγητή για να δείτε αυτή την επικόλληση.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/en.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "Sending document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Delete data",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/es.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Error del servidor o el servidor no responde",
     "Could not post comment: %s": "No fue posible publicar comentario: %s",
     "Sending document…": "Enviando documento…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione <kbd>Ctrl</kbd>+<kbd>c</kbd> para copiar)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione <kbd>%s</kbd>+<kbd>c</kbd> para copiar)</span>",
     "Delete data": "Eliminar datos",
     "Could not create document: %s": "No fue posible crear el archivo: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "No es posible descifrar el documento: Falta la clave de descifrado en la URL (¿Utilizó un redirector o un acortador de URL que quite parte de la URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error al descomprimir el documento. Su navegador no es compatible con WebAssembly. Utilice otro navegador para ver este documento.",
     "Start over": "Empezar de nuevo",
     "Document copied to clipboard": "Documento copiado al portapapeles",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Para copiar el documento presione el botón copiar o use el atajo del portapapeles <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Para copiar el documento presione el botón copiar o use el atajo del portapapeles <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copiar enlace",
     "Link copied to clipboard": "Enlace copiado al portapapeles",
     "Document text": "Texto del documento",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "La tecla de tabulación funciona como carácter (presione <kbd>Ctrl</kbd>+<kbd>m</kbd> o <kbd>Esc</kbd> para alternar)",
     "Show password": "Mostrar contraseña",
     "Hide password": "Ocultar contraseña",
-    "Theme": "Tema"
+    "Theme": "Tema",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/et.json

@@ -151,7 +151,7 @@
     "server error or not responding": "serveri viga või ei vasta",
     "Could not post comment: %s": "Ei suutnud kommentaari postitada: %s",
     "Sending document…": "Kleepe saatmine…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Sinu kleebe on <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Kopeerimiseks vajuta <kbd>Ctrl</kbd>+<kbd>c</kbd>)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Sinu kleebe on <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Kopeerimiseks vajuta <kbd>%s</kbd>+<kbd>c</kbd>)</span>",
     "Delete data": "Kustuta andmed",
     "Could not create document: %s": "Ei suutnud kleebet luua: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ei suutnud kleebet dekrüpteerida: Dekrüpteerimisvõti on URL-ist puudu (Kas kasutasid ümbersuunajat või URL-i lühendajat, mis eemaldab osa URL-ist?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Alusta uuesti",
     "Document copied to clipboard": "Kleebe kopeeriti lõikelauale",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopeeri link",
     "Link copied to clipboard": "Link kopeeriti lõikelauale",
     "Document text": "Kleebi tekst",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Teema"
+    "Theme": "Teema",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/fa.json

@@ -151,7 +151,7 @@
     "server error or not responding": "خطای سرور یا عدم پاسخ‌دهی",
     "Could not post comment: %s": "ارسال نظر ممکن نیست: %s",
     "Sending document…": "در حال ارسال سند…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "سند شما <a id=\"pasteurl\" href=\"%s\">%s</a> است <span id=\"copyhint\">(برای کپی‌کردن <kbd>Ctrl</kbd>+<kbd>c</kbd> را فشار دهید)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "سند شما <a id=\"pasteurl\" href=\"%s\">%s</a> است <span id=\"copyhint\">(برای کپی‌کردن <kbd>%s</kbd>+<kbd>c</kbd> را فشار دهید)</span>",
     "Delete data": "حذف داده‌ها",
     "Could not create document: %s": "ایجاد سند ممکن نیست: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "رمزگشایی سند ممکن نیست: کلید رمزگشایی در URL موجود نیست (آیا از ریدایرکت یا کوتاه‌کنندهٔ URL استفاده کرده‌اید که بخشی از URL را حذف می‌کند؟)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "خطا در رفع فشرده‌سازی سند، مرورگر شما از WebAssembly پشتیبانی نمی‌کند. لطفاً برای مشاهدهٔ این سند از مرورگر دیگری استفاده کنید.",
     "Start over": "شروع دوباره",
     "Document copied to clipboard": "سند در کلیپ‌بورد کپی شد",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "برای کپی‌کردن سند، دکمهٔ کپی را فشار دهید یا از میانبر کلیپ‌بورد <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd> استفاده کنید",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "برای کپی‌کردن سند، دکمهٔ کپی را فشار دهید یا از میانبر کلیپ‌بورد <kbd>%s</kbd>+<kbd>c</kbd> استفاده کنید",
     "Copy link": "کپی لینک",
     "Link copied to clipboard": "لینک در کلیپ‌بورد کپی شد",
     "Document text": "متن سند",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "کلید Tab به‌عنوان کاراکتر عمل می‌کند (برای تغییر وضعیت <kbd>Ctrl</kbd>+<kbd>m</kbd> یا <kbd>Esc</kbd> را فشار دهید)",
     "Show password": "نمایش رمز عبور",
     "Hide password": "مخفی‌کردن رمز عبور",
-    "Theme": "تم"
+    "Theme": "تم",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/fi.json

@@ -151,7 +151,7 @@
     "server error or not responding": "palvelinvirhe tai palvelin ei vastaa",
     "Could not post comment: %s": "Kommenttia ei voitu lähettää: %s",
     "Sending document…": "Lähetetään pastea…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Pastesi on <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Paina <kbd>Ctrl</kbd>+<kbd>c</kbd> kopioidaksesi)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Pastesi on <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Paina <kbd>%s</kbd>+<kbd>c</kbd> kopioidaksesi)</span>",
     "Delete data": "Poista data",
     "Could not create document: %s": "Pastea ei voitu luoda: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Pastea ei voitu purkaa: Purkausavain puuttuu URL:stä (Käytitkö uudelleenohjaajaa tai URL-lyhentäjää joka poistaa osan URL:stä?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Virhe pasten purkamisessa, selaimesi ei tue WebAssemblyä. Ole hyvä ja käytä toista selainta nähdäksesi tämä asiakirja.",
     "Start over": "Aloita alusta",
     "Document copied to clipboard": "Asiakirja kopioitu leikepöydälle",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Voit kopioida pasten painamalla kopioi-painiketta tai käyttämällä leikepöydän oikotietä <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Voit kopioida pasten painamalla kopioi-painiketta tai käyttämällä leikepöydän oikotietä <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopioi linkki",
     "Link copied to clipboard": "Linkki kopioitu leikepöydälle",
     "Document text": "Liitä teksti",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulaattori toimii merkkinä (Paina <kbd>Ctrl</kbd>+<kbd>m</kbd> tai <kbd>Esc</kbd> vaihtaaksesi)",
     "Show password": "Näytä salasana",
     "Hide password": "Piilota salasana",
-    "Theme": "Teema"
+    "Theme": "Teema",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/fr.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Le serveur ne répond pas ou a rencontré une erreur",
     "Could not post comment: %s": "Impossible de poster le commentaire : %s",
     "Sending document…": "Envoi du document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Votre document est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd> pour copier)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Votre document est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur <kbd>%s</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd> pour copier)</span>",
     "Delete data": "Supprimer les données du document",
     "Could not create document: %s": "Impossible de créer le document : %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Impossible de déchiffrer le document : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Erreur lors de la décompression du document, votre navigateur ne supporte pas WebAssembly. Veuillez utiliser un autre navigateur pour voir ce document.",
     "Start over": "Recommencer",
     "Document copied to clipboard": "Document copié dans le presse-papier",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Pour copier appuyer sur le bouton Copier le lien ou utiliser le raccourci <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Pour copier appuyer sur le bouton Copier le lien ou utiliser le raccourci <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copier le lien",
     "Link copied to clipboard": "Lien copié dans le presse-papier",
     "Document text": "Texte du document",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "La touche de tabulation sert de caractère (Presser <kbd>Ctrl</kbd>+<kbd>m</kbd> ou <kbd>Esc</kbd> pour basculer)",
     "Show password": "Afficher le mot de passe",
     "Hide password": "Cacher le mot de passe",
-    "Theme": "Thème"
+    "Theme": "Thème",
+    "Copy": "Copier",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 16 - 13
i18n/he.json

@@ -151,19 +151,19 @@
     "server error or not responding": "שגיאת שרת או שהשרת לא מגיב",
     "Could not post comment: %s": "לא ניתן לפרסם תגובה: %s",
     "Sending document…": "ההדבקה נשלחת…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "ההדבקה שלך היא <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(יש ללחוץ <kbd>Ctrl</kbd>+<kbd>c</kbd> כדי להעתיק)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "ההדבקה שלך היא <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(יש ללחוץ <kbd>%s</kbd>+<kbd>c</kbd> כדי להעתיק)</span>",
     "Delete data": "מחיקת נתונים",
     "Could not create document: %s": "לא ניתן ליצור הדבקה: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "לא ניתן לפענח הדבקה: מפתח הפענוח חסר בכתובת (השתמשת במערכת הפנייה או מקצר כתובות שחותכים חלק מהכתובת?)",
     "B": "ב׳",
-    "kB": "kB",
-    "MB": "MB",
-    "GB": "GB",
-    "TB": "TB",
-    "PB": "PB",
-    "EB": "EB",
-    "ZB": "ZB",
-    "YB": "YB",
+    "kB": "ק\"ב",
+    "MB": "מ\"ב",
+    "GB": "ג\"ב",
+    "TB": "ט\"ב",
+    "PB": "פ\"ב",
+    "EB": "א\"ב",
+    "ZB": "ז\"ב",
+    "YB": "י\"ב",
     "Format": "פורמט",
     "Plain Text": "טקסט פשוט",
     "Source Code": "קוד מקור",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "שגיאה בהפקת ההדבקה, הדפדפן שלך לא תומך ב-WebAssembly. אנא השתמש בדפדפן אחר כדי לצפות בהדבקה זו.",
     "Start over": "להתחיל מחדש",
     "Document copied to clipboard": "ההדבקה הועתקה ללוח",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "על מנת להעתיק את ההדבקה, לחץ על כפתור ההעתקה או השתמש בקיצור הדרך ללוח <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "על מנת להעתיק את ההדבקה, לחץ על כפתור ההעתקה או השתמש בקיצור הדרך ללוח <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "העתק קישור",
     "Link copied to clipboard": "הקישור הועתק ללוח",
     "Document text": "הדבק טקסט",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "משטח ה-tab פועל כמקש תו (לחץ על <kbd>Ctrl</kbd>+<kbd>m</kbd> או <kbd>Esc</kbd> להחלפה)",
-    "Show password": "Show password",
-    "Hide password": "Hide password",
-    "Theme": "נושא"
+    "Show password": "הצג סיסמה",
+    "Hide password": "הסתר סיסמה",
+    "Theme": "נושא",
+    "Copy": "העתק",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/hi.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "Sending document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Delete data",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/hu.json

@@ -151,7 +151,7 @@
     "server error or not responding": "A szerveren hiba lépett fel vagy nem válaszol.",
     "Could not post comment: %s": "Nem tudtuk beküldeni a hozzászólást: %s",
     "Sending document…": "Bejegyzés elküldése...",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "A bejegyzésed a <a id=\"pasteurl\" href=\"%s\">%s</a> címen elérhető. <span id=\"copyhint\"> <kbd>Ctrl</kbd>+<kbd>c</kbd>-vel tudod vágólapra másolni.</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "A bejegyzésed a <a id=\"pasteurl\" href=\"%s\">%s</a> címen elérhető. <span id=\"copyhint\"> <kbd>%s</kbd>+<kbd>c</kbd>-vel tudod vágólapra másolni.</span>",
     "Delete data": "Adat törlése",
     "Could not create document: %s": "Nem tudtuk létrehozni a bejegyzést: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nem tudjuk visszafejteni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál, amely azt kivágta belőle?",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Újrakezdés",
     "Document copied to clipboard": "Bejegyzés másolva",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Másoláshoz használd a <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd> billentyűkombinációt",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Másoláshoz használd a <kbd>%s</kbd>+<kbd>c</kbd> billentyűkombinációt",
     "Copy link": "Link másolása",
     "Link copied to clipboard": "Link másolva",
     "Document text": "Bejegyzés szövege",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "A tabulátor karakternek használható (nyomd le a <kbd>Ctrl</kbd>+<kbd>m</kbd> vagy az <kbd>Esc</kbd> to billentyűket ennek megszüntetéséhez).",
     "Show password": "Jelszó megjelenítése",
     "Hide password": "Jelszó elrejtése",
-    "Theme": "Téma"
+    "Theme": "Téma",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/id.json

@@ -151,7 +151,7 @@
     "server error or not responding": "kesalahan server atau server tidak merespon",
     "Could not post comment: %s": "Tidak dapat memposting komentar: %s",
     "Sending document…": "Mengirim document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Document Anda adalah <a id=\"pasteurl\" href=\"%s\">%s</a><span id=\"copyhint\">(Tekan <kbd>Ctrl</kbd>+<kbd>c</kbd> untuk menyalin)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Document Anda adalah <a id=\"pasteurl\" href=\"%s\">%s</a><span id=\"copyhint\">(Tekan <kbd>%s</kbd>+<kbd>c</kbd> untuk menyalin)</span>",
     "Delete data": "Hapus data",
     "Could not create document: %s": "Tidak dapat membuat document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Tidak dapat mendekripsi document: Kunci dekripsi tidak ada di URL (Apakah Anda menggunakan redirector atau penyingkat URL yang menghapus bagian dari URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/it.json

@@ -151,7 +151,7 @@
     "server error or not responding": "errore o mancata risposta dal server",
     "Could not post comment: %s": "Impossibile inviare il commento: %s",
     "Sending document…": "Messaggio in fase di invio…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Premi <kbd>Ctrl</kbd>+<kbd>c</kbd> (Windows) o [Cmd]+[c] (Mac) per copiare il link)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Premi <kbd>%s</kbd>+<kbd>c</kbd> (Windows) o [Cmd]+[c] (Mac) per copiare il link)</span>",
     "Delete data": "Cancella i dati",
     "Could not create document: %s": "Non riesco a creare il messaggio: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Errore nella decompressione dell messaggio, il tuo browser non supporta WebAssembly. Utilizza un altro browser per visualizzare questo messaggio.",
     "Start over": "Ricominciare",
     "Document copied to clipboard": "Messaggio copiato",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Per copiare il documento premere sul pulsante di copia o utilizzare la scorciatoia <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Per copiare il documento premere sul pulsante di copia o utilizzare la scorciatoia <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copia il link",
     "Link copied to clipboard": "Link copiato negli appunti",
     "Document text": "Testo del messaggio",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Il tasto Tabulatore serve come carattere (basta <kbd>Ctrl</kbd>+<kbd>m</kbd> o <kbd>Esc</kbd> per attivare/disattivare)",
     "Show password": "Mostra password",
     "Hide password": "Nascondi password",
-    "Theme": "Tema"
+    "Theme": "Tema",
+    "Copy": "Copiare",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/ja.json

@@ -151,7 +151,7 @@
     "server error or not responding": "サーバーエラーまたは応答しません",
     "Could not post comment: %s": "コメントを投稿できませんでした:%s",
     "Sending document…": "ペーストを送信しています…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "ペーストは<a id=\"pasteurl\" href=\"%s\">%s</a>です<span id=\"copyhint\">(コピーするには<kbd>Ctrl</kbd>+<kbd>c</kbd>を押してください)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "ペーストは<a id=\"pasteurl\" href=\"%s\">%s</a>です<span id=\"copyhint\">(コピーするには<kbd>%s</kbd>+<kbd>c</kbd>を押してください)</span>",
     "Delete data": "データを削除",
     "Could not create document: %s": "ペーストを作成できませんでした:%s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "ペーストを復号化できません:復号化キーがURLにありません(URLの一部を削除するリダイレクト機能またはURLの短縮アプリケーションを使いましたか?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/jbo.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "ca'o benji le papri…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "vimcu loi datni",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "sorcu fukpi le urli",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "se dokcu",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "jvinu"
+    "Theme": "jvinu",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/ko.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "Sending document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Delete data",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/ku.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "Sending document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Delete data",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/la.json

@@ -151,7 +151,7 @@
     "server error or not responding": "server error or not responding",
     "Could not post comment: %s": "Could not post comment: %s",
     "Sending document…": "Sending document…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>",
     "Delete data": "Delete data",
     "Could not create document: %s": "Could not create document: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/lt.json

@@ -151,7 +151,7 @@
     "server error or not responding": "serverio klaida arba jis neatsako",
     "Could not post comment: %s": "Nepavyko paskelbti komentaro: %s",
     "Sending document…": "Siunčiamas dokumentas…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Jūsų dokumentas yra <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Paspauskite <kbd>Ctrl</kbd>+<kbd>c</kbd> norėdami nukopijuoti)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Jūsų dokumentas yra <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Paspauskite <kbd>%s</kbd>+<kbd>c</kbd> norėdami nukopijuoti)</span>",
     "Delete data": "Ištrinti duomenis",
     "Could not create document: %s": "Nepavyko sukurti dokumento: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nepavyksta iššifruoti dokumento: URL adrese trūksta iššifravimo rakto (Ar naudojote peradresavimo ar URL trumpinimo įrankį, kuris pašalina URL dalį?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Klaida išglaudinant dokumentą, jūsų naršyklė nepalaiko „WebAssembly“. Norėdami peržiūrėti šį dokumentą, naudokite kitą naršyklę.",
     "Start over": "Pradėti iš naujo",
     "Document copied to clipboard": "Dokumentas nukopijuotas į iškarpinę",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Norėdami nukopijuoti dokumentą paspauskite kopijavimo mygtuką arba naudokite iškarpinės sparčiuosius klavišus <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Norėdami nukopijuoti dokumentą paspauskite kopijavimo mygtuką arba naudokite iškarpinės sparčiuosius klavišus <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopijuoti nuorodą",
     "Link copied to clipboard": "Nuoroda nukopijuota į iškarpinę",
     "Document text": "Dokumento tekstas",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabuliatoriaus klavišas tarnauja kaip simbolis (Paspauskite <kbd>Ctrl</kbd>+<kbd>m</kbd> arba <kbd>Esc</kbd> norėdami perjungti)",
     "Show password": "Rodyti slaptažodį",
     "Hide password": "Slėpti slaptažodį",
-    "Theme": "Apipavidalinimas"
+    "Theme": "Apipavidalinimas",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/nl.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Serverfout of server reageert niet",
     "Could not post comment: %s": "Kon het commentaar niet plaatsen: %s",
     "Sending document…": "Document verzenden…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Je document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk <kbd>Ctrl</kbd>+<kbd>c</kbd> om te kopiëren)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Je document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk <kbd>%s</kbd>+<kbd>c</kbd> om te kopiëren)</span>",
     "Delete data": "Gegevens wissen",
     "Could not create document: %s": "Kon het document niet aanmaken: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon het document niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een doorverwijzer of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Fout bij het decomprimeren van het document, uw browser ondersteunt WebAssembly niet. Gebruik een andere browser om dit document te bekijken.",
     "Start over": "Opnieuw beginnen",
     "Document copied to clipboard": "Document gekopieerd naar klembord",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Om te kopiëren en plakken druk je op de knop Kopiëren of gebruik je de sneltoets op het klembord <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Om te kopiëren en plakken druk je op de knop Kopiëren of gebruik je de sneltoets op het klembord <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopieer link",
     "Link copied to clipboard": "Link gekopieerd naar klembord",
     "Document text": "Tekst plakken",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulatortoets dient als teken (gebruik <kbd>Ctrl</kbd>+<kbd>m</kbd> of <kbd>Esc</kbd> om te schakelen)",
     "Show password": "Toon wachtwoord",
     "Hide password": "Verberg wachtwoord",
-    "Theme": "Thema"
+    "Theme": "Thema",
+    "Copy": "Kopieëren",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/no.json

@@ -151,7 +151,7 @@
     "server error or not responding": "tjener feilet eller svarer ikke",
     "Could not post comment: %s": "Kunne ikke sende kommentar: %s",
     "Sending document…": "Sender innlegg…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk <kbd>Ctrl</kbd>+<kbd>c</kbd> for å kopiere)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk <kbd>%s</kbd>+<kbd>c</kbd> for å kopiere)</span>",
     "Delete data": "Slett data",
     "Could not create document: %s": "Kunne ikke opprette innlegg: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kan ikke dekryptere innlegg: Dekrypteringsnøkkelen mangler i adressen (Har du bruket en redirector eller en URL forkorter som fjerner en del av addressen?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/oc.json

@@ -151,7 +151,7 @@
     "server error or not responding": "lo servidor respond pas o a rescontrat una error",
     "Could not post comment: %s": "Impossible de mandar lo comentari : %s",
     "Sending document…": "Mandadís del tèxte…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Vòstre tèxte es disponible a l’adreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus <kbd>Ctrl</kbd>+<kbd>c</kbd> per copiar)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Vòstre tèxte es disponible a l’adreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus <kbd>%s</kbd>+<kbd>c</kbd> per copiar)</span>",
     "Delete data": "Supprimir las donadas del tèxte",
     "Could not create document: %s": "Impossible de crear lo tèxte : %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Impossible de deschifrar lo tèxte : clau de deschiframent absenta de l’URL (Avètz utilizat un redirector o un site de reduccion d’URL que suprimís una partida de l’URL ?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error al moment de descompresar l'empegatge, vòstre navegador pren pas en carga WebAssembly. Mercés d'utilizar un autre navigador per visualizar aquesta pega.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/pl.json

@@ -151,7 +151,7 @@
     "server error or not responding": "błąd serwera lub brak odpowiedzi",
     "Could not post comment: %s": "Nie udało się wysłać komentarza: %s",
     "Sending document…": "Wysyłanie dokumentu…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Twój dokument: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Użyj <kbd>Ctrl</kbd>+<kbd>c</kbd>, aby skopiować)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Twój dokument: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Użyj <kbd>%s</kbd>+<kbd>c</kbd>, aby skopiować)</span>",
     "Delete data": "Usuń dane",
     "Could not create document: %s": "Nie można utworzyć dokumentu: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nie można odszyfrować dokumentu — brakuje klucza deszyfrującego w adresie URL (czy użyto przekierowania lub skracacza adresów, który usuwa część linku?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Błąd dekompresji dokumentu — Twoja przeglądarka nie obsługuje WebAssembly. Użyj innej przeglądarki, aby go otworzyć.",
     "Start over": "Zacznij od nowa",
     "Document copied to clipboard": "Dokument skopiowany do schowka",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Aby skopiować dokument, kliknij przycisk kopiowania lub użyj skrótu <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Aby skopiować dokument, kliknij przycisk kopiowania lub użyj skrótu <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopiuj link",
     "Link copied to clipboard": "Link skopiowany do schowka",
     "Document text": "Treść dokumentu",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Klawisz Tabulatora służy jako znak (użyj <kbd>Ctrl</kbd>+<kbd>m</kbd> lub <kbd>Esc</kbd>, aby przełączyć tryb)",
     "Show password": "Pokaż hasło",
     "Hide password": "Ukryj hasło",
-    "Theme": "Motyw"
+    "Theme": "Motyw",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/pt.json

@@ -151,7 +151,7 @@
     "server error or not responding": "Servidor em erro ou não responsivo",
     "Could not post comment: %s": "Não foi possível publicar o comentário: %s",
     "Sending document…": "Enviando cópia…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Sua cópia é <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pressione <kbd>Ctrl</kbd>+<kbd>c</kbd> para copiar)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Sua cópia é <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pressione <kbd>%s</kbd>+<kbd>c</kbd> para copiar)</span>",
     "Delete data": "Excluir dados",
     "Could not create document: %s": "Não foi possível criar cópia: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/ro.json

@@ -151,7 +151,7 @@
     "server error or not responding": "eroare de server sau nu răspunde",
     "Could not post comment: %s": "Nu s-a putut posta comentariul: %s",
     "Sending document…": "Se trimite document-ul…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Document-ul dvs. este <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Apăsați <kbd>Ctrl</kbd>+<kbd>c</kbd> pentru a copia)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Document-ul dvs. este <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Apăsați <kbd>%s</kbd>+<kbd>c</kbd> pentru a copia)</span>",
     "Delete data": "Ștergeți datele",
     "Could not create document: %s": "Nu s-a putut crea document-ul: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nu s-a putut decripta document-ul: Cheia de decriptare lipsește din URL (Ați folosit un redirector sau un scurtător de URL care a tăiat o parte din URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Eroare la deschiderea document-ului, browserul dvs. nu acceptă WebAssembly. Vă rugăm să utilizați un alt browser pentru a vedea acest document.",
     "Start over": "Start over",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 20 - 17
i18n/ru.json

@@ -3,7 +3,7 @@
     "%s is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются %sв браузере%s с использованием 256 битного шифрования AES.",
     "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Подробнее можно узнать на <a href=\"https://privatebin.info/\">сайте проекта</a>.",
     "Because ignorance is bliss": "Потому что неведение - благо",
-    "Document does not exist, has expired or has been deleted.": "Запись не существует, просрочена или была удалена.",
+    "Document does not exist, has expired or has been deleted.": "Документ не существует, его срок действия истек или он был удален.",
     "%s requires php %s or above to work. Sorry.": "Для работы %s требуется php %s или выше. Извините.",
     "%s requires configuration section [%s] to be present in configuration file.": "%s необходимо наличие секции [%s] в конфигурационном файле.",
     "Please wait %d seconds between each post.": [
@@ -14,13 +14,13 @@
         "Пожалуйста, ожидайте %d секунд между каждыми записями.",
         "Пожалуйста, ожидайте %d секунд между каждыми записями."
     ],
-    "Document is limited to %s of encrypted data.": "Размер записи ограничен %s зашифрованных данных.",
+    "Document is limited to %s of encrypted data.": "Размер документа ограничен %s зашифрованных данных.",
     "Invalid data.": "Неверные данные.",
     "You are unlucky. Try again.": "Вам не повезло. Попробуйте еще раз.",
     "Error saving comment. Sorry.": "Ошибка при сохранении комментария. Извините.",
-    "Error saving document. Sorry.": "Ошибка при сохранении записи. Извините.",
-    "Invalid document ID.": "Неверный ID записи.",
-    "Document is not of burn-after-reading type.": "Тип записи не \"Удалить после прочтения\".",
+    "Error saving document. Sorry.": "Ошибка сохранения документа. Извините.",
+    "Invalid document ID.": "Неверный ID документа.",
+    "Document is not of burn-after-reading type.": "Документ не относится к типу \"Удалить после прочтения\".",
     "Wrong deletion token. Document was not deleted.": "Неверный ключ удаления записи. Запись не удалена.",
     "Document was properly deleted.": "Запись была успешно удалена.",
     "JavaScript is required for %s to work. Sorry for the inconvenience.": "Для работы %s требуется включенный JavaScript. Приносим извинения за неудобства.",
@@ -151,7 +151,7 @@
     "server error or not responding": "ошибка сервера или нет ответа",
     "Could not post comment: %s": "Не удалось опубликовать комментарий: %s",
     "Sending document…": "Отправка записи…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите <kbd>Ctrl</kbd>+<kbd>c</kbd>, чтобы скопировать ссылку)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите <kbd>%s</kbd>+<kbd>c</kbd>, чтобы скопировать ссылку)</span>",
     "Delete data": "Удалить запись",
     "Could not create document: %s": "Не удалось опубликовать запись: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть, вы используете сокращатель ссылок, который удаляет часть ссылки?)",
@@ -210,26 +210,29 @@
     "Encrypted note on %s": "Зашифрованная запись на %s",
     "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Посетите эту ссылку чтобы просмотреть запись. Передача ссылки кому либо позволит им получить доступ к записи тоже.",
     "URL shortener may expose your decrypt key in URL.": "Сервис сокращения ссылок может получить ваш ключ расшифровки из ссылки.",
-    "URL shortener is enabled by default.": "URL shortener is enabled by default.",
+    "URL shortener is enabled by default.": "Сокращатель URL-адресов включен по умолчанию.",
     "Save document": "Сохранить запись",
     "Your IP is not authorized to create documents.": "Вашему IP адресу не разрешено создавать записи.",
     "Trying to shorten a URL that isn't pointing at our instance.": "Попытка сократить URL, который указывает не на наш сервер.",
     "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Ошибка обращения к YOURLS. Возможно в конфигурации допущена ошибка, например неверный или отсутствующий параметр \"apiurl\" или \"signature\".",
     "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Ошибка разбора ответа от YOURLS.",
-    "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.",
+    "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Ошибка прокси: неверный ответ. Это может быть проблемой конфигурации, например из-за неверных или отсутствующих ключей, либо временным сбоем.",
     "This secret message can only be displayed once. Would you like to see it now?": "Записи, удаляемые после прочтения, могут быть отображены после загрузки только один раз. Вы хотите открыть её сейчас?",
     "Yes, see it": "Да, загрузить",
     "Dark Mode": "Тёмная",
-    "Error compressing document, due to missing WebAssembly support.": "Error compressing document, due to missing WebAssembly support.",
-    "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
-    "Start over": "Start over",
+    "Error compressing document, due to missing WebAssembly support.": "Ошибка сжатия документа из-за отсутствия поддержки WebAssembly.",
+    "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Ошибка распаковки документа, ваш браузер не поддерживает WebAssembly. Пожалуйста, используйте другой браузер для просмотра этого документа.",
+    "Start over": "Начать заново",
     "Document copied to clipboard": "Запись скопирована в буфер обмена",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Чтобы скопировать запись нажмите на кнопку копирования или используйте комбинацию клавиш <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Чтобы скопировать запись нажмите на кнопку копирования или используйте комбинацию клавиш <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Скопировать ссылку",
     "Link copied to clipboard": "Ссылка скопирована в буфер обмена",
-    "Document text": "Document text",
-    "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
-    "Show password": "Show password",
-    "Hide password": "Hide password",
-    "Theme": "Тема"
+    "Document text": "Текст документа",
+    "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Клавиша Tab работает как символ (Нажмите <kbd>Ctrl</kbd>+<kbd>M</kbd> или <kbd>Esc</kbd> для переключения)",
+    "Show password": "Показать пароль",
+    "Hide password": "Скрыть пароль",
+    "Theme": "Тема",
+    "Copy": "Скопировать",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/sk.json

@@ -151,7 +151,7 @@
     "server error or not responding": "chyba servera alebo server neodpovedá",
     "Could not post comment: %s": "Nepodarilo sa pridať komentár: %s",
     "Sending document…": "Odosiela sa príspevok…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Váš príspevok je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(skopírujte stlačením <kbd>Ctrl</kbd>+<kbd>c</kbd>)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Váš príspevok je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(skopírujte stlačením <kbd>%s</kbd>+<kbd>c</kbd>)</span>",
     "Delete data": "Odstrániť dáta",
     "Could not create document: %s": "Nepodarilo sa vytvoriť príspevok: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nie je možné dešifrovať príspevok: V URL adrese chýba dešifrovací kľúč (Použili ste presmerovač alebo skracovač adresy, ktorý odstráni časť adresy URL?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.",
     "Start over": "Začať odznova",
     "Document copied to clipboard": "Kópia vložená do schránky",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopírovať odkaz",
     "Link copied to clipboard": "Odkaz vložený do schránky",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/sl.json

@@ -151,7 +151,7 @@
     "server error or not responding": "napaka na strežniku, ali pa se strežnik ne odziva",
     "Could not post comment: %s": "Komentarja ni bilo mogoče objaviti : %s",
     "Sending document…": "Pošiljam prilepek…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni <kbd>Ctrl</kbd>+<kbd>c</kbd> ali [Cmd] + [c] in skopiraj)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni <kbd>%s</kbd>+<kbd>c</kbd> ali [Cmd] + [c] in skopiraj)</span>",
     "Delete data": "Izbriši podatke",
     "Could not create document: %s": "Ne morem ustvariti prilepka: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Prilepka ni mogoče odkodirati: v URL-ju manjka ključ. Ali je bil uporabljen krajšalnik URL-jev, ki odstrani del URL-ja?",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Napaka pri razpakiranju dokumenta, vaš brskalnik ne podpira WebAssembly. Za ogled tega dokumenta uporabite drug brskalnik.",
     "Start over": "Začni znova",
     "Document copied to clipboard": "Dokument kopiran v odložišče",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Za kopiranje dokumenta pritisnite gumb za kopiranje ali uporabite bližnjico odložišča <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Za kopiranje dokumenta pritisnite gumb za kopiranje ali uporabite bližnjico odložišča <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopiraj povezavo",
     "Link copied to clipboard": "Povezava kopirana v odložišče",
     "Document text": "Besedilo dokumenta",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulatorska tipka služi kot znak (za preklop pritisnite <kbd>Ctrl</kbd>+<kbd>m</kbd> ali <kbd>Esc</kbd>)",
     "Show password": "Pokaži geslo",
     "Hide password": "Skrij geslo",
-    "Theme": "Tema"
+    "Theme": "Tema",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/sv.json

@@ -151,7 +151,7 @@
     "server error or not responding": "serverfel eller inget svar",
     "Could not post comment: %s": "Kunde inte publicera kommentar: %s",
     "Sending document…": "Skickar dokument…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Ditt dokument är <a id=\\\"pasteurl\\\" href=\\\"%s\\\">%s</a> <span id=\\\"copyhint\\\">(Tryck <kbd>Ctrl</kbd>+<kbd>c</kbd> för att kopiera)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Ditt dokument är <a id=\\\"pasteurl\\\" href=\\\"%s\\\">%s</a> <span id=\\\"copyhint\\\">(Tryck <kbd>%s</kbd>+<kbd>c</kbd> för att kopiera)</span>",
     "Delete data": "Radera data",
     "Could not create document: %s": "Kunde inte skapa dokument: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kan inte dekryptera dokument: Dekrypteringsnyckel saknas i URL:en (använde du en omdirigerare eller URL-förkortare som tar bort delar av URL:en?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Fel vid dekomprimering av dokumentet, din webbläsare stöder inte WebAssembly. Använd en annan webbläsare för att visa detta dokument.",
     "Start over": "Börja om",
     "Document copied to clipboard": "Dokument kopierat till urklipp",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "För att kopiera dokumentet, klicka på kopieringsknappen eller använd kortkommandot <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "För att kopiera dokumentet, klicka på kopieringsknappen eller använd kortkommandot <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Kopiera länk",
     "Link copied to clipboard": "Länk kopierad till urklipp",
     "Document text": "Dokumenttext",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabb-tangenten fungerar som tecken (Tryck <kbd>Ctrl</kbd>+<kbd>m</kbd> eller <kbd>Esc</kbd> för att växla)",
     "Show password": "Visa lösenord",
     "Hide password": "Dölj lösenord",
-    "Theme": "Tema"
+    "Theme": "Tema",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/th.json

@@ -151,7 +151,7 @@
     "server error or not responding": "เซิร์ฟเวอร์มีข้อผิดพลาดหรือไม่ตอบสนอง",
     "Could not post comment: %s": "ไม่สามารถส่งความคิดเห็นได้: %s",
     "Sending document…": "กำลังส่งข้อมูล…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "การฝากโค้ดของคุณอยู่ที่ <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(กดปุ่ม <kbd>Ctrl</kbd>+<kbd>c</kbd> เพื่อคัดลอก)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "การฝากโค้ดของคุณอยู่ที่ <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(กดปุ่ม <kbd>%s</kbd>+<kbd>c</kbd> เพื่อคัดลอก)</span>",
     "Delete data": "ลบข้อมูล",
     "Could not create document: %s": "ไม่สามารถสร้างข้อมูลการฝากโค้ดได้: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "ไม่สามารถถอดรหัสข้อมูลการฝากโค้ดได้: คีย์ถอดรหัสที่อยู่ใน URL หายไป (คุณได้ใช้ตัวเปลี่ยนเส้นทางหรือตัวย่อ URL ที่มีการตัดส่วนของ URL ออกหรือไม่)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "ไม่สามารถอ่านข้อมูลที่คุณได้ฝากโค้ดไว้ เบราว์เซอร์ของคุณไม่รองรับ WebAssembly กรุณาลองเปลี่ยนใช้เบราว์เซอร์ตัวอื่นเพื่อดูการฝากโค้ดนี้อีกครั้ง",
     "Start over": "เริ่มใหม่",
     "Document copied to clipboard": "คัดลอกการฝากโค้ดไปที่คลิปบอร์ดแล้ว",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "หากต้องการคัดลอกและวาง กรุณากดปุ่มคัดลอก หรือใช้ปุ่มลัด <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd> สำหรับคลิปบอร์ด",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "หากต้องการคัดลอกและวาง กรุณากดปุ่มคัดลอก หรือใช้ปุ่มลัด <kbd>%s</kbd>+<kbd>c</kbd> สำหรับคลิปบอร์ด",
     "Copy link": "คัดลอกลิงก์",
     "Link copied to clipboard": "คัดลอกลิงก์ไปที่คลิปบอร์ดแล้ว",
     "Document text": "ฝากข้อความ",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "ปุ่ม Tabulator ใช้เป็นอักขระ (กด <kbd>Ctrl</kbd>+<kbd>m</kbd> หรือ <kbd>Esc</kbd> เพื่อสลับ)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "ธีม"
+    "Theme": "ธีม",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/tr.json

@@ -151,7 +151,7 @@
     "server error or not responding": "sunucu hatası veya yanıt vermiyor",
     "Could not post comment: %s": "Yorum paylaşılamadı: %s",
     "Sending document…": "Yazı gönderiliyor…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Yazınız: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(<kbd>Ctrl</kbd>+<kbd>c</kbd> tuşlarına basarak kopyalayın.)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Yazınız: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(<kbd>%s</kbd>+<kbd>c</kbd> tuşlarına basarak kopyalayın.)</span>",
     "Delete data": "Veriyi sil",
     "Could not create document: %s": "Yazı oluşturulamadı: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Yazı şifresi çözülemedi, çözme anahtarı URL'de bulunamadı. (Buraya bir yönlendirici veya URL kısaltıcı kullanarak gelmiş olabilirsiniz.)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Yazı açılırken hata oluştu, tarayıcınız WebAssembly'i desteklemiyor. Lütfen bu yazıyı görüntülemek için başka bir tarayıcı kullanın.",
     "Start over": "Baştan başla",
     "Document copied to clipboard": "Document copied to clipboard",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Copy link",
     "Link copied to clipboard": "Link copied to clipboard",
     "Document text": "Document text",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)",
     "Show password": "Show password",
     "Hide password": "Hide password",
-    "Theme": "Theme"
+    "Theme": "Theme",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 10 - 7
i18n/uk.json

@@ -5,7 +5,7 @@
     "Because ignorance is bliss": "Менше знаєш — краще спиш",
     "Document does not exist, has expired or has been deleted.": "Документ не існує. Можливо, його протерміновано чи видалено.",
     "%s requires php %s or above to work. Sorry.": "Для роботи %s потрібен php %s чи вище. Вибачте.",
-    "%s requires configuration section [%s] to be present in configuration file.": "%s потрібна секція [%s] в конфігураційному файлі.",
+    "%s requires configuration section [%s] to be present in configuration file.": "%s потрібна секція [%s] у файлі налаштувань.",
     "Please wait %d seconds between each post.": [
         "Будь ласка, зачекайте %d секунду між створеннями.",
         "Будь ласка, зачекайте %d секунди між створеннями.",
@@ -36,8 +36,8 @@
     "Discussion": "Обговорення",
     "Toggle navigation": "Перемкнути навігацію",
     "%d seconds": [
-        "%d секунду",
-        "%d секунди",
+        "%d секунд",
+        "%d секунд",
         "%d секунд",
         "%d секунд",
         "%d секунд",
@@ -151,7 +151,7 @@
     "server error or not responding": "помилка на сервері чи немає відповіді",
     "Could not post comment: %s": "Не вдалося опублікувати коментар: %s",
     "Sending document…": "Надсилання документа…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "Документ: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(копіювати: <kbd>Ctrl</kbd>+<kbd>c</kbd>)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "Документ: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(копіювати: <kbd>%s</kbd>+<kbd>c</kbd>)</span>",
     "Delete data": "Видалити дані",
     "Could not create document: %s": "Не вдалося опублікувати документ: %s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Не вдається розшифрувати документ: ключ дешифрування відсутній у посиланні (можливо, ваш сервіс переспрямування чи скорочення посилань видаляє частину посилання?)",
@@ -213,7 +213,7 @@
     "URL shortener is enabled by default.": "Скорочення посилань типово увімкнено.",
     "Save document": "Зберегти документ",
     "Your IP is not authorized to create documents.": "Вашій IP-адресі не дозволено створювати документи.",
-    "Trying to shorten a URL that isn't pointing at our instance.": "Спроба скоротити URL, який не вказує на наш сервер.",
+    "Trying to shorten a URL that isn't pointing at our instance.": "Спроба скоротити URL, який не вказує на наш екземпляр.",
     "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Помилка проксі: не вказано URL-адреси проксі. Ймовірно, проблема в налаштуваннях: ключі конфігурації можуть бути відсутні або містити одрук.",
     "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Помилка проксі: не вдається розпізнати відповідь проксі. Ймовірно, проблема в налаштуваннях: ключі конфігурації можуть бути відсутні або містити одрук",
     "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Помилка проксі: хибна відповідь. Ймовірно, проблема в налаштуваннях: ключі конфігурації можуть бути відсутні або містити одрук.",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Помилка розпакування документа: браузер не підтримує WebAssembly. Спробуйте відкрити документ в іншому браузері.",
     "Start over": "Почати знову",
     "Document copied to clipboard": "Документ скопійовано до буфера",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "Щоб скопіювати документ, натисніть кнопку «Копіювати» чи клавіші <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "Щоб скопіювати документ, натисніть кнопку «Копіювати» чи клавіші <kbd>%s</kbd>+<kbd>c</kbd>",
     "Copy link": "Копіювати посилання",
     "Link copied to clipboard": "Посилання скопійовано до буфера",
     "Document text": "Текст документа",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Клавіша Tab вводить символ табуляції (перемикається клавішами <kbd>Ctrl</kbd>+<kbd>m</kbd> чи <kbd>Esc</kbd>)",
     "Show password": "Показати пароль",
     "Hide password": "Сховати пароль",
-    "Theme": "Тема"
+    "Theme": "Тема",
+    "Copy": "Copy",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 6 - 3
i18n/zh.json

@@ -151,7 +151,7 @@
     "server error or not responding": "服务器错误或无回应",
     "Could not post comment: %s": "无法发送评论: %s",
     "Sending document…": "正在发送粘贴内容…",
-    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>": "您粘贴内容的链接是 <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 <kbd>Ctrl</kbd>+<kbd>c</kbd> 以复制)</span>",
+    "Your document is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>": "您粘贴内容的链接是 <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 <kbd>%s</kbd>+<kbd>c</kbd> 以复制)</span>",
     "Delete data": "删除数据",
     "Could not create document: %s": "无法创建粘贴:%s",
     "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "无法解密粘贴:URL中缺失解密密钥(是否使用了重定向或者短链接导致密钥丢失?)",
@@ -224,12 +224,15 @@
     "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "解压粘贴时出错,您的浏览器不支持 WebAssembly。请使用其他浏览器查看此粘贴。",
     "Start over": "重新开始",
     "Document copied to clipboard": "粘贴内容已复制到剪贴板",
-    "To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>": "要复制粘贴内容,请点击复制按钮或使用快捷键 <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>。",
+    "To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>": "要复制粘贴内容,请点击复制按钮或使用快捷键 <kbd>%s</kbd>+<kbd>c</kbd>。",
     "Copy link": "复制链接",
     "Link copied to clipboard": "链接已复制到剪贴板",
     "Document text": "粘贴文本",
     "Tabulator key serves as character (Hit <kbd>Ctrl</kbd>+<kbd>m</kbd> or <kbd>Esc</kbd> to toggle)": "Tab 键可作为字符(按 <kbd>Ctrl</kbd>+<kbd>m</kbd> 或 <kbd>Esc</kbd> 切换开关)",
     "Show password": "显示密码",
     "Hide password": "隐藏密码",
-    "Theme": "主题"
+    "Theme": "主题",
+    "Copy": "复制",
+    "Cmd": "Cmd",
+    "Ctrl": "Ctrl"
 }

+ 1 - 1
js/common.js

@@ -15,7 +15,7 @@ require('./prettify');
 global.prettyPrint = window.PR.prettyPrint;
 global.prettyPrintOne = window.PR.prettyPrintOne;
 global.showdown = require('./showdown-2.1.0');
-global.DOMPurify = require('./purify-3.4.1');
+global.DOMPurify = require('./purify-3.4.12');
 global.baseX = require('./base-x-5.0.1').baseX;
 global.Legacy = require('./legacy').Legacy;
 require('./privatebin');

Файловите разлики са ограничени, защото са твърде много
+ 165 - 230
js/package-lock.json


+ 4 - 3
js/package.json

@@ -1,6 +1,6 @@
 {
   "name": "privatebin",
-  "version": "2.0.4",
+  "version": "2.0.5",
   "description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted in the browser using 256 bit AES in Galois Counter mode (GCM).",
   "main": "privatebin.js",
   "directories": {
@@ -9,11 +9,12 @@
   "devDependencies": {
     "@peculiar/webcrypto": "^1.5.0",
     "eslint": "^9.37.0",
-    "jsdom": "^26.0.0",
+    "jsdom": "^26.1.0",
     "jsdom-global": "^3.0.2",
     "jsverify": "^0.8.3",
+    "mime-types": "^3.0.2",
     "mocha": "^11.7.5",
-    "nyc": "^17.1.0"
+    "nyc": "^18.0.0"
   },
   "scripts": {
     "test": "mocha",

+ 61 - 45
js/privatebin.js

@@ -2107,10 +2107,13 @@ jQuery.PrivateBin = (function($) {
          */
         me.createPasteNotification = function(url, deleteUrl)
         {
+            const ua = navigator.userAgent;
+            const isMac = /Mac/.test(ua);
+            const hotkey = isMac ? I18n._('Cmd') : I18n._('Ctrl');
             I18n._(
                 $('#pastelink'),
-                'Your document is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>',
-                url, url
+                'Your document is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>',
+                url, url, hotkey
             );
             // save newly created element
             $pasteUrl = $('#pasteurl');
@@ -2317,6 +2320,10 @@ jQuery.PrivateBin = (function($) {
             $loadconfirmClose.off('click.close');
             $loadconfirmClose.on('click.close', Controller.newPaste);
 
+            $loadconfirmmodal.on('shown.bs.modal', () => {
+                $loadconfirmOpenNow.trigger('focus');
+            });
+
             if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip.VERSION) {
                 (new bootstrap.Modal($loadconfirmmodal[0])).show();
             } else {
@@ -2990,11 +2997,18 @@ jQuery.PrivateBin = (function($) {
 
             const mimeType = me.getAttachmentMimeType(attachmentData);
 
+            // We explicitly do _not_ use the original mime type for the download link
+            // to always force a download instead of potentially dangerous browser rendering/parsing/interpretation
+            let safeMimeType = 'application/octet-stream';
+            if (me.isSafeMimeType(mimeType)) {
+                safeMimeType = mimeType;
+            }
+
             // extract data and convert to binary
             const rawData = attachmentData.substring(base64Start);
             const decodedData = rawData.length > 0 ? atob(rawData) : '';
 
-            let blobUrl = getBlobUrl(decodedData, mimeType);
+            let blobUrl = getBlobUrl(decodedData, safeMimeType);
             attachmentLink.attr('href', blobUrl);
 
             if (typeof fileName !== 'undefined') {
@@ -3024,6 +3038,28 @@ jQuery.PrivateBin = (function($) {
             me.handleBlobAttachmentPreview($attachmentPreview, blobUrl, mimeType);
         };
 
+
+        /**
+         * Evaluates whether this is known a safe mime type.
+         *
+         * This means, the media can safely be displayed and e.g. no XSS should be possible.
+         * 
+         * @name AttachmentViewer.isSafeMimeType
+         * @function
+         * @param {string}
+         * @returns {bool}
+         */
+        me.isSafeMimeType = function(mimeType) {
+            return (
+                    mimeType.startsWith('image/') && 
+                    !mimeType.includes('svg')
+                ) ||
+                mimeType.startsWith('video/') ||
+                mimeType.startsWith('audio/') ||
+                mimeType.endsWith('/pdf') ||
+                mimeType === 'text/plain';
+        }
+
         /**
          * displays the attachment
          *
@@ -3075,7 +3111,7 @@ jQuery.PrivateBin = (function($) {
          */
         me.removeAttachmentData = function()
         {
-            files = undefined;
+            files = [];
             attachmentsData = [];
         };
 
@@ -4193,6 +4229,10 @@ jQuery.PrivateBin = (function($) {
                     triggerEmailSend(emailBody);
                 }
 
+                $emailconfirmmodal.on('shown.bs.modal', () => {
+                    $emailconfirmTimezoneUtc.trigger('focus');
+                });
+
                 $emailconfirmTimezoneCurrent.off('click.sendEmailCurrentTimezone');
                 $emailconfirmTimezoneCurrent.on('click.sendEmailCurrentTimezone', sendEmailAndHideModal);
                 $emailconfirmTimezoneUtc.off('click.sendEmailUtcTimezone');
@@ -4713,16 +4753,17 @@ jQuery.PrivateBin = (function($) {
             $fileRemoveButton.click(removeAttachment);
             $qrCodeLink.click(displayQrCode);
 
-            // bootstrap template drop downs
-            $('ul.dropdown-menu li a', $('#expiration').parent()).click(updateExpiration);
-            $('ul.dropdown-menu li a', $('#formatter').parent()).click(updateFormat);
-            // bootstrap5 & page drop downs
-            $('#pasteExpiration').on('change', function() {
-                pasteExpiration = Model.getExpirationDefault();
-            });
-            $('#pasteFormatter').on('change', function() {
-                PasteViewer.setFormat(Model.getFormatDefault());
-            });
+            if (Helper.isBootstrap5()) {
+                $('#pasteExpiration').on('change', function() {
+                    pasteExpiration = Model.getExpirationDefault();
+                });
+                $('#pasteFormatter').on('change', function() {
+                    PasteViewer.setFormat(Model.getFormatDefault());
+                });
+            } else {
+                $('ul.dropdown-menu li a', $('#expiration').parent()).click(updateExpiration);
+                $('ul.dropdown-menu li a', $('#formatter').parent()).click(updateFormat);
+            }
 
             // initiate default state of checkboxes
             changeBurnAfterReading();
@@ -5231,7 +5272,7 @@ jQuery.PrivateBin = (function($) {
                 };
             if (attachmentsData.length) {
                 cipherMessage['attachment'] = attachmentsData;
-                cipherMessage['attachment_name'] = AttachmentViewer.getFiles()?.map((fileInfo => fileInfo.name)) ?? [];
+                cipherMessage['attachment_name'] = AttachmentViewer.getFiles().map(fileInfo => fileInfo.name);
             } else if (AttachmentViewer.hasAttachment()) {
                 // fall back to cloned part
                 let attachments = AttachmentViewer.getAttachments();
@@ -5526,8 +5567,6 @@ jQuery.PrivateBin = (function($) {
 
         let copyButton,
             copyLinkButton,
-            copyIcon,
-            successIcon,
             shortcutHint,
             url;
 
@@ -5539,11 +5578,10 @@ jQuery.PrivateBin = (function($) {
          * @function
          */
         function handleCopyButtonClick() {
-            $(copyButton).click(function() {
+            $(copyButton).click(function () {
                 const text = PasteViewer.getText();
                 saveToClipboard(text);
 
-                toggleSuccessIcon();
                 showAlertMessage('Document copied to clipboard');
             });
         }
@@ -5625,23 +5663,6 @@ jQuery.PrivateBin = (function($) {
             Alert.showStatus(message);
         }
 
-        /**
-         * Toogle success icon after copy
-         *
-         * @name CopyToClipboard.toggleSuccessIcon
-         * @private
-         * @function
-         */
-        function toggleSuccessIcon() {
-            $(copyIcon).css('display', 'none');
-            $(successIcon).css('display', 'block');
-
-            setTimeout(function() {
-                $(copyIcon).css('display', 'block');
-                $(successIcon).css('display', 'none');
-            }, 1000);
-        }
-
         /**
          * Show keyboard shortcut hint
          *
@@ -5649,10 +5670,7 @@ jQuery.PrivateBin = (function($) {
          * @function
          */
         me.showKeyboardShortcutHint = function () {
-            I18n._(
-                shortcutHint,
-                'To copy document press on the copy button or use the clipboard shortcut <kbd>Ctrl</kbd>+<kbd>c</kbd>/<kbd>Cmd</kbd>+<kbd>c</kbd>'
-            );
+            $(shortcutHint).removeClass('hidden');
         };
 
         /**
@@ -5662,7 +5680,7 @@ jQuery.PrivateBin = (function($) {
          * @function
          */
         me.hideKeyboardShortcutHint = function () {
-            $(shortcutHint).html('');
+            $(shortcutHint).addClass('hidden');
         };
 
         /**
@@ -5683,11 +5701,9 @@ jQuery.PrivateBin = (function($) {
          * @function
          */
         me.init = function() {
-            copyButton = $('#prettyMessageCopyBtn');
+            copyButton = $('#copyShortcutHintBtn');
             copyLinkButton = $('#copyLink');
-            copyIcon = $('#copyIcon');
-            successIcon = $('#copySuccessIcon');
-            shortcutHint = $('#copyShortcutHintText');
+            shortcutHint = $('#copyShortcutHint');
 
             handleCopyButtonClick();
             handleCopyLinkButtonClick();

Файловите разлики са ограничени, защото са твърде много
+ 0 - 1
js/purify-3.4.1.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
js/purify-3.4.12.js


+ 27 - 25
js/test/CopyToClipboard.js

@@ -13,12 +13,15 @@ describe('CopyToClipboard', function() {
                 common.enableClipboard();
 
                 $('body').html(
-                    '<div id="placeholder" class="hidden">+++ no document text ' +
-                    '+++</div><div id="prettymessage" class="hidden">' +
-                    '<button type="button" id="prettyMessageCopyBtn"><svg id="copyIcon"></svg>' +
-                    '<svg id="copySuccessIcon"></svg></button><pre ' +
-                    'id="prettyprint" class="prettyprint linenums:1"></pre>' +
-                    '</div><div id="plaintext" class="hidden"></div>'
+                    '<div id="placeholder"></div>' +
+					'<div id="attachmentPreview" class="hidden"></div>' +
+                    '<h5 id="copyShortcutHint" class="hidden">' +
+						'<small id="copyShortcutHintText"></small>' +
+						'<button type="button" id="copyShortcutHintBtn"></button>' +
+					'</h5>' +
+                    '<div id="prettymessage" class="hidden">' +
+						'<pre id="prettyprint"></pre>' +
+					'</div>'
                 );
 
                 $.PrivateBin.PasteViewer.init();
@@ -28,7 +31,7 @@ describe('CopyToClipboard', function() {
 
                 $.PrivateBin.CopyToClipboard.init();
 
-                $('#prettyMessageCopyBtn').trigger('click');
+                $('#copyShortcutHintBtn').trigger('click');
 
                 const savedToClipboardText = await navigator.clipboard.readText();
 
@@ -50,12 +53,15 @@ describe('CopyToClipboard', function() {
                 common.enableClipboard();
 
                 $('body').html(
-                    '<div id="placeholder">+++ no document text ' +
-                    '+++</div><div id="prettymessage" class="hidden">' +
-                    '<button type="button" id="prettyMessageCopyBtn"><svg id="copyIcon"></svg>' +
-                    '<svg id="copySuccessIcon"></svg></button><pre ' +
-                    'id="prettyprint" class="prettyprint linenums:1"></pre>' +
-                    '</div><div id="plaintext" class="hidden"></div>'
+                    '<div id="placeholder"></div>' +
+					'<div id="attachmentPreview" class="hidden"></div>' +
+                    '<h5 id="copyShortcutHint" class="hidden">' +
+						'<small id="copyShortcutHintText"></small>' +
+						'<button type="button" id="copyShortcutHintBtn"></button>' +
+					'</h5>' +
+                    '<div id="prettymessage" class="hidden">' +
+						'<pre id="prettyprint"></pre>' +
+					'</div>'
                 );
 
                 $.PrivateBin.PasteViewer.init();
@@ -100,39 +106,35 @@ describe('CopyToClipboard', function() {
 
 
     describe('Keyboard shortcut hint', function () {
-        jsc.property('Show hint',
-            'nestring',
-            function (text) {
+        jsc.property('Show hint', function () {
                 var clean = jsdom();
 
-                $('body').html('<small id="copyShortcutHintText"></small>');
+                $('body').html('<h5 id="copyShortcutHint" class="hidden"></h5>');
 
                 $.PrivateBin.CopyToClipboard.init();
                 $.PrivateBin.CopyToClipboard.showKeyboardShortcutHint();
 
-                const keyboardShortcutHint = $('#copyShortcutHintText').text();
+                const hasHidden = $('#copyShortcutHint').hasClass('hidden');
 
                 clean();
 
-                return keyboardShortcutHint.length > 0;
+                return !hasHidden;
             }
         );
 
-        jsc.property('Hide hint',
-            'nestring',
-            function (text) {
+        jsc.property('Hide hint', function () {
                 var clean = jsdom();
 
-                $('body').html('<small id="copyShortcutHintText">' + text + '</small>');
+                $('body').html('<h5 id="copyShortcutHint"></h5>');
 
                 $.PrivateBin.CopyToClipboard.init();
                 $.PrivateBin.CopyToClipboard.hideKeyboardShortcutHint();
 
-                const keyboardShortcutHint = $('#copyShortcutHintText').text();
+                const hasHidden = $('#copyShortcutHint').hasClass('hidden');
 
                 clean();
 
-                return keyboardShortcutHint.length === 0;
+                return hasHidden;
             }
         );
     });

+ 34 - 0
js/test/PasteStatus.js

@@ -39,6 +39,40 @@ describe('PasteStatus', function () {
                 return result1 === expected1 && result2 === expected2;
             }
         );
+
+        it(
+            'shows Cmd hotkey hint on macOS',
+            function () {
+                const clean = jsdom();
+                Object.defineProperty(navigator, 'userAgent', {
+                    value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
+                    configurable: true
+                });
+                $('body').html('<a href="#" id="deletelink"><span></span></a><div id="pastelink"></div>');
+                $.PrivateBin.PasteStatus.init();
+                $.PrivateBin.PasteStatus.createPasteNotification('https://example.com/', 'https://example.com/delete');
+                const hotkey = $('#copyhint kbd').first().text();
+                clean();
+                assert.strictEqual(hotkey, 'Cmd');
+            }
+        );
+
+        it(
+            'shows Ctrl hotkey hint on non-Mac platforms',
+            function () {
+                const clean = jsdom();
+                Object.defineProperty(navigator, 'userAgent', {
+                    value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
+                    configurable: true
+                });
+                $('body').html('<a href="#" id="deletelink"><span></span></a><div id="pastelink"></div>');
+                $.PrivateBin.PasteStatus.init();
+                $.PrivateBin.PasteStatus.createPasteNotification('https://example.com/', 'https://example.com/delete');
+                const hotkey = $('#copyhint kbd').first().text();
+                clean();
+                assert.strictEqual(hotkey, 'Ctrl');
+            }
+        );
     });
 
     describe('extractUrl', function () {

+ 2 - 2
lib/Configuration.php

@@ -122,8 +122,8 @@ class Configuration
             'js/kjua-0.10.0.js'      => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==',
             'js/legacy.js'           => 'sha512-RQEo1hxpNc37i+jz/D9/JiAZhG8GFx3+SNxjYnI7jUgirDIqrCSj6QPAAZeaidditcWzsJ3jxfEj5lVm7ZwTRQ==',
             'js/prettify.js'         => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==',
-            'js/privatebin.js'       => 'sha512-kRRgq+R3dUScoqqjTQo+re+T+FrsaukqMO7qSMen2fq0Rcgz2S0GnR52sqKukbDDKRr/dDba01WWPccduYr+Jg==',
-            'js/purify-3.4.1.js'     => 'sha512-280a/Vb6fVFsYaeRrkuDp4EDmdYlt2XS+dlDEO/U9qljPrAraA2bIzHTNmP+9dpwPDDwTML+RS+h5iaagPwTzA==',
+            'js/privatebin.js'       => 'sha512-g58rPgrKnvxBDnT6lzYazdEfgY3XhRh7Yt7i1jkJw4oSvN0k/VPZ4zBSL/dCGfXGIOHqlqmX8DO5UFv2XYqsXg==',
+            'js/purify-3.4.12.js'    => 'sha512-Akf6HnAJZm0sWWWI4gp2GYff0NDnHUB02XJE5S7Hdq/Z5xtMjkuFacsDA8ZtViv1gi+onBxMhEMIaGyQeGxBng==',
             'js/showdown-2.1.0.js'   => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==',
             'js/zlib-1.3.2.js'       => 'sha512-RAhJgxg9siMIA8ky4c10Rc2zUgnK80olHB8Tt1IOYWY4Eh1WmrviQkDn+sgBlb38ZHq3tzufGC41kP360gmosQ==',
             'js/zlib.js'             => 'sha512-QOaEwssHqHRRcWJ2Un3Kl2Zhyprzl7T8zmsKN2FppFxW3VR+8UChYOx2iuL0HbXK42fuBWJm5PNQJxufulrt/w==',

+ 1 - 1
lib/Controller.php

@@ -32,7 +32,7 @@ class Controller
      *
      * @const string
      */
-    const VERSION = '2.0.4';
+    const VERSION = '2.0.5';
 
     /**
      * minimal required PHP version

+ 13 - 0
lib/I18n.php

@@ -297,6 +297,19 @@ class I18n
         return in_array(self::$_language, ['ar', 'he']);
     }
 
+    /**
+     * get OS-specific copy hotkey modifier key name based on user agent
+     *
+     * @access public
+     * @static
+     * @return string 'Cmd' on macOS, 'Ctrl' otherwise
+     */
+    public static function getCopyHotkey()
+    {
+        return isset($_SERVER['HTTP_USER_AGENT']) &&
+            strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false ? self::_('Cmd') : self::_('Ctrl');
+    }
+
     /**
      * set the default language
      *

+ 2 - 2
lib/Proxy/YourlsProxy.php

@@ -65,8 +65,8 @@ class YourlsProxy extends AbstractProxy
      */
     protected function _extractShortUrl(array $data): ?string
     {
-        if (($data['statusCode'] ?? 0) === 200) {
-            return $data['shorturl'] ?? 0;
+        if ((int) ($data['statusCode'] ?? 0) === 200) {
+            return $data['shorturl'] ?? null;
         }
         return null;
     }

+ 2 - 2
lib/Request.php

@@ -220,7 +220,7 @@ class Request
     }
 
     /**
-     * Get request URI
+     * Get request URI path without GET parameters
      *
      * @access public
      * @return string
@@ -228,7 +228,7 @@ class Request
     public function getRequestUri()
     {
         $uri = array_key_exists('REQUEST_URI', $_SERVER) ? filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL) : '';
-        return empty($uri) ? '/' : $uri;
+        return empty($uri) ? '/' : parse_url($uri, PHP_URL_PATH);
     }
 
     /**

+ 13 - 6
tpl/bootstrap.php

@@ -66,7 +66,7 @@ if ($MARKDOWN) :
 <?php
 endif;
 ?>
-		<?php $this->_scriptTag('js/purify-3.4.1.js', 'defer'); ?>
+		<?php $this->_scriptTag('js/purify-3.4.12.js', 'defer'); ?>
 		<?php $this->_scriptTag('js/legacy.js', 'defer'); ?>
 		<?php $this->_scriptTag('js/privatebin.js', 'defer'); ?>
 		<!-- icon -->
@@ -622,12 +622,19 @@ endif;
 				<article class="row">
 					<div id="placeholder" class="col-md-12 hidden"><?php echo I18n::_('+++ no document text +++'); ?></div>
 					<div id="attachmentPreview" class="col-md-12 text-center hidden"></div>
-					<h5 id="copyShortcutHint" class="col-md-12"><small id="copyShortcutHintText"></small></h5>
+					<h5 id="copyShortcutHint" class="media col-md-12 hidden" style="margin-top: 0;">
+						<div class="media-body media-middle">
+							<small id="copyShortcutHintText" class="hidden-xs">
+								<?php
+									echo I18n::_("To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>", I18n::getCopyHotkey())
+								?>
+							</small>
+						</div>
+						<div class="media-right media-middle">
+							<button type="button" id="copyShortcutHintBtn" class="btn btn-default"><?php echo I18n::_('Copy'); ?></button>
+						</div>
+					</h5>
 					<div id="prettymessage" class="col-md-12 hidden">
-						<button id="prettyMessageCopyBtn">
-							<span id="copyIcon" class="glyphicon glyphicon-duplicate" aria-hidden="true"></span>
-							<span id="copySuccessIcon" class="glyphicon glyphicon-ok text-success" aria-hidden="true"></span>
-						</button>
 						<pre id="prettyprint" class="col-md-12 prettyprint linenums:1"></pre>
 					</div>
 					<div id="plaintext" class="col-md-12 hidden"></div>

+ 11 - 8
tpl/bootstrap5.php

@@ -50,7 +50,7 @@ if ($MARKDOWN) :
 <?php
 endif;
 ?>
-		<?php $this->_scriptTag('js/purify-3.4.1.js', 'defer'); ?>
+		<?php $this->_scriptTag('js/purify-3.4.12.js', 'defer'); ?>
 		<?php $this->_scriptTag('js/legacy.js', 'defer'); ?>
 		<?php $this->_scriptTag('js/privatebin.js', 'defer'); ?>
 		<!-- icon -->
@@ -379,7 +379,7 @@ if ($FILEUPLOAD) :
 <?php
 endif;
 ?>
-				<div id="status" role="alert" class="d-flex justify-content-between align-items-center alert alert-<?php echo $ISDELETED ? 'success' : 'info'; echo empty($STATUS) ? ' hidden' : '' ?>">
+				<div id="status" role="alert" class="d-flex align-items-center gap-2 alert alert-<?php echo $ISDELETED ? 'success' : 'info'; echo empty($STATUS) ? ' hidden' : '' ?>">
 					<div>
 						<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#info-circle" /></svg>
 						<?php echo I18n::encode($STATUS), PHP_EOL; ?>
@@ -387,7 +387,7 @@ endif;
 <?php
 if ($ISDELETED) :
 ?>
-					<button type="button" class="btn btn-secondary d-flex justify-content-center align-items-center gap-1" id="new-from-alert">
+					<button type="button" class="btn btn-secondary d-flex justify-content-center align-items-center gap-1 ms-auto" id="new-from-alert">
 						<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#repeat" /></svg>
 						<?php echo I18n::_('Start over'), PHP_EOL; ?>
 					</button>
@@ -480,12 +480,15 @@ endif;
 				<article>
 					<div id="placeholder" class="col-md-12 hidden"><?php echo I18n::_('+++ no document text +++'); ?></div>
 					<div id="attachmentPreview" class="col-md-12 text-center hidden"></div>
-					<h6 id="copyShortcutHint" class="col-md-12"><small id="copyShortcutHintText"></small></h6>
+					<h6 id="copyShortcutHint" class="col-md-12 nav justify-content-between align-items-center mb-2 hidden">
+						<small id="copyShortcutHintText" class="d-none d-md-inline">
+							<?php
+								echo I18n::_("To copy document press on the copy button or use the clipboard shortcut <kbd>%s</kbd>+<kbd>c</kbd>", I18n::getCopyHotkey())
+							?>
+						</small>
+						<button type="button" id="copyShortcutHintBtn" class="btn btn-secondary ms-auto"><?php echo I18n::_('Copy'); ?></button>
+					</h6>
 					<div id="prettymessage" class="card col-md-12 hidden">
-						<button type="button" id="prettyMessageCopyBtn" class="text-secondary opacity-05-1-hover">
-							<svg id="copyIcon" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#copy" /></svg>
-							<svg id="copySuccessIcon" class="text-success" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#check" /></svg>
-						</button>
 						<pre id="prettyprint" class="card-body col-md-12 prettyprint linenums:1"></pre>
 					</div>
 					<div id="plaintext" class="col-md-12 hidden"></div>

+ 5 - 1
tpl/shortenerproxy.php

@@ -12,7 +12,11 @@ use PrivateBin\I18n;
 <?php
 if (empty($ERROR)) :
 ?>
-		<p><?php echo I18n::_('Your document is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit <kbd>Ctrl</kbd>+<kbd>c</kbd> to copy)</span>', $SHORTURL, $SHORTURL); ?></p>
+		<p>
+			<?php
+				echo I18n::_('Your document is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit <kbd>%s</kbd>+<kbd>c</kbd> to copy)</span>', $SHORTURL, $SHORTURL, I18n::getCopyHotkey());
+			?>
+		</p>
 <?php
 else:
 ?>

+ 5 - 0
tst/Bootstrap.php

@@ -792,6 +792,11 @@ class ConnectionInterfaceStub implements ConnectionInterface
         throw new BadMethodCallException('not supported by this stub');
     }
 
+    public function headObject(array $args = []): array
+    {
+        throw new BadMethodCallException('not supported by this stub');
+    }
+
     public function listObjects(array $args = [])
     {
         throw new BadMethodCallException('not supported by this stub');

+ 15 - 0
tst/I18nTest.php

@@ -231,6 +231,21 @@ class I18nTest extends TestCase
         Helper::rmDir($path);
     }
 
+    public function testGetCopyHotkey()
+    {
+        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)';
+        $this->assertEquals('Cmd', I18n::getCopyHotkey(), 'returns Cmd on macOS');
+
+        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)';
+        $this->assertEquals('Ctrl', I18n::getCopyHotkey(), 'returns Ctrl on Windows');
+
+        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (X11; Linux x86_64)';
+        $this->assertEquals('Ctrl', I18n::getCopyHotkey(), 'returns Ctrl on Linux');
+
+        unset($_SERVER['HTTP_USER_AGENT']);
+        $this->assertEquals('Ctrl', I18n::getCopyHotkey(), 'returns Ctrl when user agent absent');
+    }
+
     public function testMessageIdsExistInAllLanguages()
     {
         $messageIds = [];

+ 3 - 0
tst/RequestTest.php

@@ -218,6 +218,7 @@ class RequestTest extends TestCase
     {
         $this->reset();
         $id              = Helper::getRandomId();
+        $path            = '/' . $this->getRandomQueryChars() . '/';
         $queryParams     = [$id];
         $queryParamCount = random_int(1, 5);
         for ($i = 0; $i < $queryParamCount; ++$i) {
@@ -226,8 +227,10 @@ class RequestTest extends TestCase
         shuffle($queryParams);
         $_SERVER['REQUEST_METHOD'] = 'GET';
         $_SERVER['QUERY_STRING']   = implode('&', $queryParams);
+        $_SERVER['REQUEST_URI']    = $path . '?' . $_SERVER['QUERY_STRING'];
         $_GET[$id]                 = '';
         $request                   = new Request;
         $this->assertEquals($id, $request->getParam('pasteid'));
+        $this->assertEquals($path, $request->getRequestUri());
     }
 }

+ 23 - 0
tst/YourlsProxyTest.php

@@ -51,6 +51,16 @@ class YourlsProxyTest extends TestCase
         $this->assertEquals($yourls->getUrl(), 'https://example.com/1');
     }
 
+    public function testYourlsProxyWithStringStatusCode(): void
+    {
+        // YOURLS API returns statusCode as a string "200", not integer 200
+        file_put_contents($this->_mock_yourls_service, '{"shorturl":"https:\/\/example.com\/1","statusCode":"200"}');
+
+        $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar');
+        $this->assertFalse($yourls->isError());
+        $this->assertEquals($yourls->getUrl(), 'https://example.com/1');
+    }
+
     /**
      * @dataProvider providerInvalidUrl
      */
@@ -125,6 +135,19 @@ class YourlsProxyTest extends TestCase
         $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.');
     }
 
+    public function testYourlsSuccessWithoutShortUrl()
+    {
+        // YOURLS may reply with statusCode 200 but without a shorturl field;
+        // this must be handled gracefully as an error instead of raising a
+        // TypeError (the method is declared to return ?string). YOURLS returns
+        // the status code as a string, so mirror that here.
+        file_put_contents($this->_mock_yourls_service, '{"statusCode":"200"}');
+
+        $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar');
+        $this->assertTrue($yourls->isError());
+        $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.');
+    }
+
     public function testServerError()
     {
         // simulate some other server error that results in a non-JSON reply

Някои файлове не бяха показани, защото твърде много файлове са промени