Joinposter.com Russian to Polish Translator

Interface translation for joinposter.com from Russian to Polish

当前为 2025-05-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Joinposter.com Russian to Polish Translator
  3. // @namespace Violentmonkey Scripts
  4. // @match https://*.joinposter.com/*
  5. // @grant none
  6. // @version 0.1
  7. // @author a0s
  8. // @description Interface translation for joinposter.com from Russian to Polish
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. const translations = {
  13. "Начало работы": "Rozpoczęcie pracy",
  14. "Статистика": "Statystyki",
  15. "Продажи": "Sprzedaż",
  16. "Клиенты": "Klienci",
  17. "Сотрудники": "Pracownicy",
  18. "Цехи": "Warsztaty",
  19. "Категории": "Kategorie",
  20. "Товары": "Produkty",
  21. "ABC-анализ": "Analiza ABC",
  22. "Чеки": "Paragony",
  23. "Отзывы": "Opinie",
  24. "Оплаты": "Płatności",
  25. "Налоги": "Podatki",
  26.  
  27. "Финансы": "Finanse",
  28. "Транзакции": "Transakcje",
  29. "Cash flow": "Przepływy pieniężne",
  30. "Кассовые смены": "Zmiany kasowe",
  31. "Зарплата": "Wynagrodzenia",
  32. "Счета": "Konta",
  33. "P&L": "Zyski i straty",
  34.  
  35. "Меню": "Menu",
  36. "Тех. карты": "Karty technologiczne",
  37. "Полуфабрикаты": "Półprodukty",
  38. "Ингредиенты": "Składniki",
  39. "Категории товаров и тех. карт": "Kategorie produktów i kart tech.",
  40. "Категории ингредиентов": "Kategorie składników",
  41. "QR-меню": "Menu QR",
  42.  
  43. "Склад": "Magazyn",
  44. "Остатки": "Stany magazynowe",
  45. "Поставки": "Dostawy",
  46. "Переработки": "Przetwarzanie",
  47. "Перемещения": "Przemieszczenia",
  48. "Списания": "Straty",
  49. "Отчёт по движению": "Ruch magazynowy",
  50. "Инвентаризации": "Inwentaryzacje",
  51. "Поставщики": "Dostawcy",
  52. "Склады": "Magazyny",
  53. "Фасовки": "Pakowanie",
  54.  
  55. "Маркетинг": "Marketing",
  56. "Группы клиентов": "Grupy klientów",
  57. "Программы лояльности": "Programy lojalnościowe",
  58. "Исключения": "Wyjątki",
  59. "Акции": "Promocje",
  60.  
  61. "Доступ": "Dostęp",
  62. "Должности": "Stanowiska",
  63. "Кассы": "Kasy",
  64. "Заведения": "Placówki",
  65. "Интеграции": "Integracje",
  66.  
  67. "Все приложения": "Wszystkie aplikacje",
  68.  
  69. "Настройки": "Ustawienia",
  70. "Общие": "Ogólne",
  71. "Оплата подписки": "Płatność abonamentu",
  72. "Заказы": "Zamówienia",
  73. "Доставка": "Dostawa",
  74. "Безопасность": "Bezpieczeństwo",
  75. "Чек": "Paragon",
  76.  
  77. "Рекомендуйте Poster": "Poleć Poster",
  78.  
  79. "Корзина": "Kosz",
  80. "Столбцы": "Kolumny",
  81. "Экспорт": "Eksport",
  82. "Импорт": "Import",
  83. "Печать": "Drukuj",
  84. "Добавить": "Dodaj",
  85. "Фильтры": "Filtry",
  86. "Категория": "Kategoria",
  87. "Кофе": "Kawa",
  88. "Выпечка": "Wypieki",
  89. "Холодные напитки": "Napoje zimne",
  90. "букеты": "bukiety",
  91. "цветы поштучно": "kwiaty luzem",
  92. "композиции": "kompozycje",
  93. "Цех": "Warsztat",
  94. "Без цеха": "Bez warsztatu",
  95. "Мастерская": "Pracownia",
  96. "Клиентская зона": "Strefa klienta",
  97. "Налог": "Podatek",
  98. "Весовая тех. карта": "Techniczna karta wagowa",
  99. "Нет": "Nie",
  100. "Да": "Tak",
  101. "Заведение": "Lokal",
  102. "Babskie kwiaty": "Babskie kwiaty", // имя оставить без перевода
  103. "Отображаются на кассе": "Widoczne na kasie",
  104. "Применить": "Zastosuj",
  105. "Быстрый поиск": "Szybkie wyszukiwanie",
  106. "Фильтр": "Filtr",
  107. "Название": "Nazwa",
  108. "Выход": "Wydajność",
  109. "Себестоимость без НДС": "Koszt netto",
  110. "Цена": "Cena",
  111. "Наценка": "Marża",
  112. "Состав": "Skład",
  113. "Ред.": "Edytuj"
  114. };
  115.  
  116. (function () {
  117. 'use strict';
  118.  
  119. const sortedKeys = Object.keys(translations).sort((a, b) => b.length - a.length);
  120.  
  121. function translateText(node) {
  122. if (node.nodeType === Node.TEXT_NODE) {
  123. let text = node.textContent;
  124. let changed = false;
  125. for (let key of sortedKeys) {
  126. if (text.includes(key)) {
  127. text = text.replaceAll(key, translations[key]);
  128. changed = true;
  129. }
  130. }
  131. if (changed) {
  132. node.textContent = text;
  133. }
  134. } else if (node.nodeType === Node.ELEMENT_NODE && node.tagName !== 'SCRIPT' && node.tagName !== 'STYLE') {
  135. for (let child of node.childNodes) {
  136. translateText(child);
  137. }
  138. }
  139. }
  140.  
  141. // Перевести всё сразу
  142. translateText(document.body);
  143.  
  144. // А теперь следим за появлением новых элементов
  145. const observer = new MutationObserver(mutations => {
  146. for (let mutation of mutations) {
  147. for (let node of mutation.addedNodes) {
  148. translateText(node);
  149. }
  150. }
  151. });
  152.  
  153. observer.observe(document.body, { childList: true, subtree: true });
  154. })();