From ad806c6808c7feaa6585d22e19700a04fead87c8 Mon Sep 17 00:00:00 2001 From: Pixelcode <52963327+realpixelcode@users.noreply.github.com> Date: Sat, 2 Apr 2022 15:23:43 +0000 Subject: Add i18n * add i18n for translation * German translation * Arabic translation * RTL support --- src/_locales/ar/messages.json | 586 ++++++++++++++++++++ src/_locales/de/messages.json | 586 ++++++++++++++++++++ src/_locales/en/messages.json | 591 +++++++++++++++++++++ src/assets/javascripts/helpers/common.js | 16 +- src/assets/javascripts/localise.js | 4 + src/manifest.json | 13 +- src/pages/background/background.js | 8 +- src/pages/errors/instance_offline.html | 11 +- src/pages/errors/instance_offline.js | 4 +- src/pages/options/general/general.html | 78 +-- src/pages/options/imgur/imgur.html | 58 +- src/pages/options/init.js | 3 + src/pages/options/instagram/instagram.html | 68 ++- src/pages/options/lbry/lbry.html | 77 ++- src/pages/options/maps/maps.html | 47 +- src/pages/options/medium/medium.html | 58 +- src/pages/options/peertube/peertube.html | 59 +- src/pages/options/pixiv/pixiv.html | 62 +-- src/pages/options/reddit/reddit.html | 72 +-- src/pages/options/search/search.html | 68 +-- src/pages/options/sendTargets/sendTargets.html | 79 +-- src/pages/options/spotify/spotify.html | 59 +- src/pages/options/tiktok/tiktok.html | 59 +- src/pages/options/translate/translate.html | 237 +++++---- src/pages/options/twitter/twitter.html | 258 ++++----- src/pages/options/wikipedia/wikipedia.html | 235 ++++---- src/pages/options/youtube/youtube.html | 243 +++++---- src/pages/options/youtubeMusic/youtubeMusic.html | 292 +++++----- src/pages/popup/popup.html | 44 +- src/pages/popup/style.css | 2 +- .../NotoNaskhArabic-VariableFont_wght.ttf | Bin 0 -> 196420 bytes .../NotoSansArabic-VariableFont_wdth,wght.ttf | Bin 0 -> 765740 bytes .../stylesheets/Vazirmatn-VariableFont_wght.ttf | Bin 0 -> 285620 bytes src/pages/stylesheets/styles.css | 41 ++ 34 files changed, 2977 insertions(+), 1041 deletions(-) create mode 100644 src/_locales/ar/messages.json create mode 100644 src/_locales/de/messages.json create mode 100644 src/_locales/en/messages.json create mode 100644 src/pages/stylesheets/NotoNaskhArabic-VariableFont_wght.ttf create mode 100644 src/pages/stylesheets/NotoSansArabic-VariableFont_wdth,wght.ttf create mode 100644 src/pages/stylesheets/Vazirmatn-VariableFont_wght.ttf (limited to 'src') diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json new file mode 100644 index 00000000..50e627c5 --- /dev/null +++ b/src/_locales/ar/messages.json @@ -0,0 +1,586 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + + "extensionDescription": { + "message": "إضافة متصفح تعيد توجيه مواقع مشهورة إلى واجهات أمامية ذات تحترم الخصوصية", + "description": "description of the extension" + }, + + "switchInstance": { + "message": "تبديل المَثيل", + "description": "used in manifest.json as shortcut description" + }, + + "instance": { + "message": "المَثيل", + "description": "used in popup.html" + }, + + "settings": { + "message": "الإعدادات", + "description": "used in popup.html" + }, + + "libOptions": { + "message": "LibRedirect إعدادات", + "description": "used in general.html" + }, + + "general": { + "message": "العامة", + "description": "used in general.html" + }, + + "search": { + "message": "البحث", + "description": "used in general.html" + }, + + "translate": { + "message": "الترجمة", + "description": "used in general.html" + }, + + "maps": { + "message": "الخرائط", + "description": "used in general.html" + }, + + "sendFiles": { + "message": "إرسال الملفات", + "description": "used in general.html" + }, + + "youtube": { + "message": "يوتيوب", + "description": "used in general.html" + }, + + "instagram": { + "message": "إنستغرام", + "description": "used in general.html" + }, + + "twitter": { + "message": "تويتر", + "description": "used in general.html" + }, + + "reddit": { + "message": "ريديت", + "description": "used in general.html" + }, + + "tiktok": { + "message": "تيك توك", + "description": "used in general.html" + }, + + "ytmusic": { + "message": "يوتيوب ميوزيك", + "description": "used in general.html" + }, + + "imgur": { + "message": "إمجور", + "description": "used in general.html" + }, + + "pixiv": { + "message": "بكسيف", + "description": "used in general.html" + }, + + "wikipedia": { + "message": "ويكيبيديا", + "description": "used in general.html" + }, + + "peertube": { + "message": "PeerTube", + "description": "used in general.html" + }, + + "spotify": { + "message": "سبوتيفاي", + "description": "used in general.html" + }, + + "medium": { + "message": "ميديام", + "description": "used in general.html" + }, + + "tor": { + "message": "تور", + "description": "used in imgur.html" + }, + + "pixivMoe": { + "message": "pixiv萌え", + "description": "used in pixiv.html" + }, + + "theme": { + "message": "السمة", + "description": "used in general.html" + }, + + "system": { + "message": "النظام", + "description": "used in general.html" + }, + + "light": { + "message": "فاتح", + "description": "used in general.html" + }, + + "dark": { + "message": "داكن", + "description": "used in general.html" + }, + + "applyTheme": { + "message": "تطبيق السمة على الواجهات", + "description": "used in general.html" + }, + + "alwaysPref": { + "message": "استخدم المُثلاء المفضلين دائماً", + "description": "used in general.html" + }, + + "autoRedirect": { + "message": "إعادة التوجيه تلقائياً من المُثلاء الذين لا يعملون", + "description": "used in general.html" + }, + + "exceptions": { + "message": "الاستثناءات", + "description": "used in general.html" + }, + + "updateInstances": { + "message": "تحديث قائمة المُثلاء", + "description": "used in general.html" + }, + + "importSettings": { + "message": "استيراد الإعدادات", + "description": "used in general.html" + }, + + "exportSettings": { + "message": "تصدير الإعدادات", + "description": "used in general.html" + }, + + "resetSettings": { + "message": "إعادة تعيين الإعدادات", + "description": "used in general.html" + }, + + "customPopup": { + "message": "تخصيص النافذة المنبثقة", + "description": "used in general.html" + }, + + "enable": { + "message": "تفعيل", + "description": "used in imgur.html" + }, + + "protocol": { + "message": "البروتوكول", + "description": "used in imgur.html" + }, + + "normal": { + "message": "العادي", + "description": "used in imgur.html" + }, + + "defaultInstances": { + "message": "المُثلاء الافتراضيين", + "description": "used in imgur.html" + }, + + "customInstances": { + "message": "المُثلاء المخصصين", + "description": "used in imgur.html" + }, + + "toggleAll": { + "message": "تبديل الكل", + "description": "used in common.js" + }, + + "frontend": { + "message": "الواجهة الأمامية", + "description": "used in maps.html" + }, + + "notFullyPrivate": { + "message": "هذه الواجهة لا تحترم الخصوصية تماماً", + "description": "used in pixiv.html" + }, + + "oldReddit": { + "message": "ريديت القديم", + "description": "used in reddit.html" + }, + + "bypassReddit": { + "message": "تجاوز \"Open in Reddit\"", + "description": "used in reddit.html" + }, + + "searchNote": { + "message": "ملاحظة: لاستعمال \"البحث\" بكامل إمكانيته، اجعل LibRedirect محرك البحث الافتراضي", + "description": "used in search.html" + }, + + "libSendFiles": { + "message": "LibRedirect: إرسال الملفات", + "description": "used in sendTargets.html" + }, + + "from": { + "message": "من", + "description": "used in translate.html" + }, + + "to": { + "message": "إلى", + "description": "used in translate.html" + }, + + "default": { + "message": "الافتراضي", + "description": "used in translate.html" + }, + + "auto": { + "message": "تلقائي", + "description": "used in translate.html" + }, + + "engine": { + "message": "محرك البحث", + "description": "used in translate.html" + }, + + "libTranslate": { + "message": "LibRedirect: الترجمة", + "description": "used in translate.html" + }, + + "bypassTwitter": { + "message": "تجاوز \"Open in Twitter\"", + "description": "used in twitter.html" + }, + + "embeddedVids": { + "message": "واجهة الفيديوهات المضمنة", + "description": "used in youtube.html" + }, + + "redirectType": { + "message": "نوع إعادة التوجيه", + "description": "used in youtube.html" + }, + + "both": { + "message": "الإثنين", + "description": "used in youtube.html" + }, + + "onlyEmbedded": { + "message": "فقط للتضمينات", + "description": "used in youtube.html" + }, + + "onlyNotEmbedded": { + "message": "فقط لغير التضمينات", + "description": "used in youtube.html" + }, + + "bypassYoutube": { + "message": "تجاوز \"Watch on YouTube\"", + "description": "used in youtube.html" + }, + + "enableCustom": { + "message": "تمكين الإعدادات الخاصة (ستُستخدم ملفات تعريف الارتباط والـlocalStorage)", + "description": "used in youtube.html" + }, + + "autoplayVid": { + "message": "تشغيل الفيديوهات التلقائي", + "description": "used in youtube.html" + }, + + "volume": { + "message": "الصوت: ", + "description": "used in youtube.html" + }, + + "playerStyle": { + "message": "شكل مشغل الفيديو", + "description": "used in youtube.html" + }, + + "alwaysLoop": { + "message": "إعادة تشغيل الفيديو تلقائياً", + "description": "used in youtube.html" + }, + + "playNext": { + "message": "تشغيل التالي افتراضياً", + "description": "used in youtube.html" + }, + + "autoplayNext": { + "message": "تشغيل الفيديو التالي تلقائياً", + "description": "used in youtube.html" + }, + + "alwaysProxy": { + "message": "بروكسي المقاطع المرئيّة", + "description": "used in youtube.html" + }, + + "listenByDefault": { + "message": "تشغيل النسخة السمعية تلقائيًا", + "description": "used in youtube.html" + }, + + "defaultSpeed": { + "message": "السرعة الافتراضية", + "description": "used in youtube.html" + }, + + "prefQuality": { + "message": "الجودة المفضلة للمقاطع", + "description": "used in youtube.html" + }, + + "dash": { + "message": "DASH (جودة تكيُّفية)", + "description": "used in youtube.html" + }, + + "prefDashQuality": { + "message": "جودة فيديو DASH المفضلة", + "description": "used in youtube.html" + }, + + "best": { + "message": "الأفضل", + "description": "used in youtube.html" + }, + + "worst": { + "message": "الأسوء", + "description": "used in youtube.html" + }, + + "defaultComments": { + "message": "التعليقات الافتراضية", + "description": "used in youtube.html" + }, + + "none": { + "message": "لا شيء", + "description": "used in youtube.html" + }, + + "defaultCaptions": { + "message": "التسميات التوضيحية الاتفراضية", + "description": "used in youtube.html" + }, + + "showRelated": { + "message": "اعرض الفيديوهات ذات الصلة", + "description": "used in youtube.html" + }, + + "showAnnotations": { + "message": "إظهار الـAnnotation بشكل افتراضي", + "description": "used in youtube.html" + }, + + "autoExtendDesc": { + "message": "توسيع وصف الفيديو تلقائيا", + "description": "used in youtube.html" + }, + + "interactive360": { + "message": "مقاطع فيديو تفاعلية بزاوية 360 درجة (تتطلب WebGL)", + "description": "used in youtube.html" + }, + + "savePlaybackPos": { + "message": "حفظ موضع التشغيل", + "description": "used in youtube.html" + }, + + "enableSponsorBlock": { + "message": "Enable SponsorBlock", + "description": "used in youtube.html" + }, + + "skipSponsors": { + "message": "Skip sponsors", + "description": "used in youtube.html" + }, + + "skipIntermission": { + "message": "Skip Intermission/Intro Animation", + "description": "used in youtube.html" + }, + + "skipEndcards": { + "message": "Skip Endcards/Credits", + "description": "used in youtube.html" + }, + + "skipPreview": { + "message": "Skip Preview/Recap", + "description": "used in youtube.html" + }, + + "skipReminder": { + "message": "Skip interaction reminder (subscribe)", + "description": "used in youtube.html" + }, + + "skipUnpaidPromo": { + "message": "Skip Unpaid/Self Promotion", + "description": "used in youtube.html" + }, + + "skipMusic": { + "message": "Skip Music: Non-Music Section", + "description": "used in youtube.html" + }, + + "skipHighlights": { + "message": "Skip highlights", + "description": "used in youtube.html" + }, + + "skipFiller": { + "message": "Skip Filler Tangent", + "description": "used in youtube.html" + }, + + "audioOnly": { + "message": "Audio only", + "description": "used in youtube.html" + }, + + "defaultQuality": { + "message": "Default quality", + "description": "used in youtube.html" + }, + + "bufferingGoal": { + "message": "Buffering Goal (in seconds)", + "description": "used in youtube.html" + }, + + "countrySelection": { + "message": "Country selection", + "description": "used in youtube.html" + }, + + "defaultHomepage": { + "message": "Default homepage", + "description": "used in youtube.html" + }, + + "trending": { + "message": "Trending", + "description": "used in youtube.html" + }, + + "feed": { + "message": "Feed", + "description": "used in youtube.html" + }, + + "showComments": { + "message": "Show comments", + "description": "used in youtube.html" + }, + + "minimizeDesc": { + "message": "Minimize description by default", + "description": "used in youtube.html" + }, + + "storeHistory": { + "message": "Store watch history", + "description": "used in youtube.html" + }, + + "enabledCodecs": { + "message": "Enabled codecs (multiple)", + "description": "used in youtube.html" + }, + + "disableLBRY": { + "message": "Disable LBRY for streaming", + "description": "used in youtube.html" + }, + + "enableProxyLBRY": { + "message": "Enable proxy for LBRY", + "description": "used in youtube.html" + }, + + "proxyLBRY": { + "message": "Proxy LBRY videos", + "description": "used in youtube.html" + }, + + "skipNote": { + "message": "Skip to the last watched point when encountering a video already seen", + "description": "used in youtube.html" + }, + + "embedExceptions": { + "message": "Embed exceptions", + "description": "used in youtube.html" + }, + + "instanceOffline": { + "message": "This instance is offline, you'll be redirected after ", + "description": "used in instance_offline.html" + }, + + "sec": { + "message": "الثواني", + "description": "used in instance_offline.html" + }, + + "cancel": { + "message": "إلغاء", + "description": "used in instance_offline.html" + }, + + "instanceIsOff": { + "message": "المَثيل غير متصل على النت", + "description": "used in instance_offline.html" + }, + + "redirectionCanceled": { + "message": "تم إلغاء إعادة التوجيه", + "description": "used in instance_offline.js" + } + } diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json new file mode 100644 index 00000000..03248032 --- /dev/null +++ b/src/_locales/de/messages.json @@ -0,0 +1,586 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + + "extensionDescription": { + "message": "Eine Erweiterung, die beliebte Websites zu alternativen datenschutzfreundlichen Frontends und Backends weiterleitet.", + "description": "description of the extension" + }, + + "switchInstance": { + "message": "Instanz wechseln", + "description": "used in manifest.json as shortcut description" + }, + + "instance": { + "message": "Instanz", + "description": "used in popup.html" + }, + + "settings": { + "message": "Optionen", + "description": "used in popup.html" + }, + + "libOptions": { + "message": "LibRedirect-Optionen", + "description": "used in general.html" + }, + + "general": { + "message": "Allgemein", + "description": "used in general.html" + }, + + "search": { + "message": "Suche", + "description": "used in general.html" + }, + + "translate": { + "message": "Übersetzen", + "description": "used in general.html" + }, + + "maps": { + "message": "Karten", + "description": "used in general.html" + }, + + "sendFiles": { + "message": "Dateien senden", + "description": "used in general.html" + }, + + "youtube": { + "message": "YouTube", + "description": "used in general.html" + }, + + "instagram": { + "message": "Instagram", + "description": "used in general.html" + }, + + "twitter": { + "message": "Twitter", + "description": "used in general.html" + }, + + "reddit": { + "message": "Reddit", + "description": "used in general.html" + }, + + "tiktok": { + "message": "TikTok", + "description": "used in general.html" + }, + + "ytmusic": { + "message": "YT Music", + "description": "used in general.html" + }, + + "imgur": { + "message": "Imgur", + "description": "used in general.html" + }, + + "pixiv": { + "message": "Pixiv", + "description": "used in general.html" + }, + + "wikipedia": { + "message": "Wikipedia", + "description": "used in general.html" + }, + + "peertube": { + "message": "PeerTube", + "description": "used in general.html" + }, + + "spotify": { + "message": "Spotify", + "description": "used in general.html" + }, + + "medium": { + "message": "Medium", + "description": "used in general.html" + }, + + "tor": { + "message": "Tor", + "description": "used in imgur.html" + }, + + "pixivMoe": { + "message": "pixiv萌え", + "description": "used in pixiv.html" + }, + + "theme": { + "message": "Thema", + "description": "used in general.html" + }, + + "system": { + "message": "System", + "description": "used in general.html" + }, + + "light": { + "message": "Hell", + "description": "used in general.html" + }, + + "dark": { + "message": "Dunkel", + "description": "used in general.html" + }, + + "applyTheme": { + "message": "Thema auf Seiten anwenden", + "description": "used in general.html" + }, + + "alwaysPref": { + "message": "Immer bevorzugte Instanzen verwenden", + "description": "used in general.html" + }, + + "autoRedirect": { + "message": "Instanzen automatisch weiterleiten, die offline sind", + "description": "used in general.html" + }, + + "exceptions": { + "message": "Ausnahmen", + "description": "used in general.html" + }, + + "updateInstances": { + "message": "Instanzen aktualisieren", + "description": "used in general.html" + }, + + "importSettings": { + "message": "Einstellungen importieren", + "description": "used in general.html" + }, + + "exportSettings": { + "message": "Einstellungen exportieren", + "description": "used in general.html" + }, + + "resetSettings": { + "message": "Einstellungen zurücksetzen", + "description": "used in general.html" + }, + + "customPopup": { + "message": "Popup personalisieren", + "description": "used in general.html" + }, + + "enable": { + "message": "Aktivieren", + "description": "used in imgur.html" + }, + + "protocol": { + "message": "Protokoll", + "description": "used in imgur.html" + }, + + "normal": { + "message": "Normal", + "description": "used in imgur.html" + }, + + "defaultInstances": { + "message": "Standard-Instanzen", + "description": "used in imgur.html" + }, + + "customInstances": { + "message": "Eigene Instanzen", + "description": "used in imgur.html" + }, + + "toggleAll": { + "message": "Alle umschalten", + "description": "used in common.js" + }, + + "frontend": { + "message": "Frontend", + "description": "used in maps.html" + }, + + "notFullyPrivate": { + "message": "Das ist kein völlig privates Frontend.", + "description": "used in pixiv.html" + }, + + "oldReddit": { + "message": "Altes Reddit", + "description": "used in reddit.html" + }, + + "bypassReddit": { + "message": "„Öffnen mit Reddit“ umgehen", + "description": "used in reddit.html" + }, + + "searchNote": { + "message": "Hinweis: Um das volle Potenzial der Suchweiterleitung auszunutzen, lege LibRedirect als Standardsuchmaschine fest.", + "description": "used in search.html" + }, + + "libSendFiles": { + "message": "LibRedirect: Dateien senden", + "description": "used in sendTargets.html" + }, + + "from": { + "message": "Von", + "description": "used in translate.html" + }, + + "to": { + "message": "Nach", + "description": "used in translate.html" + }, + + "default": { + "message": "Standard", + "description": "used in translate.html" + }, + + "auto": { + "message": "Auto", + "description": "used in translate.html" + }, + + "engine": { + "message": "Übersetzer", + "description": "used in translate.html" + }, + + "libTranslate": { + "message": "LibRedirect: Übersetzen", + "description": "used in translate.html" + }, + + "bypassTwitter": { + "message": "„Öffnen mit Twitter“ umgehen", + "description": "used in twitter.html" + }, + + "invidious": { + "message": "Invidious", + "description": "used in youtube.html" + }, + + "embeddedVids": { + "message": "Frontend für eingebettete Videos", + "description": "used in youtube.html" + }, + + "redirectType": { + "message": "Art der Weiterleitung", + "description": "used in youtube.html" + }, + + "both": { + "message": "beides", + "description": "used in youtube.html" + }, + + "onlyEmbedded": { + "message": "nur eingebettet", + "description": "used in youtube.html" + }, + + "onlyNotEmbedded": { + "message": "nur nicht-eingebunden", + "description": "used in youtube.html" + }, + + "bypassYoutube": { + "message": "„Auf YouTube ansehen“ umgehen", + "description": "used in youtube.html" + }, + + "enableCustom": { + "message": "Aktiviere benutzerdefinierte Einstellungen (verwendet Cookies und localStorage)", + "description": "used in youtube.html" + }, + + "autoplayVid": { + "message": "Video automatisch abspielen", + "description": "used in youtube.html" + }, + + "volume": { + "message": "Lautstärke: ", + "description": "used in youtube.html" + }, + + "playerStyle": { + "message": "Player-Stil", + "description": "used in youtube.html" + }, + + "alwaysLoop": { + "message": "Immer wiederholen", + "description": "used in youtube.html" + }, + + "playNext": { + "message": "Immer automatisch nächstes Video abspielen", + "description": "used in youtube.html" + }, + + "autoplayNext": { + "message": "Nächstes Video automatisch abspielen", + "description": "used in youtube.html" + }, + + "alwaysProxy": { + "message": "Videos immer durch Proxy leiten", + "description": "used in youtube.html" + }, + + "listenByDefault": { + "message": "Nur Ton als Standard", + "description": "used in youtube.html" + }, + + "defaultSpeed": { + "message": "Standardgeschwindigkeit", + "description": "used in youtube.html" + }, + + "prefQuality": { + "message": "Bevorzugte Videoqualität", + "description": "used in youtube.html" + }, + + "dash": { + "message": "DASH (automatische Qualität)", + "description": "used in youtube.html" + }, + + "prefDashQuality": { + "message": "Bevorzugte DASH-Videoqualität", + "description": "used in youtube.html" + }, + + "best": { + "message": "Höchste", + "description": "used in youtube.html" + }, + + "worst": { + "message": "Niedrigste", + "description": "used in youtube.html" + }, + + "defaultComments": { + "message": "Standardkommentare", + "description": "used in youtube.html" + }, + + "none": { + "message": "keine", + "description": "used in youtube.html" + }, + + "defaultCaptions": { + "message": "Standarduntertitel", + "description": "used in youtube.html" + }, + + "showRelated": { + "message": "Ähnliche Videos anzeigen", + "description": "used in youtube.html" + }, + + "showAnnotations": { + "message": "Anmerkungen standardmäßig anzeigen", + "description": "used in youtube.html" + }, + + "autoExtendDesc": { + "message": "Videobeschreibung automatisch erweitern", + "description": "used in youtube.html" + }, + + "interactive360": { + "message": "Interaktive 360-Grad-Videos (erfordert WebGL)", + "description": "used in youtube.html" + }, + + "savePlaybackPos": { + "message": "Wiedergabeposition speichern", + "description": "used in youtube.html" + }, + + "enableSponsorBlock": { + "message": "SponsorBlock einschalten", + "description": "used in youtube.html" + }, + + "skipSponsors": { + "message": "Sponsoren überspringen", + "description": "used in youtube.html" + }, + + "skipIntermission": { + "message": "Pausen-/Intro-Animation überspringen", + "description": "used in youtube.html" + }, + + "skipEndcards": { + "message": "Abspann überspringen", + "description": "used in youtube.html" + }, + + "skipPreview": { + "message": "Vorschau/Rückschau überspringen", + "description": "used in youtube.html" + }, + + "skipReminder": { + "message": "Interaktionserinnerung überspringen (Abonnieren)", + "description": "used in youtube.html" + }, + + "skipUnpaidPromo": { + "message": "Unbezahlte Werbung/Eigenwerbung überspringen", + "description": "used in youtube.html" + }, + + "skipMusic": { + "message": "Musik überspringen: Nicht-Musik-Bereich", + "description": "used in youtube.html" + }, + + "skipHighlight": { + "message": "Höhepunkt überspringen", + "description": "used in youtube.html" + }, + + "skipFiller": { + "message": "Lückenfüller überspringen", + "description": "used in youtube.html" + }, + + "audioOnly": { + "message": "Nur Audio", + "description": "used in youtube.html" + }, + + "defaultQuality": { + "message": "Standardqualität", + "description": "used in youtube.html" + }, + + "bufferingGoal": { + "message": "Pufferungsziel (in Sekunden)", + "description": "used in youtube.html" + }, + + "countrySelection": { + "message": "Länderauswahl", + "description": "used in youtube.html" + }, + + "defaultHomepage": { + "message": "Standard-Startseite", + "description": "used in youtube.html" + }, + + "trending": { + "message": "Trends", + "description": "used in youtube.html" + }, + + "feed": { + "message": "Abonnements", + "description": "used in youtube.html" + }, + + "showComments": { + "message": "Kommentare anzeigen", + "description": "used in youtube.html" + }, + + "minimizeDesc": { + "message": "Beschreibung standardmäßig minimieren", + "description": "used in youtube.html" + }, + + "storeHistory": { + "message": "Wiedergabeverlauf speichern", + "description": "used in youtube.html" + }, + + "enabledCodecs": { + "message": "Aktivierte Codecs (mehrere)", + "description": "used in youtube.html" + }, + + "disableLBRY": { + "message": "LBRY für Streaming deaktivieren", + "description": "used in youtube.html" + }, + + "enableProxyLBRY": { + "message": "Proxy für LBRY einschalten", + "description": "used in youtube.html" + }, + + "proxyLBRY": { + "message": "LBRY-Videos durch Proxy leiten", + "description": "used in youtube.html" + }, + + "skipNote": { + "message": "Springe zum letzten Wiedergabezeitpunkt bei bereits angesehenen Videos", + "description": "used in youtube.html" + }, + + "embedExceptions": { + "message": "Ausnahmen einbetten", + "description": "used in youtube.html" + }, + + "sec": { + "message": "Sekunden", + "description": "used in instance_offline.html" + }, + + "cancel": { + "message": "Abbrechen", + "description": "used in instance_offline.html" + }, + + "instanceIsOff": { + "message": "Instanz ist offline", + "description": "used in instance_offline.html" + }, + + "redirectionCanceled": { + "message": "Weiterleitung abgebrochen", + "description": "used in instance_offline.js" + } +} diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json new file mode 100644 index 00000000..bd693d3c --- /dev/null +++ b/src/_locales/en/messages.json @@ -0,0 +1,591 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + + "extensionDescription": { + "message": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "description": "description of the extension" + }, + + "switchInstance": { + "message": "Switch Instance", + "description": "used in manifest.json as shortcut description" + }, + + "instance": { + "message": "Instance", + "description": "used in popup.html" + }, + + "settings": { + "message": "Settings", + "description": "used in popup.html" + }, + + "libOptions": { + "message": "LibRedirect Options", + "description": "used in general.html" + }, + + "general": { + "message": "General", + "description": "used in general.html" + }, + + "search": { + "message": "Search", + "description": "used in general.html" + }, + + "translate": { + "message": "Translate", + "description": "used in general.html" + }, + + "maps": { + "message": "Maps", + "description": "used in general.html" + }, + + "sendFiles": { + "message": "Send Files", + "description": "used in general.html" + }, + + "youtube": { + "message": "YouTube", + "description": "used in general.html" + }, + + "instagram": { + "message": "Instagram", + "description": "used in general.html" + }, + + "twitter": { + "message": "Twitter", + "description": "used in general.html" + }, + + "reddit": { + "message": "Reddit", + "description": "used in general.html" + }, + + "tiktok": { + "message": "TikTok", + "description": "used in general.html" + }, + + "ytmusic": { + "message": "YT Music", + "description": "used in general.html" + }, + + "imgur": { + "message": "Imgur", + "description": "used in general.html" + }, + + "pixiv": { + "message": "Pixiv", + "description": "used in general.html" + }, + + "wikipedia": { + "message": "Wikipedia", + "description": "used in general.html" + }, + + "peertube": { + "message": "PeerTube", + "description": "used in general.html" + }, + + "spotify": { + "message": "Spotify", + "description": "used in general.html" + }, + + "medium": { + "message": "Medium", + "description": "used in general.html" + }, + + "tor": { + "message": "Tor", + "description": "used in imgur.html" + }, + + "pixivMoe": { + "message": "pixiv萌え", + "description": "used in pixiv.html" + }, + + "theme": { + "message": "Theme", + "description": "used in general.html" + }, + + "system": { + "message": "System", + "description": "used in general.html" + }, + + "light": { + "message": "Light", + "description": "used in general.html" + }, + + "dark": { + "message": "Dark", + "description": "used in general.html" + }, + + "applyTheme": { + "message": "Apply theme to sites", + "description": "used in general.html" + }, + + "alwaysPref": { + "message": "Always use Preferred Instances", + "description": "used in general.html" + }, + + "autoRedirect": { + "message": "Auto Redirect of offline instances", + "description": "used in general.html" + }, + + "exceptions": { + "message": "Exceptions", + "description": "used in general.html" + }, + + "updateInstances": { + "message": "Update Instances", + "description": "used in general.html" + }, + + "importSettings": { + "message": "Import Settings", + "description": "used in general.html" + }, + + "exportSettings": { + "message": "Export Settings", + "description": "used in general.html" + }, + + "resetSettings": { + "message": "Reset Settings", + "description": "used in general.html" + }, + + "customPopup": { + "message": "Customize Popup", + "description": "used in general.html" + }, + + "enable": { + "message": "Enable", + "description": "used in imgur.html" + }, + + "protocol": { + "message": "Protocol", + "description": "used in imgur.html" + }, + + "normal": { + "message": "Normal", + "description": "used in imgur.html" + }, + + "defaultInstances": { + "message": "Default Instances", + "description": "used in imgur.html" + }, + + "customInstances": { + "message": "Custom Instances", + "description": "used in imgur.html" + }, + + "toggleAll": { + "message": "Toggle all", + "description": "used in common.js" + }, + + "frontend": { + "message": "Frontend", + "description": "used in maps.html" + }, + + "notFullyPrivate": { + "message": "This isn't a fully private frontend.", + "description": "used in pixiv.html" + }, + + "oldReddit": { + "message": "Old Reddit", + "description": "used in reddit.html" + }, + + "bypassReddit": { + "message": "Bypass \"Open in Reddit\"", + "description": "used in reddit.html" + }, + + "searchNote": { + "message": "Note: To use Search to its full potential, make LibRedirect as the Default Search Engine", + "description": "used in search.html" + }, + + "libSendFiles": { + "message": "LibRedirect: Send Files", + "description": "used in sendTargets.html" + }, + + "from": { + "message": "From", + "description": "used in translate.html" + }, + + "to": { + "message": "To", + "description": "used in translate.html" + }, + + "default": { + "message": "Default", + "description": "used in translate.html" + }, + + "auto": { + "message": "Auto", + "description": "used in translate.html" + }, + + "engine": { + "message": "Engine", + "description": "used in translate.html" + }, + + "libTranslate": { + "message": "LibRedirect: Translate", + "description": "used in translate.html" + }, + + "bypassTwitter": { + "message": "Bypass \"Open in Twitter\"", + "description": "used in twitter.html" + }, + + "invidious": { + "message": "Invidious", + "description": "used in youtube.html" + }, + + "embeddedVids": { + "message": "Embedded Videos Frontend", + "description": "used in youtube.html" + }, + + "redirectType": { + "message": "Redirect Type", + "description": "used in youtube.html" + }, + + "both": { + "message": "both", + "description": "used in youtube.html" + }, + + "onlyEmbedded": { + "message": "only embedded", + "description": "used in youtube.html" + }, + + "onlyNotEmbedded": { + "message": "only not embedded", + "description": "used in youtube.html" + }, + + "bypassYoutube": { + "message": "Bypass \"Watch on YouTube\"", + "description": "used in youtube.html" + }, + + "enableCustom": { + "message": "Enable Custom Settings (will use cookies and localStorage)", + "description": "used in youtube.html" + }, + + "autoplayVid": { + "message": "Autoplay Video", + "description": "used in youtube.html" + }, + + "volume": { + "message": "Volume: ", + "description": "used in youtube.html" + }, + + "playerStyle": { + "message": "Player Style", + "description": "used in youtube.html" + }, + + "alwaysLoop": { + "message": "Always loop", + "description": "used in youtube.html" + }, + + "playNext": { + "message": "Play next by default", + "description": "used in youtube.html" + }, + + "autoplayNext": { + "message": "Autoplay next video", + "description": "used in youtube.html" + }, + + "alwaysProxy": { + "message": "Always proxy videos", + "description": "used in youtube.html" + }, + + "listenByDefault": { + "message": "Listen by default", + "description": "used in youtube.html" + }, + + "defaultSpeed": { + "message": "Default speed", + "description": "used in youtube.html" + }, + + "prefQuality": { + "message": "Preferred video quality", + "description": "used in youtube.html" + }, + + "dash": { + "message": "DASH (adaptive quality)", + "description": "used in youtube.html" + }, + + "prefDashQuality": { + "message": "Preferred DASH video quality", + "description": "used in youtube.html" + }, + + "best": { + "message": "Best", + "description": "used in youtube.html" + }, + + "worst": { + "message": "Worst", + "description": "used in youtube.html" + }, + + "defaultComments": { + "message": "Default comments", + "description": "used in youtube.html" + }, + + "none": { + "message": "None", + "description": "used in youtube.html" + }, + + "defaultCaptions": { + "message": "Default captions", + "description": "used in youtube.html" + }, + + "showRelated": { + "message": "Show related videos", + "description": "used in youtube.html" + }, + + "showAnnotations": { + "message": "Show annotations by default", + "description": "used in youtube.html" + }, + + "autoExtendDesc": { + "message": "Automatically extend video description", + "description": "used in youtube.html" + }, + + "interactive360": { + "message": "Interactive 360 degree videos (requires WebGL)", + "description": "used in youtube.html" + }, + + "savePlaybackPos": { + "message": "Save playback position", + "description": "used in youtube.html" + }, + + "enableSponsorBlock": { + "message": "Enable SponsorBlock", + "description": "used in youtube.html" + }, + + "skipSponsors": { + "message": "Skip sponsors", + "description": "used in youtube.html" + }, + + "skipIntermission": { + "message": "Skip Intermission/Intro Animation", + "description": "used in youtube.html" + }, + + "skipEndcards": { + "message": "Skip Endcards/Credits", + "description": "used in youtube.html" + }, + + "skipPreview": { + "message": "Skip Preview/Recap", + "description": "used in youtube.html" + }, + + "skipReminder": { + "message": "Skip interaction reminder (subscribe)", + "description": "used in youtube.html" + }, + + "skipUnpaidPromo": { + "message": "Skip Unpaid/Self Promotion", + "description": "used in youtube.html" + }, + + "skipMusic": { + "message": "Skip Music: Non-Music Section", + "description": "used in youtube.html" + }, + + "skipHighlight": { + "message": "Skip Highlight", + "description": "used in youtube.html" + }, + + "skipFiller": { + "message": "Skip Filler Tangent", + "description": "used in youtube.html" + }, + + "audioOnly": { + "message": "Audio only", + "description": "used in youtube.html" + }, + + "defaultQuality": { + "message": "Default quality", + "description": "used in youtube.html" + }, + + "bufferingGoal": { + "message": "Buffering Goal (in seconds)", + "description": "used in youtube.html" + }, + + "countrySelection": { + "message": "Country selection", + "description": "used in youtube.html" + }, + + "defaultHomepage": { + "message": "Default homepage", + "description": "used in youtube.html" + }, + + "trending": { + "message": "Trending", + "description": "used in youtube.html" + }, + + "feed": { + "message": "Feed", + "description": "used in youtube.html" + }, + + "showComments": { + "message": "Show comments", + "description": "used in youtube.html" + }, + + "minimizeDesc": { + "message": "Minimize description by default", + "description": "used in youtube.html" + }, + + "storeHistory": { + "message": "Store watch history", + "description": "used in youtube.html" + }, + + "enabledCodecs": { + "message": "Enabled codecs (multiple)", + "description": "used in youtube.html" + }, + + "disableLBRY": { + "message": "Disable LBRY for streaming", + "description": "used in youtube.html" + }, + + "enableProxyLBRY": { + "message": "Enable proxy for LBRY", + "description": "used in youtube.html" + }, + + "proxyLBRY": { + "message": "Proxy LBRY videos", + "description": "used in youtube.html" + }, + + "skipNote": { + "message": "Skip to the last watched point when encountering a video already seen", + "description": "used in youtube.html" + }, + + "embedExceptions": { + "message": "Embed exceptions", + "description": "used in youtube.html" + }, + + "instanceOffline": { + "message": "This instance is offline, you'll be redirected after ", + "description": "used in instance_offline.html" + }, + + "sec": { + "message": "seconds", + "description": "used in instance_offline.html" + }, + + "cancel": { + "message": "Cancel", + "description": "used in instance_offline.html" + }, + + "instanceIsOff": { + "message": "Instance is offline", + "description": "used in instance_offline.html" + }, + + "redirectionCanceled": { + "message": "Redirection canceled", + "description": "used in instance_offline.js" + } +} diff --git a/src/assets/javascripts/helpers/common.js b/src/assets/javascripts/helpers/common.js index f3982cd6..545fc9c4 100644 --- a/src/assets/javascripts/helpers/common.js +++ b/src/assets/javascripts/helpers/common.js @@ -7,6 +7,7 @@ import redditHelper from "./reddit.js"; import searchHelper from "./search.js"; import translateHelper from "./translate/translate.js"; import wikipediaHelper from "./wikipedia.js"; +import localise from '../localise.js' function getRandomInstance(instances) { return instances[~~(instances.length * Math.random())]; @@ -99,10 +100,12 @@ function processDefaultCustomInstances( nameCheckListElement.innerHTML = [ - `
Toggle All
`, + `
Toggle All
`, ...nameHelper.getRedirects()[name][protocol].map((x) => `
${x}
`), ].join('\n
\n'); + localise.localisePage(); + calcNameCheckBoxes(); document.getElementById(`${name}-${protocol}-toogle-all`).addEventListener("change", event => { if (event.target.checked) @@ -168,10 +171,21 @@ function processDefaultCustomInstances( }) } +function browserLang() { + var userLang = navigator.language || navigator.userLanguage; + return userLang; +} + +function isRtl() { + return ["ar", "iw", "ku", "fa", "ur"].includes(browserLang()) +} + export default { getRandomInstance, updateInstances, protocolHost, isFirefox, processDefaultCustomInstances, + browserLang, + isRtl, }; diff --git a/src/assets/javascripts/localise.js b/src/assets/javascripts/localise.js index 78e4c907..7c24d6c7 100644 --- a/src/assets/javascripts/localise.js +++ b/src/assets/javascripts/localise.js @@ -33,3 +33,7 @@ function localisePage() { } localisePage(); + +export default { + localisePage +} \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index 5a428c62..2aaa505e 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,6 +1,6 @@ { - "name": "LibRedirect", - "description": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "name": "__MSG_extensionName__", + "description": "__MSG_extensionDescription__", "version": "1.6.0", "manifest_version": 2, "browser_specific_settings": { @@ -28,7 +28,7 @@ "" ], "browser_action": { - "default_title": "LibRedirect", + "default_title": "__MSG_extensionName__", "browser_style": false, "default_popup": "pages/popup/popup.html", "default_icon": { @@ -45,7 +45,7 @@ }, "chrome_settings_overrides": { "search_provider": { - "name": "LibRedirect", + "name": "__MSG_extensionName__", "keyword": "libredirect", "favicon_url": "https://raw.githubusercontent.com/libredirect/libredirect/master/src/assets/images/libredirect-16.png", "search_url": "https://libredirect.invalid/?q={searchTerms}", @@ -58,9 +58,10 @@ "suggested_key": { "default": "Alt+Shift+L" }, - "description": "Switch Instance" + "description": "__MSG_switchInstance__" } }, + "default_locale": "en", "update_url": "https://raw.githubusercontent.com/libredirect/libredirect/master/src/updates/updates.xml", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAroWDSoSRZ1scj+eJRrvnhJbrqXTKnhQuxs6+AJg16sqr0bsMdFV+MSY4i4xnK+K5WOYkBliWXgUyk/wzicoAjOnSJddrL/Md4FuWHI2NVIkrlsLOrYkygi5OLqGPajRH/w8Cdmg7KzEpXe/OnYV0/qS8li8huEdTzdeLdhfbiVl1j3DOr4OJALQ7mPeeNFHFo/oVQ+OkSezWLezA5jUGfhtzPYV6u1TXzX7lCi8E/BbDbwkvvXOMcjXCv08kjdLOY2djCA2a6zr0xAb3q8DlexAMZ8vMof7AQRFtBKhLc9n9VFoipMMdBOVQQj/eIcRILBrmkcZNnJxFKiHNJ+NcZQIDAQAB" -} \ No newline at end of file +} diff --git a/src/pages/background/background.js b/src/pages/background/background.js index c0b1b73f..e54627c4 100644 --- a/src/pages/background/background.js +++ b/src/pages/background/background.js @@ -237,7 +237,7 @@ function changeWholeInstance(url) { browser.commands.onCommand.addListener( command => { if (command === 'switchInstance') - chrome.tabs.query( + browser.tabs.query( { active: true, currentWindow: true }, tabs => { let url; @@ -252,13 +252,13 @@ browser.commands.onCommand.addListener( browser.menus.create({ id: "settings", - title: "Settings", + title: browser.i18n.getMessage("Settings"), contexts: ["browser_action"] }); browser.menus.create({ id: "switchInstance", - title: "Switch Instance", + title: chrome.i18n.getMessage("switchInstance"), contexts: ["browser_action"] }); @@ -272,4 +272,4 @@ browser.menus.onClicked.addListener((info, tab) => { } else if (info.menuItemId == 'settings') browser.runtime.openOptionsPage() -}); \ No newline at end of file +}); diff --git a/src/pages/errors/instance_offline.html b/src/pages/errors/instance_offline.html index 09ffb431..4c47997b 100644 --- a/src/pages/errors/instance_offline.html +++ b/src/pages/errors/instance_offline.html @@ -5,7 +5,7 @@ - Instance is offline + Instance is offline