diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index de99921f..d27c4b9c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -25,16 +25,14 @@ If your changes include visual modifications, please include screenshots to demo Select the installation methods on which you tested your changes: -- [ ] Flatpak +- [ ] Flatpak or GNOME Builder - [ ] Snap -- [ ] Native version from this repository ## Checklist - [ ] I have read the [contributing guidelines](https://github.com/vikdevelop/SaveDesktop/blob/main/CONTRIBUTING.md). - [ ] I have performed a self-review of my code. - [ ] I have commented my code where necessary. -- [ ] I have updated the documentation accordingly. - [ ] My changes do not introduce any new warnings. ## Additional Notes diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a57a769..2b201b7f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + - name: Validate AppStream metainfo + run: | + appstreamcli validate data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in + - name: Install dependencies run: | sudo apt update @@ -24,13 +28,9 @@ jobs: flatpak install --user -y flathub org.gnome.Platform//48 flatpak install --user -y flathub org.gnome.Sdk//48 - - name: Validate AppStream metainfo - run: | - appstreamcli validate flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml - - name: Build Flatpak run: | - flatpak-builder --force-clean --repo=sdrepo build io.github.vikdevelop.SaveDesktop.yaml + flatpak-builder --force-clean --sandbox --repo=sdrepo build io.github.vikdevelop.SaveDesktop.json flatpak build-bundle sdrepo io.github.vikdevelop.SaveDesktop.flatpak io.github.vikdevelop.SaveDesktop - name: Upload Flatpak artifact diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5216fdae --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Build artifacts +build/ +build-dir/ +.flatpak-builder/ +.buildconfig + +# IDE/Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Python +__pycache__/ +*.pyc +*.pyo +*.egg-info/ + +# Temporary files +*.tmp +*.bak +*.orig +*.log + +# OS specific +.DS_Store +Thumbs.db + +# Meson specific +builddir/ +subprojects/*/ \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c464f4a2..61ac8c6d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,34 +11,20 @@ It is also possible to translate the application wiki using the same tool [here] To add or modify an existing language, you must be registered for Weblate, which can be done via email, a Github or Google account, and many other services. ## Involvement in development -The SaveDesktop application is written in Python 3 using [GTK 4.0](https://docs.gtk.org/gtk4/) and [LibAdwaita](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/index.html) libraries, so if you have knowledge of Python and, ideally, in combination with these libraries, your contributions are welcome! +The application is written in Python 3 using [GTK 4.0](https://docs.gtk.org/gtk4/) and [LibAdwaita](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/index.html) libraries, so if you have knowledge of Python and, ideally, in combination with these libraries, your contributions are welcome! If you don't know how to contribute specifically, you can check out the [issues marked as “good first issue”](https://github.com/vikdevelop/SaveDesktop/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). -No Python knowledge? Never mind. For example, you can contribute to the [application wiki](https://github.com/vikdevelop/SaveDesktop/tree/webpage/wiki) (improve webpage style, add screenshots in the `wiki/synchronization/screenshots` directory, etc.) +No Python knowledge? Never mind. For example, you can contribute to the [application wiki](https://github.com/vikdevelop/SaveDesktop/tree/webpage/wiki) (e.g. improve webpage style) ### So how to proceed? -1. Fork this repository *(see the [Github docs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) for more information)* -2. Go to your fork of this repository *(e.g., https://github.com//SaveDesktop)* -3. Make changes you want -4. If you want to test your changes, you can proceed as follows: - - clone your fork - ```bash - git clone https://github.com//SaveDesktop - ``` - - go to the cloned fork folder - ```bash - cd SaveDesktop - ``` - - build the application using Flatpak Builder - - if you have not installed org.gnome.Sdk (the latest version) runtime, install it using this command: `flatpak install runtime/org.gnome.Sdk/x86_64/[GNOME's latest version] -y` - ```bash - flatpak-builder build *.yaml --install --user - ``` - - alternatively, you can build a native version as follows (assuming you have GTK 4.0 and LibAdwaita libraries in the latest version): - ```bash - sh native/directories.sh --install - ``` -5. Once you are happy with your changes, submit a pull request to this repository, which I will review and merge with my repository if necessary. +1. Fork this repository +2. Clone your fork in GNOME Builder +3. Make and test your changes +4. Open terminal (Ctrl+Shift+T) and run: + ```bash + git add . && git commit -m "Describe your changes" && git push + ``` +5. Create pull request on GitHub *It should be noted that this app is available under the [GNU GPL 3.0](https://github.com/vikdevelop/SaveDesktop/blob/main/LICENSE) license, so it is necessary to follow the license conditions.* diff --git a/README.md b/README.md index 412a746d..0365822b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

Save Desktop

Save your desktop configuration

@@ -148,25 +148,12 @@ NOTE: It can happen that a backup file will not be created, in that case, just a ### Stable releases -- Flathub Download on Flathub -- Snap - Get it from the Snap Store -- Install on the system (native version) - - ```bash - # Install - wget -qO /tmp/savedesktop-native-installer.py https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/native/native_installer.py && python3 /tmp/savedesktop-native-installer.py --install - - # Remove - wget -qO /tmp/savedesktop-native-installer.py https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/native/native_installer.py && python3 /tmp/savedesktop-native-installer.py --remove - ``` - ### Beta releases If you want to help with the testing of the future releases of this app, you can use one of these options: @@ -185,20 +172,16 @@ To install the Save Desktop Beta, run the following command: ``` snap install savedesktop --beta ``` -#### 3. Flatpak Builder -Before building this app using Flatpak Builder, ensure if you have installed org.gnome.Sdk runtime. If not, use this command: `flatpak install org.gnome.Sdk//48` - -Then, you can continue in building this app using Flatpak Builder by entering this command: - -``` -git clone https://github.com/vikdevelop/SaveDesktop && cd SaveDesktop && flatpak-builder build *.yaml --install --user -``` +#### 3. GNOME Builder +1. Install GNOME Builder from [Flathub](https://flathub.org/apps/org.gnome.Builder) +2. Click on the "Clone repository" button and enter URL of this repository +3. Click on the Run button (Ctrl+Shift+Space)
-

Contribution

Translations, reporting issues, contributing and code of conduct

+

Contribution

Code of Conduct, translations and reporting issues

### Code of Conduct diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..748d4c9d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,20 @@ +# Security Policy +### Reporting Security Issues + +If you discover a vulnerability, please **don't open a public issue.** + +Instead, report it privately to the maintainer via one of the following methods: +- GitHub Security Advisory: use the _Security_ tab +- Email: vikdevelop@proton.me + +### Distribution +The application is officially distributed through **Flathub** and the **Snap Store**, both with automatic updates. + +Unofficial, community-maintained packages may also exist for other platforms or distributions (e.g. AUR, PPAs, third-party repositories). + +Please note that these builds are **not officially supported** by the maintainer. + +- **Security vulnerabilities in the application itself** should always be reported directly to the maintainer (see above). +- **Issues related to unofficial packages** (e.g. build errors, missing dependencies, outdated versions) should be reported to the respective package maintainer. + +Thank you for helping keep this project secure by reporting issues responsibly! diff --git a/flatpak/icons/io.github.vikdevelop.SaveDesktop.Devel.svg b/data/icons/hicolor/scalable/apps/io.github.vikdevelop.SaveDesktop.Devel.svg similarity index 100% rename from flatpak/icons/io.github.vikdevelop.SaveDesktop.Devel.svg rename to data/icons/hicolor/scalable/apps/io.github.vikdevelop.SaveDesktop.Devel.svg diff --git a/flatpak/icons/io.github.vikdevelop.SaveDesktop.svg b/data/icons/hicolor/scalable/apps/io.github.vikdevelop.SaveDesktop.svg similarity index 100% rename from flatpak/icons/io.github.vikdevelop.SaveDesktop.svg rename to data/icons/hicolor/scalable/apps/io.github.vikdevelop.SaveDesktop.svg diff --git a/data/icons/hicolor/scalable/status/done.svg b/data/icons/hicolor/scalable/status/done.svg new file mode 100644 index 00000000..fe96938a --- /dev/null +++ b/data/icons/hicolor/scalable/status/done.svg @@ -0,0 +1,4 @@ + + + + diff --git a/flatpak/icons/io.github.vikdevelop.SaveDesktop-symbolic.svg b/data/icons/hicolor/symbolic/apps/io.github.vikdevelop.SaveDesktop-symbolic.svg similarity index 100% rename from flatpak/icons/io.github.vikdevelop.SaveDesktop-symbolic.svg rename to data/icons/hicolor/symbolic/apps/io.github.vikdevelop.SaveDesktop-symbolic.svg diff --git a/flatpak/icons/io.github.vikdevelop.SaveDesktop.Source.svg b/data/icons/io.github.vikdevelop.SaveDesktop.Source.svg similarity index 100% rename from flatpak/icons/io.github.vikdevelop.SaveDesktop.Source.svg rename to data/icons/io.github.vikdevelop.SaveDesktop.Source.svg diff --git a/data/icons/meson.build b/data/icons/meson.build new file mode 100644 index 00000000..fe5c942f --- /dev/null +++ b/data/icons/meson.build @@ -0,0 +1,25 @@ +application_id = 'io.github.vikdevelop.SaveDesktop' + +# Scalable app icons +scalable_apps_dir = join_paths('hicolor', 'scalable', 'apps') +install_data( + files( + join_paths(scalable_apps_dir, ('@0@.svg').format(application_id)), + join_paths(scalable_apps_dir, ('@0@.Devel.svg').format(application_id)) + ), + install_dir: join_paths(get_option('datadir'), 'icons', scalable_apps_dir) +) + +# Scalable status icon +scalable_status_dir = join_paths('hicolor', 'scalable', 'status') +install_data( + files(join_paths(scalable_status_dir, 'done.svg')), + install_dir: join_paths(get_option('datadir'), 'icons', scalable_status_dir) +) + +# Symbolic app icon +symbolic_apps_dir = join_paths('hicolor', 'symbolic', 'apps') +install_data( + files(join_paths(symbolic_apps_dir, ('@0@-symbolic.svg').format(application_id))), + install_dir: join_paths(get_option('datadir'), 'icons', symbolic_apps_dir) +) \ No newline at end of file diff --git a/data/io.github.vikdevelop.SaveDesktop.desktop.in b/data/io.github.vikdevelop.SaveDesktop.desktop.in new file mode 100644 index 00000000..78d7b65d --- /dev/null +++ b/data/io.github.vikdevelop.SaveDesktop.desktop.in @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Save Desktop +Categories=Utility +Comment=Save your desktop configuration +Exec=savedesktop +Type=Application +Icon=io.github.vikdevelop.SaveDesktop diff --git a/flatpak/io.github.vikdevelop.SaveDesktop.gschema.xml b/data/io.github.vikdevelop.SaveDesktop.gschema.xml similarity index 99% rename from flatpak/io.github.vikdevelop.SaveDesktop.gschema.xml rename to data/io.github.vikdevelop.SaveDesktop.gschema.xml index e59131cc..5b4bb015 100644 --- a/flatpak/io.github.vikdevelop.SaveDesktop.gschema.xml +++ b/data/io.github.vikdevelop.SaveDesktop.gschema.xml @@ -2,7 +2,7 @@ - (570, 570) + (630, 517) Window size diff --git a/flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml b/data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in similarity index 65% rename from flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml rename to data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in index 9c59657e..9708486d 100644 --- a/flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml +++ b/data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in @@ -36,72 +36,42 @@ https://hosted.weblate.org/projects/vikdevelop/savedesktop/ https://github.com/vikdevelop/SaveDesktop/blob/main/CONTRIBUTING.md - Save your desktop configuration - Uložte konfiguraci plochy - Sauvegarder la configuration actuelle de votre environnement de bureau - Salve a configuração da sua área de trabalho - Salva la configurazione del tuo desktop - Sla de huidige voorkeuren van uw werkomgeving op - احفظ التخصيصات الحالية لبيئة سطح المكتب الخاص بك - Сохраните конфигурацию вашего окружения рабочего стола - Simpan konfigurasi lingkungan desktop Anda saat ini - Lagre nåværende oppsett av skrivebordsmiljøet ditt - Збережіть конфігурацію вашої стільниці - Mentsd el az asztali környezeted jelenlegi konfigurációját - Guardar la configuración del escritorio - Masaüstünün şuanki ayarlarını kayıt et - Speichern Sie die aktuelle Konfiguration Ihrer Desktop-Umgebung - 保存您的桌面环境配置 - Desa la configuració actual del vostre entorn d'escriptori - अपना डेस्कटॉप विन्यास सहेजें - Grave a sua configuração da área de trabalho - Tallenna työpöytäsi määritys - Spara din skrivbordskonfiguration - Salvesta oma töölaua seadistused - உங்கள் டெச்க்டாப் உள்ளமைவைச் சேமிக்கவும் + Save your desktop configuration -

Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click.

-

Save Desktop umožňuje uložit aktuální konfiguraci (motivy, ikony, tapety, všechna nastavení prostředí, rozšíření atd.) jedním kliknutím.

-

Save Desktop vous permet de sauvegarder votre configuration actuelle (thèmes, icônes, fonds d'écran, tous les paramètres de l'environnement de bureau, les extensions, en un seul clic.

-

Save Desktop permite que você salve sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um único clique.

-

Desideri salvare la tua configurazione corrente inclusi temi, icone, sfondi, tutte le impostazioni dell'ambiente desktop, estensioni e così via? Save Desktop può aiutarti in questo. Basta un clic e hai la tua configurazione salvata.

-

Wilt u uw huidige voorkeuren (thema's, pictogrammen, bureaubladachtergronden, systeemvoorkeuren, uitbreidingen, etc.) opslaan? SaveDesktop kan u hierbij helpen. Met slechts één muisklik wordt alles opgeslagen.

-

هل ترغب في حفظ التخصيصات الحالي الخاص بك بما في ذلك السمات والرموز والخلفيات وجميع إعدادات بيئة سطح المكتب والإضافات وما إلى ذلك؟ يمكن أن يساعدك Save Desktop في ذلك. بنقرة واحدة فقط ويتم حفظ التخصيصات الخاص بك.

-

Вы хотите сохранить текущую конфигурацию, включая темы, значки, обои, все настройки окружения рабочего стола, расширения и т.д.? Save Desktop поможет вам в этом. Всего один клик - и ваша конфигурация сохранена.

-

Save Desktop memungkinkan Anda menyimpan konfigurasi saat ini (tema, ikon, wallpaper, semua pengaturan lingkungan desktop, ekstensi, dll.) dengan satu klik.

-

Save Desktop lar deg lagre ditt nåværende oppsett (drakter, ikoner, bakgrunnsbilder, alle skrivebordsmiljøinnstillinger, utvidelser, osv.) med ett klikk.

-

Save Desktop дозволяє зберегти поточну конфігурацію (теми, значки, шпалери, всі налаштування середовища робочого столу, розширення тощо) одним клацанням миші.

-

Save Desktop lehetővé teszi, hogy egy gombnyomással elmentsd a jelenlegi konfigurációdat (témákat, ikonokat, háttereket, az összes asztali környezeti beállítást, kiegészítéseket, stb.).

-

Save Desktop te permite guardar tu configuración actual (temas, iconos, fondos de pantalla, todos los ajustes del entorno del escritorio, extensiones, etc.) con un solo clic.

-

Save Desktop senin suanki ayarlarını(temalar,iconlar,duvar kağıtları, tüm masaüstü ortam ayları , eklentiler , vb.) tek tıkla kaydetmene izin verir.

-

Mit Save Desktop können Sie Ihre aktuelle Konfiguration (Designs, Symbole, Hintergrundbilder, alle Einstellungen der Desktop-Umgebung, Erweiterungen usw.) mit einem Klick speichern.

-

Save Desktop 可让您一键保存当前配置(主题、图标、壁纸、所有桌面环境设置、扩展等)。

-

El Save Desktop us permet desar la configuració actual (temes, icones, fons de pantalla, totes les opcions de configuració de l'entorn d'escriptori, complements, etc.) amb un sol clic.

-

Save Desktop आपको एक क्लिक से अपने वर्तमान विन्यास (थीम, आइकन, वॉलपेपर, सभी डेस्कटॉप वातावरण सेटिंग्स, एक्सटेंशन इत्यादि) को सहेजने देता है।

-

Save Desktop permite gravar a sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um clique.

-

Save Desktopin avulla voit tallentaa työpöytäympäristösi määrityksen (teemat, kuvakkeet, taustakuvat, kaikki työpöytäympäristön asetukset, laajennukset jne.) yhdellä napsautuksella.

-

Save Desktop låter dig spara din nuvarande konfiguration (teman, ikoner, bakgrundsbilder, alla skrivbordsmiljöinställningar, tillägg, etc.) med ett klick.

-

Save Desktop võimaldab sul ühe klõpsuga salvestada (ja seega ka varundada) oma töölaua seadistused (kujundus, ikoonid, taustapildid, kõik töölauakeskkonna seadistused, lisamoodulid, jne).

-

உங்கள் தற்போதைய உள்ளமைவை (கருப்பொருள்கள், சின்னங்கள், வால்பேப்பர்கள், அனைத்து டெச்க்டாப் சுற்றுச்சூழல் அமைப்புகள், நீட்டிப்புகள் போன்றவை) ஒரே கிளிக்கில் சேமிக்க சேமிப்பக்டாப் உங்களை அனுமதிக்கிறது.

+

Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click.

- Configuration save page + Save + https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/flatpak/screenshots/save_page.png - Configuration import page + Import + https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/flatpak/screenshots/import_page.png - Configuration synchronization page + Sync + https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/flatpak/screenshots/sync_page.png + + https://github.com/vikdevelop/SaveDesktop/releases/tag/3.7-beta + +
    +
  • Transition to the Meson build system
  • +
  • Refactored code base
  • +
  • Removed the "Use Syncthing folder instead" from the Initial Synchronization setup dialog for GNOME-based environments
  • +
  • Other minor UI improvements
  • +
+
+
    @@ -363,3 +333,4 @@ + diff --git a/data/io.github.vikdevelop.SaveDesktop.service.in b/data/io.github.vikdevelop.SaveDesktop.service.in new file mode 100644 index 00000000..d4b41abb --- /dev/null +++ b/data/io.github.vikdevelop.SaveDesktop.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=io.github.vikdevelop.SaveDesktop +Exec=@bindir@/savedesktop --gapplication-service diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 00000000..1626be19 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,46 @@ +desktop_file = i18n.merge_file( + input: 'io.github.vikdevelop.SaveDesktop.desktop.in', + output: 'io.github.vikdevelop.SaveDesktop.desktop', + type: 'desktop', + po_dir: '../po', + install: true, + install_dir: get_option('datadir') / 'applications' +) + +desktop_utils = find_program('desktop-file-validate', required: false) +if desktop_utils.found() + test('Validate desktop file', desktop_utils, args: [desktop_file]) +endif + +appstream_file = i18n.merge_file( + input: 'io.github.vikdevelop.SaveDesktop.metainfo.xml.in', + output: 'io.github.vikdevelop.SaveDesktop.metainfo.xml', + po_dir: '../po', + install: true, + install_dir: get_option('datadir') / 'metainfo' +) + +appstreamcli = find_program('appstreamcli', required: false, disabler: true) +test('Validate appstream file', appstreamcli, + args: ['validate', '--no-net', '--explain', appstream_file]) + +install_data('io.github.vikdevelop.SaveDesktop.gschema.xml', + install_dir: get_option('datadir') / 'glib-2.0' / 'schemas' +) + +compile_schemas = find_program('glib-compile-schemas', required: false, disabler: true) +test('Validate schema file', + compile_schemas, + args: ['--strict', '--dry-run', meson.current_source_dir()]) + + +service_conf = configuration_data() +service_conf.set('bindir', get_option('prefix') / get_option('bindir')) +configure_file( + input: 'io.github.vikdevelop.SaveDesktop.service.in', + output: 'io.github.vikdevelop.SaveDesktop.service', + configuration: service_conf, + install_dir: get_option('datadir') / 'dbus-1' / 'services' +) + +subdir('icons') diff --git a/flatpak/screenshots/import_page.png b/data/screenshots/import_page.png similarity index 100% rename from flatpak/screenshots/import_page.png rename to data/screenshots/import_page.png diff --git a/flatpak/screenshots/import_page_dark.png b/data/screenshots/import_page_dark.png similarity index 100% rename from flatpak/screenshots/import_page_dark.png rename to data/screenshots/import_page_dark.png diff --git a/flatpak/screenshots/save_page.png b/data/screenshots/save_page.png similarity index 100% rename from flatpak/screenshots/save_page.png rename to data/screenshots/save_page.png diff --git a/flatpak/screenshots/save_page_dark.png b/data/screenshots/save_page_dark.png similarity index 100% rename from flatpak/screenshots/save_page_dark.png rename to data/screenshots/save_page_dark.png diff --git a/flatpak/screenshots/sync_page.png b/data/screenshots/sync_page.png similarity index 100% rename from flatpak/screenshots/sync_page.png rename to data/screenshots/sync_page.png diff --git a/flatpak/screenshots/sync_page_dark.png b/data/screenshots/sync_page_dark.png similarity index 100% rename from flatpak/screenshots/sync_page_dark.png rename to data/screenshots/sync_page_dark.png diff --git a/flatpak/icons/i b/flatpak/icons/i deleted file mode 100644 index 8b137891..00000000 --- a/flatpak/icons/i +++ /dev/null @@ -1 +0,0 @@ - diff --git a/flatpak/io.github.vikdevelop.SaveDesktop.desktop b/flatpak/io.github.vikdevelop.SaveDesktop.desktop deleted file mode 100644 index 5ddac223..00000000 --- a/flatpak/io.github.vikdevelop.SaveDesktop.desktop +++ /dev/null @@ -1,29 +0,0 @@ -[Desktop Entry] -Name=Save Desktop -Categories=Utility -Comment=Save your desktop configuration -Comment[cs]=Uložte konfiguraci plochy -Comment[fr]=Sauvegarder la configuration actuelle de votre environnement de bureau -Comment[pt_BR]=Salve a configuração da sua área de trabalho -Comment[it]=Salva la configurazione del tuo desktop -Comment[nl]=Sla de huidige voorkeuren van uw werkomgeving op -Comment[ar]=احفظ التخصيصات الحالية لبيئة سطح المكتب الخاص بك -Comment[ru]=Сохраните конфигурацию вашего окружения рабочего стола -Comment[id]=Simpan konfigurasi lingkungan desktop Anda saat ini -Comment[uk]=Збережіть конфігурацію вашої стільниці -Comment[nb_NO]=Lagre nåværende oppsett av skrivebordsmiljøet ditt -Comment[hu]=Mentsd el az asztali környezeted jelenlegi konfigurációját -Comment[es]=Guardar la configuración del escritorio -Comment[tr]=Masaüstünün şuanki ayarlarını kayıt et -Comment[de]=Speichern Sie die aktuelle Konfiguration Ihrer Desktop-Umgebung -Comment[zh]=保存您的桌面环境配置 -Comment[ca]=Desa la configuració actual del vostre entorn d'escriptori -Comment[hi]=अपना डेस्कटॉप विन्यास सहेजें -Comment[pt]=Grave a sua configuração da área de trabalho -Comment[fi]=Tallenna työpöytäsi määritys -Comment[sv]=Spara din skrivbordskonfiguration -Comment[et]=Salvesta oma töölaua seadistused -Comment[ta]=உங்கள் டெச்க்டாப் உள்ளமைவைச் சேமிக்கவும் -Exec=savedesktop -Type=Application -Icon=io.github.vikdevelop.SaveDesktop diff --git a/flatpak/symbolic-icons/desktop-symbolic.svg b/flatpak/symbolic-icons/desktop-symbolic.svg deleted file mode 100644 index 3e68cb29..00000000 --- a/flatpak/symbolic-icons/desktop-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flatpak/symbolic-icons/done.svg b/flatpak/symbolic-icons/done.svg deleted file mode 100644 index a4339903..00000000 --- a/flatpak/symbolic-icons/done.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/io.github.vikdevelop.SaveDesktop.json b/io.github.vikdevelop.SaveDesktop.json new file mode 100644 index 00000000..db3aa90a --- /dev/null +++ b/io.github.vikdevelop.SaveDesktop.json @@ -0,0 +1,124 @@ +{ + "app-id" : "io.github.vikdevelop.SaveDesktop", + "desktop-file-name-suffix" : " (Master)", + "runtime" : "org.gnome.Platform", + "runtime-version" : "48", + "sdk" : "org.gnome.Sdk", + "command" : "savedesktop", + "finish-args" : [ + "--share=ipc", + "--socket=wayland", + "--socket=fallback-x11", + "--device=dri", + "--filesystem=xdg-run/gvfs", + "--filesystem=xdg-run/gvfsd", + "--filesystem=~/.config", + "--filesystem=~/.local/share", + "--filesystem=xdg-download", + "--filesystem=xdg-music", + "--filesystem=xdg-videos", + "--filesystem=xdg-documents", + "--filesystem=xdg-public-share", + "--filesystem=xdg-pictures", + "--filesystem=xdg-desktop", + "--filesystem=~/.themes:create", + "--filesystem=~/.icons:create", + "--filesystem=~/.cinnamon:create", + "--filesystem=~/.xfce4:create", + "--filesystem=~/.fonts:create", + "--filesystem=/var/lib/flatpak:ro", + "--filesystem=~/.local/share/flatpak/app:ro", + "--filesystem=~/.var/app:ro", + "--talk-name=org.gnome.SessionManager", + "--talk-name=org.xfce.SessionManager", + "--talk-name=org.kde.LogoutPrompt", + "--talk-name=com.system76.CosmicSession", + "--talk-name=org.freedesktop.FileManager1", + "--env=DCONF_USER_CONFIG_DIR=.config/dconf", + "--filesystem=xdg-run/dconf", + "--talk-name=ca.desrt.dconf" + ], + "modules" : [ + { + "name" : "7zip", + "buildsystem" : "simple", + "subdir" : "CPP/7zip/Bundles/Alone2", + "build-commands" : [ + "make -j $FLATPAK_BUILDER_N_JOBS -f makefile.gcc", + "install -D ./_o/7zz -t /app/bin", + "ln -s /app/bin/7zz /app/bin/7z" + ], + "sources" : [ + { + "type" : "git", + "url" : "https://github.com/ip7z/7zip.git", + "tag" : "25.01", + "commit" : "5e96a8279489832924056b1fa82f29d5837c9469" + } + ], + "x-checker-data" : { + "type" : "git", + "tag-pattern" : "^([\\d.]+)$" + } + }, + { + "name" : "dconf-amd64", + "only-arches" : [ + "x86_64" + ], + "buildsystem" : "simple", + "build-commands" : [ + "cp -R * /app" + ], + "sources" : [ + { + "type" : "archive", + "url" : "https://github.com/vikdevelop/SaveDesktop/releases/download/2.9.5n/dconf_build.tar.xz", + "sha256" : "164fc714f96ef4b348665fc3617f54cfa5acf12df5c039d7a9d21ba1d86a2f2d" + } + ] + }, + { + "name" : "dconf-aarch64", + "only-arches" : [ + "aarch64" + ], + "buildsystem" : "meson", + "config-opts" : [ + "-Dsystemduserunitdir=/app/lib/systemd/user/", + "-Dbash_completion=false", + "-Dman=false" + ], + "cleanup" : [ + "/include", + "/lib/pkgconfig", + "/libexec", + "/share/dbus-1" + ], + "sources" : [ + { + "type" : "archive", + "url" : "https://download.gnome.org/sources/dconf/0.40/dconf-0.40.0.tar.xz", + "sha256" : "cf7f22a4c9200421d8d3325c5c1b8b93a36843650c9f95d6451e20f0bcb24533" + } + ] + }, + { + "name" : "savedesktop", + "builddir" : true, + "buildsystem" : "meson", + "sources" : [ + { + "type" : "dir", + "path" : "." + } + ], + "config-opts" : [ + "--libdir=lib" + ] + } + ], + "build-options" : { + "env" : { } + } +} diff --git a/io.github.vikdevelop.SaveDesktop.yaml b/io.github.vikdevelop.SaveDesktop.yaml deleted file mode 100644 index 9bc7fa0f..00000000 --- a/io.github.vikdevelop.SaveDesktop.yaml +++ /dev/null @@ -1,115 +0,0 @@ -app-id: io.github.vikdevelop.SaveDesktop -desktop-file-name-suffix: ' (Master)' -runtime: org.gnome.Platform -runtime-version: '48' -sdk: org.gnome.Sdk -command: savedesktop -finish-args: - - --share=ipc - - --socket=wayland - - --socket=fallback-x11 - - --device=dri - # for opening cloud folders properly - - --filesystem=xdg-run/gvfs - - --filesystem=xdg-run/gvfsd - # load Desktop environment config files - - --filesystem=~/.config - # load Desktop environment data files (e.g. backgrounds, extensions, etc.) - - --filesystem=~/.local/share - # to be able to select destination for saving configuration in also these directories - - --filesystem=xdg-download - - --filesystem=xdg-music - - --filesystem=xdg-videos - - --filesystem=xdg-documents - - --filesystem=xdg-public-share - - --filesystem=xdg-pictures - - --filesystem=xdg-desktop - # save all themes installed in home folder - - --filesystem=~/.themes:create - # save all icons installed in home folder - - --filesystem=~/.icons:create - # save cinnamon config in home directory - - --filesystem=~/.cinnamon:create - # save xfce config in home directory - - --filesystem=~/.xfce4:create - # save all fonts installed in home directory - - --filesystem=~/.fonts:create - # save a list of installed flatpak apps - - --filesystem=/var/lib/flatpak:ro - - --filesystem=~/.local/share/flatpak/app:ro - # save user data of installed flatpak apps - - --filesystem=~/.var/app:ro - # log out from session (GNOME-based environments) for changes to the desktop configuration to take effect - - --talk-name=org.gnome.SessionManager - # log out from session (Xfce) for changes to the Xfce desktop configuration to take effect - - --talk-name=org.xfce.SessionManager - # log out from session (KDE5) for changes to the KDE5 desktop configuration to take effect - - --talk-name=org.kde.LogoutPrompt - # log out from session (COSMIC Rust) for changes to the COSMIC Rust desktop configuration to take effect - - --talk-name=com.system76.CosmicSession - # ensuring to FileChooserNative will work correctly - - --talk-name=org.freedesktop.FileManager1 - - --env=DCONF_USER_CONFIG_DIR=.config/dconf - - --filesystem=xdg-run/dconf - - --talk-name=ca.desrt.dconf -modules: - - name: 7zip - buildsystem: simple - subdir: CPP/7zip/Bundles/Alone2 - build-commands: - - make -j $FLATPAK_BUILDER_N_JOBS -f makefile.gcc - - install -D ./_o/7zz -t /app/bin - - ln -s /app/bin/7zz /app/bin/7z - sources: - - type: git - url: https://github.com/ip7z/7zip.git - tag: '25.01' - commit: 5e96a8279489832924056b1fa82f29d5837c9469 - x-checker-data: - type: git - tag-pattern: ^([\d.]+)$ - - name: dconf-amd64 - only-arches: ['x86_64'] - buildsystem: simple - build-commands: - - cp -R * /app - sources: - - type: archive - url: https://github.com/vikdevelop/SaveDesktop/releases/download/2.9.5n/dconf_build.tar.xz - sha256: 164fc714f96ef4b348665fc3617f54cfa5acf12df5c039d7a9d21ba1d86a2f2d - - name: dconf-aarch64 - only-arches: ['aarch64'] - buildsystem: meson - config-opts: - - "-Dsystemduserunitdir=/app/lib/systemd/user/" - - "-Dbash_completion=false" - - "-Dman=false" - cleanup: - - "/include" - - "/lib/pkgconfig" - - "/libexec" - - "/share/dbus-1" - sources: - - type: archive - url: https://download.gnome.org/sources/dconf/0.40/dconf-0.40.0.tar.xz - sha256: cf7f22a4c9200421d8d3325c5c1b8b93a36843650c9f95d6451e20f0bcb24533 - - name: savedesktop - buildsystem: simple - build-commands: - - install -Dm755 -t /app/bin savedesktop - - cp -R src/* /app - - install -D -t /app/share/applications flatpak/io.github.vikdevelop.SaveDesktop.desktop - - install -D -t /app/share/icons/hicolor/scalable/apps flatpak/icons/io.github.vikdevelop.SaveDesktop.svg - - install -D -t /app/share/icons/hicolor/scalable/apps flatpak/icons/io.github.vikdevelop.SaveDesktop.Devel.svg - - install -D -t /app/share/icons/hicolor/symbolic/apps flatpak/icons/io.github.vikdevelop.SaveDesktop-symbolic.svg - - install -D -t /app/share/icons/hicolor/128x128/apps flatpak/symbolic-icons/exclamation_mark.png - - install -D -t /app/share/icons/hicolor/128x128/apps flatpak/symbolic-icons/desktop-symbolic.svg - - install -D -t /app/share/icons/hicolor/128x128/apps flatpak/symbolic-icons/list-view.png - - install -D -t /app/share/icons/hicolor/128x128/apps flatpak/symbolic-icons/done.svg - - install -D -t /app/share/metainfo flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml - - install -D -t /app/share/glib-2.0/schemas flatpak/io.github.vikdevelop.SaveDesktop.gschema.xml - - glib-compile-schemas /app/share/glib-2.0/schemas - - cp -R translations /app/ - sources: - - type: dir - path: . diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..c8e4cc77 --- /dev/null +++ b/meson.build @@ -0,0 +1,18 @@ +project('savedesktop', + version: '3.7-beta', + meson_version: '>= 1.0.0', + default_options: [ 'warning_level=2', 'werror=false', ], +) + +i18n = import('i18n') +gnome = import('gnome') + +subdir('data') +subdir('src') +subdir('po') + +gnome.post_install( + glib_compile_schemas: true, + gtk_update_icon_cache: true, + update_desktop_database: true, +) diff --git a/native/directories.sh b/native/directories.sh deleted file mode 100644 index 40cec390..00000000 --- a/native/directories.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/bash - -if [ "$1" = "--install" ]; then - # Create cache and data dirs - mkdir -p ~/.cache/io.github.vikdevelop.SaveDesktop - mkdir -p ~/.local/share/io.github.vikdevelop.SaveDesktop - install -Dm755 -t ~/.local/bin savedesktop - install -D -t ~/.local/share/applications flatpak/io.github.vikdevelop.SaveDesktop.desktop - install -D -t ~/.local/share/metainfo flatpak/io.github.vikdevelop.SaveDesktop.metainfo.xml - install -D -t ~/.local/share/glib-2.0/schemas flatpak/io.github.vikdevelop.SaveDesktop.gschema.xml - install -D -t ~/.local/share/licenses/savedesktop LICENSE - mkdir -p ~/.local/share/savedesktop - cp -R src ~/.local/share/savedesktop/ - cp -R translations ~/.local/share/savedesktop/ - cp -R native/native_installer.py ~/.local/share/savedesktop/ - echo -e "[Desktop Entry]\nName=SaveDesktop Native Updater\nType=Application\nExec=python3 ${HOME}/.local/share/savedesktop/native_installer.py --update" > ~/.config/autostart/io.github.vikdevelop.SaveDesktop.Updater.desktop - export GSETTINGS_SCHEMA_DIR="$HOME/.local/share/glib-2.0/schemas:${GSETTINGS_SCHEMA_DIR}" - glib-compile-schemas ~/.local/share/glib-2.0/schemas - # Install app icons - install -D -t ~/.local/share/icons/hicolor/scalable/apps flatpak/icons/io.github.vikdevelop.SaveDesktop.svg - install -D -t ~/.local/share/icons/hicolor/symbolic/apps flatpak/icons/io.github.vikdevelop.SaveDesktop-symbolic.svg - install -D -t ~/.local/share/icons/hicolor/symbolic/apps flatpak/symbolic-icons/desktop-symbolic.svg - install -D -t ~/.local/share/icons/hicolor/symbolic/apps flatpak/symbolic-icons/list-view.png - install -D -t ~/.local/share/icons/hicolor/symbolic/apps flatpak/symbolic-icons/done.svg - install -D -t ~/.local/share/icons/hicolor/symbolic/apps flatpak/symbolic-icons/exclamation_mark.png - cd - echo "SaveDesktop has been installed! You can run it with this command: \"savedesktop\" or \"~/.local/bin/savedesktop\"." -fi - -if [ "$1" = "--remove" ]; then - rm ~/.local/bin/savedesktop - rm ~/.local/share/applications/io.github.vikdevelop.SaveDesktop.desktop - rm ~/.local/share/metainfo/io.github.vikdevelop.SaveDesktop.metainfo.xml - rm ~/.local/share/glib-2.0/schemas/io.github.vikdevelop.SaveDesktop.gschema.xml - rm -rf ~/.local/share/savedesktop - rm -rf ~/.local/share/licenses/savedesktop - # Remove app icons - rm ~/.local/share/icons/hicolor/scalable/apps/io.github.vikdevelop.SaveDesktop.svg - rm ~/.local/share/icons/hicolor/symbolic/apps/io.github.vikdevelop.SaveDesktop-symbolic.svg - rm ~/.local/share/icons/hicolor/symbolic/apps/desktop-symbolic.svg - rm ~/.local/share/icons/hicolor/symbolic/apps/list-view.png - rm ~/.local/share/icons/hicolor/symbolic/apps/done.svg - rm ~/.local/share/icons/hicolor/symbolic/apps/exclamation_mark.png - cd - echo "SaveDesktop has been removed." -fi diff --git a/native/native_installer.py b/native/native_installer.py deleted file mode 100644 index d5c7b62d..00000000 --- a/native/native_installer.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/python3 -import requests, json, os, sys, argparse, gi -gi.require_version('Gtk', '4.0') -gi.require_version('Adw', '1') -from gi.repository import Gtk, Adw -from pathlib import Path - -# Check GTK and LibAdwaita versions -gtk_ver = f"{Gtk.MAJOR_VERSION}.{Gtk.MINOR_VERSION}" -adw_ver = f"{Adw.MAJOR_VERSION}.{Adw.MINOR_VERSION}" - -if gtk_ver < "4.14" or adw_ver < "1.5": - print(f"You have installed an unsupported version of the GTK and LibAdwaita libraries, specifically you have GTK {gtk_ver} and LibAdwaita {adw_ver}. For proper functionality, you must have at least GTK 4.14 and LibAdwaita 1.5.") - print("If you want a simple solution to this problem, please install the Flatpak or Snap packages, which have available the necessary libraries available. The instructions are available here: https://github.com/vikdevelop/SaveDesktop?tab=readme-ov-file#installation") - exit() - -parser = argparse.ArgumentParser() -parser.add_argument("--install", help="Install SaveDesktop", action="store_true") -parser.add_argument("--remove", help="Remove SaveDesktop", action="store_true") -parser.add_argument("--update", help="Update SaveDesktop", action="store_true") - -args = parser.parse_args() - -def install(github_version): - os.makedirs("/tmp/SaveDesktop", exist_ok=True) - os.chdir("/tmp/SaveDesktop") - os.system(f"wget -c https://github.com/vikdevelop/SaveDesktop/archive/refs/tags/{github_version}.tar.gz") - os.system("tar -xf *.tar.gz") - os.chdir(f"SaveDesktop-{github_version}") - - os.system("wget -c https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/native/directories.sh") - os.system("sh directories.sh --install") - os.system("rm -rf /tmp/SaveDesktop") - -def remove(): - os.makedirs("/tmp/SaveDesktop", exist_ok=True) - os.chdir("/tmp/SaveDesktop") - os.system("wget -c https://raw.githubusercontent.com/vikdevelop/SaveDesktop/main/native/directories.sh") - os.system("sh directories.sh --remove") - os.system("rm -rf /tmp/SaveDesktop") - -if args.install: - response = requests.get("https://api.github.com/repos/vikdevelop/SaveDesktop/releases/latest") - github_version = response.json()["tag_name"] - install(github_version) - -if args.remove: - remove() - -if args.update: - response = requests.get("https://api.github.com/repos/vikdevelop/SaveDesktop/releases/latest") - github_version = response.json()["tag_name"] - - sys.path.append(f"{Path.home()}/.local/share/savedesktop") - os.chdir(f"{Path.home()}/.local/share/savedesktop") - from src.localization import * - os.chdir(f"{Path.home()}/.local/bin") - - d_ver = subprocess.getoutput("cat ~/.local/share/io.github.vikdevelop.SaveDesktop/version.txt") - - if not d_ver == f"{github_version}": - remove() - - install(github_version) - - with open(Path.home() / ".local/share/io.github.vikdevelop.SaveDesktop/version.txt", "w") as version_file: - version_file.write(github_version) - diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 00000000..84d19932 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,25 @@ +# Please keep this file sorted alphabetically. +ar +ca +cs +de +es +et +fi +fr +hi +hu +ia +id +it +nb_NO +nl +pl +pt_BR +pt +ru +sv +ta +tr +uk +zh_Hans diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 00000000..05557faa --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,13 @@ +# List of source files containing translatable strings. +# Please keep this file sorted alphabetically. +data/io.github.vikdevelop.SaveDesktop.desktop.in +data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in +data/io.github.vikdevelop.SaveDesktop.gschema.xml +src/core/synchronization.py +src/gui/more_options_dialog.py +src/gui/items_dialog.py +src/gui/password_checker.py +src/gui/shortcuts_window.ui +src/gui/synchronization_dialogs.py +src/gui/window.py +src/globals.py \ No newline at end of file diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 00000000..6f7a068a --- /dev/null +++ b/po/ar.po @@ -0,0 +1,456 @@ +# Translation file for ar +# Generated from ar.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "حفظ التخصيصات الحالية" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "قم بتعيين اسم الملف (بدون مسافات)" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Save installed Flatpak apps" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "تم حفظ التخصيصات!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "افتح المجلد" + +#: src/gui/window.py +msgid "Import" +msgstr "" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "استيراد تخصيصات محفوظة" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "إلغاء" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop ملفات" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "تم تطبيق التخصيصات!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "تسجيل الخروج" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "" + +#: src/gui/window.py +msgid "Sync" +msgstr "" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "انتظر من فضلك …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "حول التطبيق" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"بيئة سطح المكتب التي لديك غير مدعومة.\nالرجاء استخدام هذه البيئات: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "احفظ التخصيصات الحالية لبيئة سطح المكتب الخاص بك" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"هل ترغب في حفظ التخصيصات الحالي الخاص بك بما في ذلك السمات والرموز والخلفيات وجميع إعدادات بيئة سطح المكتب والإضافات وما إلى ذلك؟ يمكن أن يساعدك Save Desktop في ذلك. بنقرة واحدة فقط ويتم حفظ التخصيصات الخاص بك." + +#: src/main.py +msgid "Translator credits" +msgstr "Translator github-link" + diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 00000000..94fb8bd9 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,465 @@ +# Translation file for ca +# Generated from ca.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Desa" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Desa la configuració actual" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Nom del fitxer" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Elements que voleu incloure al fitxer de configuració" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Aquestes opcions afecten també a la còpia automàtica" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Icones" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temes" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Fons d'escriptori" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Escriptori" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Programari Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Llistat del programari Flatpak instal·lat" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Dades d'usuari del programari Flatpak instal·lat" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Selecció de dades d'aplicacions Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Més opcions" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Còpia automàtica" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Els canvis seran efectius al proper inici de sessió" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Mai" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Diàriament" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Setmanalment" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensualment" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manual" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Més informació" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Carpeta de destinació" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Trieu una carpeta on desar la còpia automàtica" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Trieu altra carpeta" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Format del nom de fitxer" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Restaura als valors per defecte" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Xifrat de ftxer" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"En desar la configuració de forma manual, si us demanarà crear una contrasenya. Això és útil quan deseu la configuració en mitjans extraïbles per mantenir segures les vostres dades." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Crea una contrasenya nova" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Creeu una contrasenya nova per al vostre fitxer. Es recomana emprar almenys 12 caràcters, incloent-hi majúscules, minúscules i caràcters especials." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Crea una contrasenya" + +#: src/gui/window.py +msgid "Password" +msgstr "Contrasenya" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Desbloca el fitxer amb una contrasenya" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Inseriu més avall una contrasenya per a desblocar el fitxer de configuració. Si l'oblideu, no podreu descomprimir el fitxer i aplicar la importació de la configuració." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Desant la configuració ...\nLa configuració del vostre escriptori es desarà a:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "S'ha desat la configuració!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nAra podeu revisar el fitxer amb la configuració del vostre escriptori, o tornar a la pàgina anterior.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Obre la carpeta" + +#: src/gui/window.py +msgid "Import" +msgstr "Importa" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importa una configuració" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Des d'un fitxer" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Cancel·la" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Fitxers del Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Important la configuració ...\nS'està important la configuració des de:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "S'ha aplicat la configuració!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nPodeu tancar la sessió ara perquè els canvis siguin aplicats, o podeu tornar a la pàgina anterior i tancar la sessió més tard.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Torna a la pàgina anterior" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Tanca la sessió" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "S'ha produït un error" + +#: src/gui/window.py +msgid "Apply" +msgstr "Aplica" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sincronitza" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sincronitzeu el vostre entorn d'escriptori amb altres equips de la xarxa." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Configura el fitxer de sincronització" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Fitxer de desat periòdic" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "No existeix el fitxer de desat periòdic." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Crea" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Un moment…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Canvia" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Connecta a l'emmagatzematge al núvol" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Obriu aquesta pàgina del Save Desktop a l'altre ordinador i feu clic al botó «Configura el fitxer de sincronització» per a realitzar els canvis necessaris. En aquest ordinador, seleccioneu la carpeta que heu sincronitzat amb l'emmagatzematge al núvol i on heu desat el fitxer de desament automàtic." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Selecciona la carpeta del núvol" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "No heu seleccionat cap carpeta del núvol!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sincronització periòdica" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Sincronització bidireccional" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"En habilitar-ho i seleccionar l'interval de la sincronització i la carpeta de la unitat al núvol, tota la informació del desament automàtic (interval, carpeta i nom de fitxer) de l'altre ordinador es copia en aquest mitjançant la sincronització indicada." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Ja podeu sincronitzar la configuració des del menú de la barra superior" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sincronitza manualment" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Dreceres de teclat" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Surt" + +#: src/gui/window.py +msgid "About app" +msgstr "Quant a..." + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Teniu un entorn d'escriptori no suportat. \nEl programa funciona amb: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Desa la configuració actual del vostre entorn d'escriptori" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"El Save Desktop us permet desar la configuració actual (temes, icones, fons de pantalla, totes les opcions de configuració de l'entorn d'escriptori, complements, etc.) amb un sol clic." + +#: src/main.py +msgid "Translator credits" +msgstr "BennyBeat https://github.com/BennyBeat" + diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 00000000..5c7c24e0 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,472 @@ +# Translation file for cs +# Generated from cs.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Uložit" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Uložit aktuální konfiguraci" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Nastavit název souboru" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Položky, které mají být zahrnuty do archivu konfigurace" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Tato nastavení platí i pro pravidelné ukládání" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikony" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Motivy" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Fonty" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Pozadí" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Rozšíření" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Plocha" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Aplikace Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Seznam nainstalovaných aplikací Flatpak" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Uživatelská data nainstalovaných aplikací Flatpak" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Výběr dat aplikací Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Více možností" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Pravidelné ukládání" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Změny se projeví až po dalším přihlášení" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nikdy" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Denně" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Týdně" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Měsíčně" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Ručně" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Zjistit více" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Složka pro pravidelné ukládání" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Vybrat vlastní složku pro pravidelné ukládání" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Vybrat jinou složku" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Formát názvu souboru" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Resetovat na výchozí" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Heslo pro šifrování" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Ruční ukládání" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Šifrování archivu" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Při ručním ukládání konfigurace budete vyzváni k vytvoření hesla. To je užitečné při ukládání konfigurace na přenosné médium pro lepší zabezpečení dat." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Uložit konfiguraci bez vytváření archivu" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Vytvořit nové heslo" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Vytvořte si prosím nové heslo pro svůj archiv. Kritéria zahrnují délku alespoň 12 znaků, jedno velké písmeno, jedno malé písmeno a jeden speciální znak." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Vygenerovat heslo" + +#: src/gui/window.py +msgid "Password" +msgstr "Heslo" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Odemknout archiv pomocí hesla" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Zadáním níže uvedeného hesla odemknete archiv s vaší konfigurací. Pokud jste ho zapomněli, nebudete moci archiv rozbalit a začít importovat konfiguraci." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "Zadejte prosím heslo k odemknutí archivu pro synchronizaci konfigurace" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Pro synchronizaci pomocí aplikace Save Desktop byl vybrán šifrovaný archiv. Pro jeho odemčení a spuštění synchronizace zadejte níže uvedené heslo." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Zapamatovat heslo" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Heslo nebylo zadáno, nebo je nesprávné. Nelze pokračovat." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Ukládání konfigurace … \nKonfigurace vašeho desktopového prostředí bude uložena v:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Konfigurace byla uložena!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nNyní si můžete prohlédnout archiv s konfigurací svého desktopového prostředí nebo se vrátit na předchozí stránku.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Otevřít složku" + +#: src/gui/window.py +msgid "Import" +msgstr "" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importovat již uloženou konfiguraci" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importovat ze souboru" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Importovat ze složky" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Zrušit" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Soubory Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importování konfigurace …\nImportování konfigurace z: \n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Konfigurace byla provedena!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nAby se změny projevily, můžete se ze systému odhlásit, nebo se vrátit na předchozí stránku a odhlásit se později.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Vrátit se na předchozí stránku" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Odhlásit se" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Došlo k chybě" + +#: src/gui/window.py +msgid "Apply" +msgstr "Použít" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synchronizovat" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Synchronizujte konfiguraci vašeho desktopového prostředí s ostatními počítači v síti." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Počáteční nastavení synchronizace" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Otevřete nastavení systému" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Přejděte do sekce Online účty" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"V této sekci vyberte požadovanou cloudovou službu, jako je Google, Microsoft 365 nebo Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. Klikněte na tlačítko Další a vyberte vytvořenou složku cloudové jednotky" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Vytvořenou složku cloudové jednotky je možné nalézt na postranním panelu dialogu pro výběr souborů v tomto tvaru: uzivatelskejmeno@sluzba.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Aby synchronizace fungovala správně, potřebujete mít složku, která je synchronizována s vaší cloudovou službou pomocí Rclone.\nZačněte výběrem používané cloudové služby." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Nyní zkopírujte příkaz pro nastavení Rclone pomocí postranního tlačítka a otevřete aplikaci Terminál pomocí klávesové zkratky Ctrl+Alt+T nebo ji najděte v nabídce aplikací." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Po dokončení nastavení Rclone pomocí uvedeného příkazu klikněte na tlačítko \"Apply\"" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Použít místo toho složku Syncthing" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Téměř hotovo!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Nyní máte vytvořenou složku cloudové jednotky! Klikněte na tlačítko Další pro dokončení nastavení." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Vybrat" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Další" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Nastavit synchronizační soubor" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Soubor pravidelného ukládání" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Soubor pravidelného ukládání neexistuje." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Vytvořit" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Počkejte prosím …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Změnit" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Připojit se ke cloudovému úložišti" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Na jiném počítači otevřete aplikaci Save Desktop a na této stránce klikněte na tlačítko „Nastavit synchronizační soubor“ a proveďte potřebná nastavení. Na tomto počítači vyberte složku, kterou jste synchronizovali s cloudovým úložištěm a do které jste také uložili stejný soubor pro pravidelné ukládání." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Vybrat cloudovou složku" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Nevybrali jste složku cloudové jednotky!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Pravidelná synchronizace" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Obousměrná synchronizace" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Pokud je tato funkce povolena a je vybrán interval synchronizace a složka cloudové jednotky, informace o pravidelném ukládání (interval, složka a název souboru) z druhého počítače s nastavenou synchronizací se zkopírují do tohoto počítače." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Od teď můžete synchronizovat konfiguraci z nabídky v záhlaví" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Synchronizovat ručně" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Klávesové zkratky" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Otevřít wiki aplikace" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Ukončit" + +#: src/gui/window.py +msgid "About app" +msgstr "O aplikaci" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Máte nainstalované nepodporované prostředí. \nPoužijte jedno z těchto prostředí: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Uložte konfiguraci plochy" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop umožňuje uložit aktuální konfiguraci (motivy, ikony, tapety, všechna nastavení prostředí, rozšíření atd.) jedním kliknutím." + +#: src/main.py +msgid "Translator credits" +msgstr "vikdevelop https://github.com/vikdevelop" + diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..98bc6275 --- /dev/null +++ b/po/de.po @@ -0,0 +1,456 @@ +# Translation file for de +# Generated from de.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Speichern" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Die aktuelle Konfiguration speichern" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Den Dateinamen festlegen" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Elemente, die in das Konfigurationsarchiv aufzunehmen sind" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Diese Einstellungen gelten auch für das periodische Speichern" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Symbole" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Themen" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Schriftarten" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Hintergründe" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak-Apps" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Regelmäßiges Speichern" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Die Änderungen werden erst nach der nächsten Anmeldung wirksam." + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nie" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Täglich" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Wöchentlich" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Monatlich" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Mehr erfahren" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Ordner für das periodische Speichern" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Benutzerdefinierten Ordner für das periodische Speichern auswählen" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Anderen Ordner auswählen" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Dateinamensformat" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Auf Standardeinstellungen zurücksetzen" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Speichert die Konfiguration ...\nDie Konfiguration ihrer Desktop Umgebung wird gespeichert in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Die Konfiguration wurde gespeichert!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Den Ordner öffnen" + +#: src/gui/window.py +msgid "Import" +msgstr "Importieren" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Die gespeicherte Konfiguration importieren" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Aus Datei importieren" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Abbrechen" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop Dateien" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Die Konfiguration wurde angewendet!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Zurück zur vorherigen Seite" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Ausloggen" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: src/gui/window.py +msgid "Apply" +msgstr "Anwenden" + +#: src/gui/window.py +msgid "Sync" +msgstr "" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Bitte warten …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "Über" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Sie haben eine nicht unterstützte Umgebung installiert.\nBitte verwenden Sie eine der folgenden Umgebungen: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Speichern Sie die aktuelle Konfiguration Ihrer Desktop-Umgebung" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Mit Save Desktop können Sie Ihre aktuelle Konfiguration (Designs, Symbole, Hintergrundbilder, alle Einstellungen der Desktop-Umgebung, Erweiterungen usw.) mit einem Klick speichern." + +#: src/main.py +msgid "Translator credits" +msgstr "Github Link des Übersetzers" + diff --git a/po/es.po b/po/es.po new file mode 100644 index 00000000..ef45ac34 --- /dev/null +++ b/po/es.po @@ -0,0 +1,472 @@ +# Translation file for es +# Generated from es.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Guardar" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Guardar la configuración actual" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Establecer el nombre del archivo" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Elementos que deben incluirse en el archivo de la configuración" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Estos ajustes también se aplican al guardado periódico" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Iconos" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temas" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Fuentes" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Fondos de pantalla" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Extensiones" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Escritorio" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Aplicaciones de Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Lista de aplicaciones Flatpak instaladas" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Datos de usuario de las aplicaciones Flatpak instaladas" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Selección de datos de aplicaciones Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Más opiniones" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Copia de seguridad periódica" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Los cambios sólo surtirán efecto tras el siguiente inicio de sesión" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Intervalo" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nunca" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Diariamente" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Semanalmente" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensualmente" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manualmente" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Más información" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Carpeta de almacenamiento periódico" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Elegir una carpeta personalizada para el almacenamiento periódico" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Elegir otra carpeta" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Formato del nombre del archivo" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Restablecer los valores por defecto" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Cifrado de archivos" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Al guardar manualmente la configuración, se le pedirá que cree una contraseña. Esto es útil cuando se guarda la configuración en medios portátiles para una mayor seguridad de sus datos." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Crear una nueva contraseña" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Por favor, cree una nueva contraseña para su archivo. Los criterios incluyen al menos 12 caracteres, una letra mayúscula, una letra minúscula y un carácter especial." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Generar contraseña" + +#: src/gui/window.py +msgid "Password" +msgstr "Contraseña" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Desbloquear el archivo con una contraseña" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Introduzca la contraseña a continuación para desbloquear el archivo con su configuración. Si la has olvidado, no podrás descomprimir el archivo y empezar a importar tu configuración." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Guardar la configuración ...\nLa configuración de su entorno de escritorio se guardará en:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "¡Se ha guardado la configuración!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nAhora puede ver el archivo con la configuración de su entorno de escritorio o volver a la página anterior.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Abrir la carpeta" + +#: src/gui/window.py +msgid "Import" +msgstr "Importar" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importar la configuración guardada" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importar desde archivo" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Cancelar" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Archivos de Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importando la configuración ...\nImportando la configuración desde:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "¡La configuración se ha aplicado!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nPuede salir del sistema para que los cambios surtan efecto, o volver a la página anterior y salir más tarde.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Volver a la página anterior" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Cerrar sesión" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Se produjo un error" + +#: src/gui/window.py +msgid "Apply" +msgstr "Aplicar" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sincronizar" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sincronizar la configuración de tu entorno de escritorio con otros ordenadores en la red." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Configuración de sincronización inicial" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Abrir los ajustes del sistema" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Ir a la sección Cuentas en línea" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"En esta sección selecciona el servicio de nube que deseas, como Google, Microsoft 365 o Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. Haz clic en el botón \"Siguiente\" y seleccione la carpeta de la unidad de la nube creada" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"La carpeta de la unidad en la nube creada se puede encontrar en el panel lateral del cuadro de diálogo del selector de archivos, con este formato: username@service.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Para que la sincronización funcione correctamente, debe tener la carpeta sincronizada con su servicio en la nube mediante Rclone.\nComience seleccionando el servicio de almacenamiento en la nube que utiliza." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Ahora, copie el comando para configurar Rclone usando el botón lateral y abra la aplicación de terminal usando el atajo de teclado Ctrl+Alt+T o buscándolo en el menú de aplicaciones." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Una vez que haya terminado de configurar Rclone usando el comando proporcionado, haga clic en el botón \"Aplicar\"" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "¡Casi terminamos!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"¡Ya has creado la carpeta de la unidad en la nube! Haz clic en el botón Siguiente para completar la configuración." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Selecciona" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Siguiente" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Configurar el archivo de sincronización" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Archivo de almacenamiento periódico" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "El archivo de guardado periódico no existe." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Crear" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Espera, por favor…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Cambiar" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Conectarse al almacenamiento en la nube" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"En otro ordenador, abra la aplicación Save Desktop y, en esta página, haga clic en el botón \"Configurar el archivo de sincronización\" y realice los ajustes necesarios. En este ordenador, seleccione la carpeta que ha sincronizado con su almacenamiento en la nube y también ha guardado el mismo archivo de guardado periódico." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Seleccione la carpeta de la nube" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "¡No has seleccionado la carpeta de la unidad en la nube!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sincronización periódica" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Sincronización bidireccional" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Si está activada y se seleccionan el intervalo de sincronización y la carpeta de la unidad en la nube, la información de guardado periódico (intervalo, carpeta y nombre de archivo) del otro ordenador con la sincronización establecida se copia en este ordenador." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"A partir de ahora, puedes sincronizar la configuración desde el menú de la barra de cabecera" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sincronizar manualmente" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Atajos de teclado" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Abrir la wiki de la aplicación" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Dejar" + +#: src/gui/window.py +msgid "About app" +msgstr "Acerca de la aplicación" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Tiene instalado un entorno no compatible. \nPor favor, utilice uno de estos entornos: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Guardar la configuración del escritorio" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop le permite guardar su configuración actual (temas, iconos, fondos de pantalla, todos los ajustes del entorno del escritorio, extensiones, etc.) con un solo clic." + +#: src/main.py +msgid "Translator credits" +msgstr "gallegonovato fran-carro@hotmail.es" + diff --git a/po/et.po b/po/et.po new file mode 100644 index 00000000..1582394b --- /dev/null +++ b/po/et.po @@ -0,0 +1,471 @@ +# Translation file for et +# Generated from et.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Salvesta" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Salvesta praegused seadistused" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Sisesta faili nimi" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Vali seadistuste arhiivifaili kaasatavad objektid" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Need seadistused kehtivad ka regulaarsel varundamisel" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikoonid" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Kujundused" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Kirjatüübid" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Taustapildid" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Lisamoodulid" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Töölaud" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpaki rakendused" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Paigaldatud Flatpaki rakenduste loend" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Paigaldatud Flatpaki rakenduste kasutajaandmed" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Vali Flatpaki rakendused, mille andmed tahad kaasata" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Lisavalikud" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Regulaarne salvestamine" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Muudatused jõustuvad järgmisel sisselogimisel" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Sagedus" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Mitte kunagi" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Kord päevas" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Iga nädal" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Iga kuu" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Valides aja käsitsi" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Lisateave" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Kaust regulaarseks salvestamiseks" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Vali kaust regulaarseks salvestamiseks sobilik kaust" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Vali muu kaust" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Failinime vorming" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Taasta algväärtused" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Krüptimise salasõna" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Käsitsi salvestamine" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Arhiivifaili krüptimine" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Seadistuste käsitsi salvestamisel palume, et lisaksid salasõna. See võimalus parandab turvalisust, kui kavatsed kasutada salvestamist teisaldatavale andmekandjale." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Salvesta seadistused ilma arhiivi loomata" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Loo uus salasõna" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Palun lisa oma arhiivifailile salasõna. Eeldame, et ta oleks vähemalt 12 tähemärki pikk, sisaldaks vähemalt ühte suurtähte, väiketähte ja erimärki." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Loo salasõna" + +#: src/gui/window.py +msgid "Password" +msgstr "Salasõna" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Kasutades salasõna eemalda arhiivifaili krüptimine" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Alljärgnevalt sisesta arhiivifaili krüptimise eemaldamiseks vajalik salasõna. Kui oled salasõna unustanud, siis arhiivifaili lahtipakkimine ja järgnev importimine pole võimalik." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "Seadistuste sünkroniseerimiseks palun sisesta salasõna" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Oled Save Desktopi abil sünkroniseerimiseks valinud krüptitud arhiivifaili. Lukustuse eemaldamiseks palun sisesta salasõna ja sünkroniseerimine saab alata." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Jäta salasõna meelde" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Salasõna on kas sisestamata või vale. Jätkamine pole võimalik." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Salvestame seadistusi …\nSinu töölauakeskkonna seadistused salvestuvad faili:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Seadistused on salvestatud!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nSa võid nüüd vaadata oma töölauakeskkonna seadistuste archive või minna tagasi eelmise vaate juurde.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Ava kaust" + +#: src/gui/window.py +msgid "Import" +msgstr "Impordi" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Impordi salvestatud seadistused" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Impordi failist" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Impordi kaustast" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Katkesta" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktopi failid" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Impordime seadistusi…\nImpordime seadistusi failist:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Seadistused on nüüd kasutusel!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nMuudatuste kasutuselevõtmiseks võid sa kohe välja logida või minna tagasi ja logida välja hiljem.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Tagasi eelmisesse vaatesse" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Logi välja" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Tekkis viga" + +#: src/gui/window.py +msgid "Apply" +msgstr "Rakenda" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sünkroniseerimine" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sünkroniseeri oma töölauakeskkonna seadistusi teiste arvutitega võrgus." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Sünkroniseerimise algne seadistus" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Ava süsteemi seadistused" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Ava võrguteenuste valik" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"Siin vali soovitud pilveteenus, nagu Google, Microsoft 365 või Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. Klõpsi nuppu Edasi ja vali loodud pilveteenuse kaust" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Loodud pilvekaust leidub külgpaanis failivalija vaates ja tavaliselt näeb välja umbes nii: kasutajanimi@teenus.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Et sünkroniseerimine toimiks korralikult vajad sa kausta, mis on rclone'i abil sünkroniseeritud sinu pilveteenusega.\nAlustamiseks vali soovitud pilveteenuse kaust." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Seejärel kasutades küljel asuvat nuppu kopeeri rclone'i ülesseadmiseks vajalik käsk, ava terminalirakendus kas Ctrl+Alt+T kiirklahviga või valides ta rakenduste käivitajast." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Kui oled selle käsu abil rclone'i seadistanud, siis klõpsi „Rakenda“ nuppu" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Selle asemel kasuta Syncthingi kausta" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Peaaegu valmis!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Pilveteenuse kausta oled sa nüüd loonud! Seadistamise lõpetamiseks vajuta nuppu „Edasi“." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Vali" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Edasi" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Seadista sünkroniseerimisfail" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Fail regulaarseks salvestamiseks" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Regulaarseks salvestamiseks mõeldud faili pole olemas." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Loo" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Palun oota…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Muuda" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Ühenda pilvesalvestusteenusega" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Ava teises arvutis Save Desktop rakendus ja sellel lehel klõpsi nuppu „Seadista sünkroniseerimisfail“ ja seadista vastavalt. Selles arvutis vali kaust, mille oled sünkroniseerinud oma pilveteenusega ja kuhu oled lisanud faili regulaarseks salvestamiseks." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Vali pilveteenuse kaust" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Sa pole pilveteenuse kausta valinud!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Regulaarne sünkroniseerimine" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Mõlemasuunaline sünkroniseerimine" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Kui eelistus on kasutusel, sünkroniseerimisvälp ja pilveteenuse kaust valitud, siis regulaarse salvestamise teave (välp, kaust ja failinimi) teisest arvutist kopeeritakse siia arvutisse." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Alates nüüdsest saad sa andmed sünkroniseerida menüüst päiseriba kohal" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sünkroniseeri käsitsi" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Klaviatuuri kiirklahvid" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Ava rakenduse viki" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Välju" + +#: src/gui/window.py +msgid "About app" +msgstr "Rakenduse teave" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Sa kasutad mittetoetatud töölauakeskkonda. \nHetkel on toetatud: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Salvesta oma töölaua seadistused" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop võimaldab sul ühe klõpsuga salvestada (ja seega ka varundada) oma töölaua seadistused (kujundus, ikoonid, taustapildid, kõik töölauakeskkonna seadistused, lisamoodulid, jne)." + +#: src/main.py +msgid "Translator credits" +msgstr "Priit Jõerüüt 2025" + diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 00000000..cf75f7d6 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,464 @@ +# Translation file for fi +# Generated from fi.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Tallenna" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Tallenna nykyiset määritykset" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Aseta tiedostonimi" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Määritysarkistoon sisällytettävät kohteet" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Nämä asetukset pätevät myös jaksottaiseen tallennukseen" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Kuvakkeet" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Teemat" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Fontit" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Taustakuvat" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Laajennukset" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Työpöytä" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak-sovellukset" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Luettelo asennetuista Flatpak-sovelluksista" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Asennettujen Flatpak-sovellusten käyttäjädata" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Flatpak-sovellusten datavalinta" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Lisää valintoja" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Jaksottainen tallennus" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Muutokset tulevat voimaan vasta seuraavalla kirjautumiskerralla" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Aikaväli" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Ei koskaan" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Päivittäin" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Viikottain" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Kuukausittain" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manuaalisesti" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Lue lisää" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Kansio jaksottaista tallennusta varten" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Valitse mukautettu kansio jaksottaista tallennusta varten" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Valitse toinen kansio" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Tiedostonimen muoto" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Palauta oletusasetus" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Salasana salausta varten" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Manuaalinen tallennus" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Arkiston salaus" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Kun tallennat määrityksen manuaalisesti, sinua pyydetään luomaan salasana. Tämä on hyödyllinen ominaisuus datan turvaamiseksi, kun määritys on tarkoitus tallentaa esimerkiksi erilliselle muistitikulle." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Tallenna kokoonpano luomatta arkistoa" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Luo uusi salasana" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Luo uusi salasana arkistoon. Salasanan on sisällettävä vähintään 12 merkkiä, yksi iso kirjain, yksi pieni kirjain ja yksi erikoismerkki." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Luo salasana" + +#: src/gui/window.py +msgid "Password" +msgstr "Salasana" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Avaa arkiston lukitus salasanalla" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Kirjoita määritysarkiston salasana alapuolelle. Jos olet unohtanut salasanan, et pysty avata arkistoa ja tuoda määritystä." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Muista salasana" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" +"Salasanaa ei kirjoitettu, tai se oli väärin. Jatkaminen ei ole mahdollista." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Tallennetaan määritystä …\nTyöpöytäympäristösi määritys tallennetaan seuraavaan tiedostoon:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Määritys on tallennettu!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nVoit nyt katselmoida arkiston, jossa työpöytäympäristösi määritys on, tai palata edelliselle sivulle.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Avaa kansio" + +#: src/gui/window.py +msgid "Import" +msgstr "Tuo" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Tuo tallennettu määritys" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Tuo tiedostosta" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Tuo kansiosta" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Peru" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop-tiedostot" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Tuodaan määritystä…\nMääritys tuodaan seuraavasta lähteestä:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Määritys on toteutettu!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nVoit kirjautua ulos järjestelmästä, jotta muutokset tulevat voimaan, tai palata edelliselle sivulle ja kirjautua ulos myöhemmin.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Takaisin edelliselle sivulle" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Kirjaudu ulos" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Tapahtui virhe" + +#: src/gui/window.py +msgid "Apply" +msgstr "Toteuta" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synkronoi" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Synkronoi työpöytämäärityksesi muiden verkossa olevien tietokoneiden kanssa." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Ensimmäisen synkronoinnin määritys" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Avaa järjestelmän asetukset" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Siirry verkkotileihin" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"Valitse haluamasi pilvipalvelu kuten Google, Microsoft 365 tai Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. Napsauta Seuraava-painiketta ja valitse luotu kansio pilvestä" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Käytä Syncthing-kansiota sen sijaan" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Melkein valmista!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Valitse" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Seuraava" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Aseta synkronointitiedosto" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Jaksottaisen tallennuksen tiedosto" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Jaksottaisen tallennuksen tiedostoa ei ole olemassa." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Luo" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Odota hetki…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Vaihda" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Yhdistä pilvitallennustilaan" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Valitse pilviaseman kansio" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Et valinnut pilviaseman kansiota!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Jaksottainen synkronointi" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Kaksisuuntainen synkronointi" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Vastedes voit synkronoida määrityksen otsakepalkin valikosta" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Synkronoi manuaalisesti" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Pikanäppäimet" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Avaa sovelluksen wiki" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Lopeta" + +#: src/gui/window.py +msgid "About app" +msgstr "Tietoja sovelluksesta" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Havaittu tuen ulkopuolella olevan ympäristön asennus. \nKäytä jotain näistä ympäristöistä: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Tallenna työpöytäsi määritys" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktopin avulla voit tallentaa työpöytäympäristösi määrityksen (teemat, kuvakkeet, taustakuvat, kaikki työpöytäympäristön asetukset, laajennukset jne.) yhdellä napsautuksella." + +#: src/main.py +msgid "Translator credits" +msgstr "Name jiri.gronroos+l10n@iki.fi" + diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 00000000..00dcf3d4 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,463 @@ +# Translation file for fr +# Generated from fr.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Sauvegarder" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Sauvegarder la configuration actuelle" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Définir le nom du fichier" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Éléments à inclure dans l'archive de configuration" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Ces paramètres s'appliquent également à l'enregistrement périodique" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Icônes" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Thèmes" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Polices de caractères" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Fonds d'écran" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Bureau" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Applications Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Liste des applications Flatpak installées" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Données utilisateur des applications Flatpak installées" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Sélection des données des applications Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Plus d'options" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Sauvegarde périodique" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Les modifications ne prendront effet qu'après la prochaine connexion" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Intervalle" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Jamais" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Journalier" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Hebdomadaire" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensuel" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manuellement" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "En savoir plus" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Répertoire de sauvegarde périodique" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Sélectionner un répertoire personnalisé pour la sauvegarde périodique" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Sélectionner un autre dossier" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Format du nom de fichier" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Réinitialisation aux valeurs par défaut" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Chiffrement de l'archive" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Lors de la sauvegarde manuelle de la configuration, il vous sera demandé de créer un mot de passe. Cette option permet d'améliorer la sécurité de vos données lorsque la configuration est enregistrée sur un support de stockage amovible." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Créer un nouveau mot de passe" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Veuillez créer un nouveau mot de passe. Le nouveau mot de passe doit contenir au moins 12 caractères avec au moins une majuscule, au moins une minuscule et au moins un caractère spécial." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "Mot de passe" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Déverrouiller l'archive avec un mot de passe" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Veuillez saisir ci-dessous le mot de passe permettant de déverrouiller l'archive qui contient votre configuration. En cas d'oubli du mot de passe, vous ne serez pas en mesure d'ouvrir l'archive contenant votre configuration et votre configuration ne pourra donc pas être importée." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Enregistrement de la configuration ...\nLa configuration de votre environnement de bureau sera enregistrée dans :\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "La configuration a été enregistrée !" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nVous pouvez maintenant consulter l'archive contenant la configuration de votre environnement de bureau, ou revenir à la page précédente.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Ouvrir le dossier" + +#: src/gui/window.py +msgid "Import" +msgstr "Importation" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importer la configuration sauvegardée" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importer à partir d'un fichier" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Annuler" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Fichiers Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Import de la configuration ...\nImport de la configuration à partir de : {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "La configuration a été appliquée !" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nVous pouvez vous déconnecter du système pour que les changements prennent effet, ou revenir à la page précédente et vous déconnecter plus tard.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Revenir à la page précédente" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Fermer la session" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: src/gui/window.py +msgid "Apply" +msgstr "Appliquer" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synchroniser" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Synchroniser la configuration de votre environnement de bureau avec les autres ordinateurs du réseau." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Configurer le fichier de synchronisation" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Fichier pour l'enregistrement périodique" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Veuillez patienter …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Synchronisation périodique" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Désormais, vous pouvez synchroniser la configuration à partir du menu de la barre d'en-tête" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Synchroniser manuellement" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Raccourcis clavier" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Quitter" + +#: src/gui/window.py +msgid "About app" +msgstr "À propos" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Votre environnements de bureau n'est pas compatible \nVeuillez utiliser l'un de ces environnements : {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Sauvegarder la configuration de votre bureau" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop vous permet de sauvegarder votre configuration actuelle (thèmes, icônes, fonds d'écran, tous les paramètres de l'environnement de bureau, les extensions, en un seul clic." + +#: src/main.py +msgid "Translator credits" +msgstr "Lien github des traducteurs" + diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 00000000..dbdb4ce8 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,469 @@ +# Translation file for hi +# Generated from hi.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "सहेजें" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "वर्तमान विन्यास सहेजें" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "फाइल नाम निर्धारित करें" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "विन्यास पुरालेख में शामिल करने योग्य आइटम" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "ये सेटिंग्स आवधिक सहेजने पर भी लागू होती हैं" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "आइकन" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "थीम" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "फॉन्ट" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "पृष्ठभूमि" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "विस्तार" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "डेस्कटॉप" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "फ्लैटपैक ऐप्स" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "स्थापित फ्लैटपैक ऐप्स की सूची" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "स्थापित फ्लैटपैक ऐप्स का उपयोक्ता डेटा" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "फ्लैटपैक ऐप्स डेटा चयन" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "अधिक विकल्प" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "आवधिक सहेजना" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "परिवर्तन अगले लॉगिन के बाद ही प्रभावी होंगे" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "अंतराल" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "कभी नहीं" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "दैनिक" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "साप्ताहिक" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "मासिक" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "हाथ से" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "और अधिक जानें" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "आवधिक सहेजने के लिए फोल्डर" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "आवधिक सहेजने के लिए तदनुकूल फोल्डर चुनें" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "कोई अन्य फोल्डर चुनें" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "फाइल नाम प्रारूप" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "तयशुदा पर रीसेट" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "पुरालेख कूटलेखन" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"विन्यास को हस्तचालित रूप से सहेजते समय, आपको पासवर्ड बनाने के लिए कहा जाएगा। यह आपके डेटा की बेहतर सुरक्षा के लिए पोर्टेबल मीडिया में विन्यास को सहेजते समय उपयोगी है।" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "नया पासवर्ड बनाएं" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"कृपया अपने पुरालेख के लिए नया पासवर्ड बनाएं। मानदंड में कम से कम 12 अक्षर, एक बड़ा अक्षर, एक छोटा अक्षर और एक विशेष वर्ण शामिल है।" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "पासवर्ड" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "पासवर्ड से पुरालेख को खोलें" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"अपने विन्यास के साथ पुरालेख को खोलने के लिए नीचे दिया गया पासवर्ड दर्ज करें। यदि आप इसे भूल गए हैं, तो आप पुरालेख को अनज़िप नहीं कर पाएंगे और अपना विन्यास आयात करना शुरू नहीं कर पाएंगे।" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization।" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Password not entered, or it's incorrect. Unable to continue।" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"विन्यास सहेजा जा रहा है …\nआपके डेस्कटॉप वातावरण का विन्यास इसमें सहेजा जाएगा:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "विन्यास सहेजा गया है!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nअब आप अपने डेस्कटॉप वातावरण के विन्यास के साथ संग्रह देख सकते हैं, या पिछले पृष्ठ पर लौट सकते हैं।\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "फोल्डर खोलें" + +#: src/gui/window.py +msgid "Import" +msgstr "आयात" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "सहेजा गया विन्यास आयात करें" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "फाइल से आयात" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "रद्द करें" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop फाइलें" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"विन्यास आयात किया जा रहा है...\nयहाँ से विन्यास आयात किया जा रहा है:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "विन्यास लागू कर दिया गया है!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nपरिवर्तनों को प्रभावी करने के लिए आप सिस्टम से लॉग आउट कर सकते हैं, या पिछले पृष्ठ पर वापस जा सकते हैं और बाद में लॉग आउट कर सकते हैं।\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "पिछले पृष्ठ पर जाएं" + +#: src/gui/window.py +msgid "Log Out" +msgstr "लॉग आउट" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "लागू करें" + +#: src/gui/window.py +msgid "Sync" +msgstr "समन्वयन" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"नेटवर्क में अन्य कंप्यूटरों के साथ अपने डेस्कटॉप वातावरण विन्यास को समन्वयित करें।" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud।" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com।" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu।" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup।" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "समन्वयन फाइल निर्धारित करें" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "आवधिक फाइल सहेजना" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Periodic saving file does not exist।" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "कृपया प्रतीक्षा करें …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file।" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "आवधिक समन्वयन" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer।" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "अब से, आप शीर्षलेख पट्टी में मेनू से विन्यास को समन्वयित कर सकते हैं" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "हस्तचालित रूप से समन्वयित करें" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "कीबोर्ड शॉर्टकट" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "छोड़ें" + +#: src/gui/window.py +msgid "About app" +msgstr "ऐप के बारे में" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"आपके पास एक असमर्थित परिवेश स्थापित है। \nकृपया इनमें से किसी एक परिवेश का उपयोग करें: {}।" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "अपना डेस्कटॉप विन्यास सहेजें" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop आपको एक क्लिक से अपने वर्तमान विन्यास (थीम, आइकन, वॉलपेपर, सभी डेस्कटॉप वातावरण सेटिंग्स, एक्सटेंशन इत्यादि) को सहेजने देता है।" + +#: src/main.py +msgid "Translator credits" +msgstr "Scrambled777 " + diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 00000000..3429d96b --- /dev/null +++ b/po/hu.po @@ -0,0 +1,457 @@ +# Translation file for hu +# Generated from hu.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Mentés" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Jelenlegi konfiguráció mentése" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Fájlnév megadása" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "A konfigurációs archívumba felveendő elemek" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Ezek a beállítások érvényesek az időszakos mentésekre is" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikonok" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Témák" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Betűtípusok" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Hátterek" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak alkalmazások" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Telepített Flatpak alkalmazások felhasználói adatai" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Időszakos mentés" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "A változtatások csak a következő belépéskor lépnek érvénybe" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Soha" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Naponta" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Hetente" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Havonta" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manuálisan" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Tudj meg többet" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Időszakos mentések mappája" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Válassz egyéni mappát az időszakos mentéshez" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Válassz másik mappát" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Fájlnév formátum" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Alaphelyzetbe állítás" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "A konfiguráció elmentve!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "A mappa megnyitása" + +#: src/gui/window.py +msgid "Import" +msgstr "Importálás" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Mentett konfiguráció importálása" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importálás fájlból" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Mégsem" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop fájlok" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "A konfigurációt alkalmaztuk!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Kijelentkezés" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "Alkalmazás" + +#: src/gui/window.py +msgid "Sync" +msgstr "Szinkronizálás" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Szinkronizálja az asztali környezet konfigurációját a hálózat többi számítógépével." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Szinkronizálási fájl beállítása" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Szinkronizálási fájl" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Kérlek várj …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Időszakos szinkronizálás" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Ezentúl szinkronizálhatod a konfigurációt a fejlécsáv menüjéből" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "Névjegy" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Az általad használt környezet nem támogatott. \nKérlek használd a következők valamelyikét: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Mentsd el az asztali környezeted jelenlegi konfigurációját" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop lehetővé teszi, hogy egy gombnyomással elmentsd a jelenlegi konfigurációdat (témákat, ikonokat, háttereket, az összes asztali környezeti beállítást, kiegészítéseket, stb.)." + +#: src/main.py +msgid "Translator credits" +msgstr "Daniel Uhrinyi https://github.com/danieluhrinyi" + diff --git a/po/ia.po b/po/ia.po new file mode 100644 index 00000000..14c83e3c --- /dev/null +++ b/po/ia.po @@ -0,0 +1,452 @@ +# Translation file for ia +# Generated from ia.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: ia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "" + +#: src/gui/window.py +msgid "Import" +msgstr "" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "" + +#: src/gui/window.py +msgid "Sync" +msgstr "" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" + +#: src/main.py +msgid "Translator credits" +msgstr "Translator github-link" + diff --git a/po/id.po b/po/id.po new file mode 100644 index 00000000..40d4ed81 --- /dev/null +++ b/po/id.po @@ -0,0 +1,458 @@ +# Translation file for id +# Generated from id.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Simpan" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Menyimpan konfigurasi saat ini" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Tetapkan nama file" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Item yang harus dimasukkan dalam arsip konfigurasi" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Pengaturan ini juga berlaku untuk penyimpanan berkala" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikon" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Tema" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Font" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Latar Belakang" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Aplikasi flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Simpan berkala" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Perubahan hanya akan berlaku setelah login berikutnya" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Tidak Pernah" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Setiap hari" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Mingguan" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Bulanan" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manual" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Pelajari lebih lanjut" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Folder untuk penyimpanan berkala" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Pilih folder khusus untuk penyimpanan berkala" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Pilih folder lain" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Format nama file" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Setel ulang ke default" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Konfigurasi telah tersimpan!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Membuka folder" + +#: src/gui/window.py +msgid "Import" +msgstr "Impor" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Mengimpor konfigurasi yang tersimpan" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Impor dari file" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Batal" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "SimpanFile desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Konfigurasi ini telah diterapkan!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Keluar Sesi" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "Terapkan" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sinkronisasi" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Menyinkronkan konfigurasi lingkungan desktop Anda dengan komputer lain dalam jaringan." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Atur file sinkronisasi" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Harap tunggu…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sinkronisasi berkala" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Mulai sekarang, Anda dapat menyinkronkan konfigurasi dari menu di bilah header" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "Tentang aplikasi" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Anda telah menginstal lingkungan yang tidak didukung. \nSilakan gunakan salah satu lingkungan berikut: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Simpan konfigurasi lingkungan desktop Anda saat ini" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop memungkinkan Anda menyimpan konfigurasi saat ini (tema, ikon, wallpaper, semua pengaturan lingkungan desktop, ekstensi, dll.) dengan satu klik." + +#: src/main.py +msgid "Translator credits" +msgstr "Penerjemah github-tautan" + diff --git a/po/it.po b/po/it.po new file mode 100644 index 00000000..ab074969 --- /dev/null +++ b/po/it.po @@ -0,0 +1,474 @@ +# Translation file for it +# Generated from it.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Salva" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Salva la configurazione corrente" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Impostare il nome file" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Elementi da includere nell'archivio di configurazione" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Queste impostazioni si applicano anche al salvataggio periodico" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Icone" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temi" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Font" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Sfondi" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Estensioni" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "App flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Elenco delle app Flatpak installate" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Dati utente delle app Flatpak installate" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Selezione dei dati delle app Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Ulteriori opzioni" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Salvataggio periodico" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Le modifiche avranno effetto solo dopo il prossimo login" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Intervallo" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Mai" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Giornaliero" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Settimanale" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensile" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manualmente" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Ulteriori informazioni" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Cartella per il salvataggio periodico" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Scegli la cartella personalizzata per il salvataggio periodico" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Scegli un'altra cartella" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Formato del nome del file" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Ripristina le impostazioni predefinite" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Password per la crittografia" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Salvataggio manuale" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Cifratura dell'archivio" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Quando salvi manualmente la configurazione, ti verrà richiesto di creare una password. Ciò è utile quando si salva la configurazione su un supporto portatile per una migliore sicurezza dei dati." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Salvare la configurazione senza creare un archivio" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Crea una nuova password" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Crea una nuova password per il tuo archivio. I criteri includono una lunghezza di almeno 12 caratteri, una lettera maiuscola, una lettera minuscola e un carattere speciale." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Genera Password" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Sblocca l'archivio con una password" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Inserisci la password qui sotto per sbloccare l'archivio con la tua configurazione. Se l'hai dimenticata, non potrai decomprimere l'archivio e iniziare a importare la tua configurazione." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" +"Inserisci una password per sbloccare l'archivio e sincronizzare la configurazione" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"È stato selezionato un archivio crittografato per la sincronizzazione tramite l'app Save Desktop. Inserisci la password qui sotto per sbloccarlo e avviare la sincronizzazione." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Ricorda password" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Password non inserita o errata. Impossibile continuare." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Salvataggio della configurazione…\nLa configurazione del tuo ambiente desktop verrà salvata in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "La configurazione è stata salvata!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nOra puoi visualizzare l'archivio con la configurazione del tuo ambiente desktop oppure tornare alla pagina precedente.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Apri la cartella" + +#: src/gui/window.py +msgid "Import" +msgstr "Importa" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importa la configurazione salvata" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importa da file" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Importa dalla cartella" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Cancella" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Salva i file del desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importazione della configurazione…\nImportazione configurazione da:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "La configurazione è stata applicata!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nÈ possibile disconnettersi dal sistema per rendere effettive le modifiche oppure tornare alla pagina precedente e disconnettersi in seguito.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Ritorno alla pagina precedente" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Disconnettersi" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: src/gui/window.py +msgid "Apply" +msgstr "Applica" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sincronizzazione" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sincronizza la configurazione del tuo ambiente desktop con altri computer nella rete." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Configurazione iniziale della sincronizzazione" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Aprire le impostazioni di sistema" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Vai alla sezione Account online" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"In questa sezione seleziona il servizio cloud desiderato, ad esempio Google, Microsoft 365 o Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. Fare clic sul pulsante Avanti e selezionare la cartella dell'unità cloud creata" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"La cartella dell'unità cloud creata può essere trovata nel pannello laterale della finestra di dialogo di selezione file, nel seguente formato: nomeutente@servizio.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Per far funzionare correttamente la sincronizzazione, devi avere la cartella sincronizzata con il tuo servizio cloud tramite Rclone.\nInizia selezionando il servizio di unità cloud che utilizzi." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Ora copia il comando per configurare Rclone utilizzando il pulsante laterale e apri l'app terminale utilizzando la scorciatoia da tastiera Ctrl+Alt+T o trovandola nel menu delle app." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Una volta terminata la configurazione di Rclone utilizzando il comando fornito, fare clic sul pulsante \"Applica\"" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Utilizzare invece la cartella Syncthing" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Quasi finito!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Ora hai creato la cartella dell'unità cloud! Fai clic sul pulsante Avanti per completare la configurazione." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Seleziona" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Prossimo" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Imposta il file di sincronizzazione" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "File di salvataggio periodico" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Il file di salvataggio periodico non esiste." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Crea" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Attendere prego …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Modifica" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Connettiti allo storage cloud" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Su un altro computer, apri l'app Save Desktop e, in questa pagina, clicca sul pulsante \"Imposta il file di sincronizzazione\" e fai le impostazioni necessarie. Su questo computer, seleziona la cartella che hai sincronizzato con il tuo archivio cloud ed hai anche salvato lo stesso file di salvataggio periodico." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Seleziona la cartella dell'unità cloud" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Non hai selezionato la cartella dell'unità cloud!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sincronizzazione periodica" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Sincronizzazione bidirezionale" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Se abilitata e se sono selezionati l'intervallo di sincronizzazione e la cartella dell'unità cloud, le informazioni di salvataggio periodico (intervallo, cartella e nome file) dall'altro computer con sincronizzazione impostata su sincronizza, vengono copiate su questo computer." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"D'ora in poi, puoi sincronizzare la configurazione dal menu nella barra dell'intestazione" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sincronizza manualmente" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Scorciatoie da tastiera" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Apri il wiki dell'applicazione" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Esci" + +#: src/gui/window.py +msgid "About app" +msgstr "Informazioni sull'app" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Hai installato un ambiente non supportato.\nSi prega di utilizzare uno di questi ambienti: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Salva la configurazione del tuo desktop" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Desideri salvare la tua configurazione corrente inclusi temi, icone, sfondi, tutte le impostazioni dell'ambiente desktop, estensioni e così via? Save Desktop può aiutarti in questo. Basta un clic e hai la tua configurazione salvata." + +#: src/main.py +msgid "Translator credits" +msgstr "Albano Battistella https://github.com/albanobattistella" + diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 00000000..03237c93 --- /dev/null +++ b/po/meson.build @@ -0,0 +1 @@ +i18n.gettext('savedesktop', preset: 'glib') \ No newline at end of file diff --git a/po/nb_NO.po b/po/nb_NO.po new file mode 100644 index 00000000..adcda9de --- /dev/null +++ b/po/nb_NO.po @@ -0,0 +1,456 @@ +# Translation file for nb_NO +# Generated from nb_NO.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: nb_NO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Lagre nåværende oppsett" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Sett filnavn (uten mellomrom)" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Save installed Flatpak apps" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Oppsettet har blitt lagret." + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Åpne mappen" + +#: src/gui/window.py +msgid "Import" +msgstr "" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importer lagret oppsett" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Avbryt" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop-filer" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Oppsettet har blitt anvendt." + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Logg ut" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "" + +#: src/gui/window.py +msgid "Sync" +msgstr "" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Vent …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "Om programmet" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Du har et ustøttet miljø installert. \nBruk ett av disse miljøene: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Lagre nåværende oppsett av skrivebordsmiljøet ditt" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop lar deg lagre ditt nåværende oppsett (drakter, ikoner, bakgrunnsbilder, alle skrivebordsmiljøinnstillinger, utvidelser, osv.) med ett klikk." + +#: src/main.py +msgid "Translator credits" +msgstr "Allan Nordhøy https://github.com/comradekingu" + diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 00000000..2dbb66cf --- /dev/null +++ b/po/nl.po @@ -0,0 +1,458 @@ +# Translation file for nl +# Generated from nl.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Opslaan" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Huidige voorkeuren opslaan" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Geef het bestand een naam" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Items om op te nemen in het voorkeurenarchief" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Deze voorkeuren zijn ook van toepassing op periodiek opslaan" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Pictogrammen" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Thema's" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Lettertypen" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Achtergronden" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpaktoepassingen" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Gebruikersgegevens van geïnstalleerde Flatpaktoepassingen" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Periodiek opslaan" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Meld u opnieuw aan om de wijzigingen toe te passen" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nooit" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Iedere dag" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Iedere week" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Iedere maand" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Handmatig" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Meer informatie" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Periodieke-opslagmap" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Kies een map waarin periodiek reservekopieën dienen te worden bewaard" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Kies een andere map" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Bestandsnaamopmaak" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Standaardwaarden" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "De voorkeuren zijn opgeslagen!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Map openen" + +#: src/gui/window.py +msgid "Import" +msgstr "Importeren" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Voorkeuren importeren" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importeren uit bestand" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Annuleren" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop-bestanden" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "De voorkeuren zijn ingesteld!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Afmelden" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "Toepassen" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synchronisatie" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Synchroniseer uw werkomgevingsvoorkeuren met andere computers op het netwerk." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Synchronisatiebestand instellen" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Periodiek opgeslagen bestand" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Even geduld…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Periodieke synchronisatie" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Voortaan kunt u de voorkeuren synchroniseren middels het menu op de kopbalk" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "Over de toepassing" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"U maakt gebruik van een niet-ondersteunde werkomgeving. \nDe volgende werkomgevingen worden ondersteund: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Sla de huidige voorkeuren van uw werkomgeving op" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Wilt u uw huidige voorkeuren (thema's, pictogrammen, bureaubladachtergronden, systeemvoorkeuren, uitbreidingen, etc.) opslaan? Save Desktop kan u hierbij helpen. Met slechts één muisklik wordt alles opgeslagen." + +#: src/main.py +msgid "Translator credits" +msgstr "https://github.com/Vistaus" + diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 00000000..d2cf4d03 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,454 @@ +# Translation file for pl +# Generated from pl.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Zapisz" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Zapisz obecną konfigurację" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Ustaw nazwę pliku" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikony" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Motywy" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Czcionki" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Tapety" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Rozszerzenia" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Pulpit" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Aplikacje Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Więcej opcji" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nigdy" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Codziennie" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Co tydzień" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Co miesiąc" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Ręcznie" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Dowiedz się więcej" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Wybierz inny katalog" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Format nazwy pliku" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Przywróć ustawienia domyślne" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Hasło szyfrowania" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Ręczne zapisywanie" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Utwórz nowe hasło" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Generuj hasło" + +#: src/gui/window.py +msgid "Password" +msgstr "Hasło" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Zapamiętaj hasło" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Konfiguracja została zapisana!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Otwórz katalog" + +#: src/gui/window.py +msgid "Import" +msgstr "Importuj" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importuj zapisaną konfigurację" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importuj z pliku" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Importuj z katalogu" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Anuluj" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Pliki Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importing configuration ...\nImporting configuration from: {}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Wróć do poprzedniej strony" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Wyloguj się" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: src/gui/window.py +msgid "Apply" +msgstr "Zastosuj" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synchronizacja" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Wybierz" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Dalej" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Utwórz" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Proszę czekać…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Zmień" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Synchronizuj ręcznie" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Skróty klawiszowe" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Wyjdź" + +#: src/gui/window.py +msgid "About app" +msgstr "O aplikacji" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Zapisz konfigurację swojego pulpitu" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" + +#: src/main.py +msgid "Translator credits" +msgstr "Eryk Michalak gnu.ewm@protonmail.com" + diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 00000000..194d65ba --- /dev/null +++ b/po/pt.po @@ -0,0 +1,460 @@ +# Translation file for pt +# Generated from pt.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Gravar" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Gravar configuração atual" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Definir o nome do ficheiro" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Itens à serem incluídos no arquivo de configuração" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Estas configurações também aplicam-se à gravação periódica" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ícones" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temas" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Fontes" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Papéis de parede" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Extensões" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Área de Trabalho" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Apps Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Lista de apps Flatpak instalados" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Dados do utilizador de apps Flatpak instalados" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Seleção de dados de apps Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Gravação periódica" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "As alterações só terão efeito após o próximo login" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nunca" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Diariamente" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Semanalmente" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensalmente" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manualmente" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Aprender mais" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Pasta para gravação periódica" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Escolha uma pasta para gravar periódicamente" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Escolha outra pasta" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Formato do nome do ficheiro" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Restaurar para o padrão" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"A gravar a configuração …\nA configuração do seu ambiente de desktop será gravada em:\n{}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "A configuração foi gravada!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nAgora pode visualizar o arquivo com a configuração do seu ambiente de desktop, ou retornar à página anterior.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Abrir a pasta" + +#: src/gui/window.py +msgid "Import" +msgstr "Importar" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importar configuração gravada" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importar do ficheiro" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Cancelar" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Ficheiros Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importando configuração ...\nImportando configuração de:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "A configuração foi aplicada!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nPode encerrar a sessão para que as alterações tenham efeito, ou voltar para a página anterior e encerrar mais tarde.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Voltar para a página anterior" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Sair" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "Aplicar" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sincronizar" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sincronize a configuração do seu ambiente de desktop com outros computadores na rede." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Configure o ficheiro de sincronização" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Ficheiro de gravação periódica" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Por favor, aguarde…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sincronização periódica" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"De agora em diante, pode sincronizar a configuração no menu da barra de cabeçalho" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sincronizar manualmente" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Atalhos do teclado" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Encerrar" + +#: src/gui/window.py +msgid "About app" +msgstr "Sobre o app" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Tem instalado um ambiente sem suporte. \nPor favor, use um desses ambientes: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Grave a sua configuração da área de trabalho" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop permite gravar a sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um clique." + +#: src/main.py +msgid "Translator credits" +msgstr "Trandutor github-link" + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 00000000..e3aca942 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,473 @@ +# Translation file for pt_BR +# Generated from pt_BR.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Salvar" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Salvar configuração atual" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Defina o nome do arquivo" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Itens a serem incluídos no arquivo de configuração" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Estas configurações também se aplicam ao salvamento periódico" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ícones" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temas" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Fontes" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Papéis de parede" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Extensões" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Área de trabalho" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Aplicativos Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Lista de aplicativos Flatpak instalados" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Dados do usuário de aplicativos Flatpak instalados" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Seleção de dados de aplicativos Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Mais opções" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Salvamento periódico" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "As alterações só terão efeito após o próximo login" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Intervalo" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Nunca" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Diariamente" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Semanalmente" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Mensalmente" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manualmente" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Saiba mais" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Pasta para salvamento periódico" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Escolha uma pasta para salvar periodicamente" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Escolha outra pasta" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Formato do nome do arquivo" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Restaurar para o padrão" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Encriptação de arquivo" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Ao salvar manualmente a configuração, o aplicativo solicitará que você crie uma senha. Isso é útil ao salvar a configuração em uma mídia portátil para aumentar a segurança de seus dados." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Criar nova senha" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Por favor, crie uma nova senha para o seu arquivo. Os critérios incluem, pelo menos, 12 caracteres de tamanho, uma letra maiúscula, uma letra minúscula e um caractere especial." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Gerar Senha" + +#: src/gui/window.py +msgid "Password" +msgstr "Senha" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Desbloqueie o arquivo com uma senha" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Insira a senha abaixo para desbloquear o arquivo com a sua configuração. Caso você tenha esquecido, não poderá descompactar o arquivo e começar a importar sua configuração." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Salvando configuração…\nA configuração do seu ambiente de desktop será salva em:\n{}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "A configuração foi salva!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nAgora você pode visualizar o arquivo com a configuração do seu desktop, ou retornar à página anterior.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Abrir a pasta" + +#: src/gui/window.py +msgid "Import" +msgstr "Importar" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importar configuração salva" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importar do arquivo" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Cancelar" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Arquivos Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importando configuração...\nImportando a configuração de:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "A configuração foi aplicada!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nVocê pode encerrar a sessão para que as alterações tenham efeito, ou voltar para a página anterior e encerrar mais tarde.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Voltar para a página anterior" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Sair" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Ocorreu um erro" + +#: src/gui/window.py +msgid "Apply" +msgstr "Aplicar" + +#: src/gui/window.py +msgid "Sync" +msgstr "Sincronizar" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Sincronize a configuração do seu ambiente de desktop com outros computadores na rede." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Configuração inicial de sincronização" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Abra as configurações do sistema" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Vá para a seção Contas Online" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"Nesta seção, selecione o serviço de nuvem desejado, como Google, Microsoft 365 ou Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. Clique no botão Avançar e selecione a pasta da unidade criada na nuvem" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"A pasta da unidade criada na nuvem pode ser encontrada no painel lateral da caixa de diálogo do seletor de arquivos, neste formato: nomedeusuario@service.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Para que a sincronização funcione corretamente, você precisa ter a pasta que está sincronizada com seu serviço de nuvem usando Rclone.\nComece selecionando o serviço de unidade em nuvem que você usa." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Agora, copie o comando para configurar o Rclone usando o botão lateral e abra o aplicativo do terminal usando o atalho de teclado Ctrl+Alt+T ou encontrando-o no menu de aplicativos." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Depois de terminar de configurar o Rclone usando o comando fornecido, clique no botão \"Aplicar\"" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Quase pronto!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Agora você criou a pasta da unidade em nuvem! Clique no botão Avançar para concluir a configuração." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Selecionar" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Avançar" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Configurar o arquivo de sincronização" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Arquivo de salvamento periódico" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "O arquivo de salvamento periódico não existe." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Criar" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Por favor, aguarde…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Alterar" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Conectar ao armazenamento em nuvem" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Em outro computador, abra o aplicativo Save Desktop e, nesta página, clique no botão “Configurar o arquivo de sincronização” e faça as configurações necessárias. Neste computador, selecione a pasta que você sincronizou com seu armazenamento em nuvem e também salvou o mesmo arquivo de salvamento periódico." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Selecionar a pasta da unidade em nuvem" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Você não selecionou a pasta da unidade em nuvem!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Sincronização periódica" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Sincronização bidirecional" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Se ativado e o intervalo de sincronização e a pasta da unidade na nuvem estiverem selecionados, as informações de salvamento periódico (intervalo, pasta e nome do arquivo) do outro computador, com sincronização definida, serão copiadas para este computador." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"De agora em diante, você pode sincronizar a configuração no menu da barra de cabeçalho" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Sincronizar manualmente" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Atalhos de teclado" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Abrir o wiki do aplicativo" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Encerrar" + +#: src/gui/window.py +msgid "About app" +msgstr "Sobre o aplicativo" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Você tem instalado um ambiente sem suporte. \nPor favor, use um destes ambientes: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Salvar a configuração da sua área de trabalho" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop permite que você salve sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um único clique." + +#: src/main.py +msgid "Translator credits" +msgstr "" +"Felipe Nogueira https://github.com/fnogcps\nIsaac Dias https://hosted.weblate.org/user/IsaacDias/\nFilipe Motta \nEzilei Correia " + diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..2c4775e6 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,473 @@ +# Translation file for ru +# Generated from ru.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Сохранить" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Сохранить текущую конфигурацию" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Задайте имя файла" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Элементы для включения в архив конфигурации" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Эти настройки также применяются для периодического сохранения" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Иконки" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Темы" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Шрифты" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Фоны" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Расширения" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Рабочий стол" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Приложения Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Список установленных Flatpak приложений" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Пользовательские данные установленных приложений Flatpak" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Выбор данных приложений Flatpak" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Больше опций" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Периодическое сохранение" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Изменения вступят в силу после следующего входа в систему" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Интервал" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Никогда" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Ежедневно" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Еженедельно" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Ежемесячно" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Вручную" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Подробнее" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Папка для периодических сохранений" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Выберите папку для периодического сохранения" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Выбрать другую папку" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Формат имени файла" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Восстановить по умолчанию" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Пароль для шифрования" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Ручное сохранение" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Шифрование архива" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"При ручном сохранении конфигурации вам будет предложено создать пароль. Это полезно при сохранении конфигурации на переносном носителе для большей безопасности ваших данных." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Сохранить конфигурацию без создания архива" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Создать новый пароль" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Пожалуйста, создайте новый пароль для вашего архива. Критерии включают длину не менее 12 символов, одну заглавную букву, одну строчную букву и один специальный символ." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Сгенерировать пароль" + +#: src/gui/window.py +msgid "Password" +msgstr "Пароль" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Разблокировать архив паролем" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Введите пароль ниже, чтобы разблокировать архив с вашей конфигурацией. Если вы его забыли, то не сможете распаковать архив и начать импорт вашей конфигурации." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" +"Пожалуйста, введите пароль, чтобы разблокировать архив для синхронизации конфигурации" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Для синхронизации с помощью приложения Save Desktop выбран зашифрованный архив. Введите пароль ниже, чтобы разблокировать его и начать синхронизацию." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Запомнить Пароль" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Пароль не введен или указан неверно. Невозможно продолжить" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Сохранение конфигурации ...\nКонфигурация среды рабочего стола будет сохранена в:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Конфигурация сохранена!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nТеперь вы можете просмотреть архив с конфигурацией вашей среды рабочего стола или вернуться на предыдущую страницу.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Открыть папку" + +#: src/gui/window.py +msgid "Import" +msgstr "Импорт" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Импорт сохраненной конфигурации" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Импорт из файла" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Импорт из папки" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Отменить" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Файлы Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Импорт конфигурации ...\nИмпорт конфигурации из: \n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Конфигурация применена!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nВы можете выйти из системы, чтобы изменения вступили в силу, или вернуться на предыдущую страницу и выйти из системы позже.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Вернуться на предыдущую страницу" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Выйти" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Произошла ошибка" + +#: src/gui/window.py +msgid "Apply" +msgstr "Применить" + +#: src/gui/window.py +msgid "Sync" +msgstr "Синхронизация" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Синхронизируйте конфигурацию среды рабочего стола с другими компьютерами в сети." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Первоначальная настройка синхронизации" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Откройте системные настройки" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Перейдите в раздел «Сетевые учётные записи»" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"В этом разделе выберите нужный облачный сервис, например Google, Microsoft 365 или Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. Нажмите кнопку «Далее» и выберите имеющуюся папку облачного диска" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Создаваемую папку облачного диска можно найти в боковой панели диалога выбора файлов в виде username@service.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Для правильного функционирования синхронизации необходимо иметь папку, которая синхронизируется с облачным сервисом с помощью Rclone.\nНачните с выбора облачного сервиса, который вы используете." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Теперь скопируйте команду для настройки Rclone с помощью боковой кнопки и откройте приложение терминала, используя комбинацию клавиш Ctrl+Alt+T или найдя его в меню приложений." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Завершив настройку Rclone с помощью данной команды, нажмите кнопку «Применить»" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Вместо этого использовать папку Syncthing" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Почти готово!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Теперь вы создали папку на облачном диске! Чтобы завершить настройку, нажмите кнопку «Далее»." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Выбрать" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Далее" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Настройка файла синхронизации" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Файл периодического сохранения" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Файл периодического сохранения не существует." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Создать" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Пожалуйста, подождите…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Изменить" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Подключить облачное хранилище" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"На другом компьютере откройте приложение Save Desktop и на этой странице нажмите кнопку «Настроить файл синхронизации» и выполните необходимые настройки. На этом компьютере выберите папку, которую вы синхронизировали с вашим облачным хранилищем, а также сохранили тот же файл периодического сохранения." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Выбрать папку облачного диска" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Вы не выбрали папку облачного диска!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Периодическая синхронизация" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Двунаправленная синхронизация" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Если этот параметр включен, а интервал синхронизации и папка облачного диска выбраны, информация о периодическом сохранении (интервал, папка и имя файла) с другого компьютера, на котором настроена синхронизация, копируется на этот компьютер." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Теперь вы можете синхронизировать конфиг из меню в панели заголовка" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Синхронизовать вручную" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Комбинации клавиш" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Открыть Wiki-страницу приложения" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Выйти" + +#: src/gui/window.py +msgid "About app" +msgstr "О приложении" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"У вас установлено неподдерживаемое окружение. \nПожалуйста, используйте одно из этих окружений: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Сохраните конфигурацию вашего окружения рабочего стола" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Вы хотите сохранить текущую конфигурацию, включая темы, значки, обои, все настройки окружения рабочего стола, расширения и т.д.? Save Desktop поможет вам в этом. Всего один клик - и ваша конфигурация сохранена." + +#: src/main.py +msgid "Translator credits" +msgstr "" +"voron \nvolkov " + diff --git a/po/savedesktop.pot b/po/savedesktop.pot new file mode 100644 index 00000000..a1636a8b --- /dev/null +++ b/po/savedesktop.pot @@ -0,0 +1,456 @@ +# Translation file for en +# Generated from en.json +# +msgid "" +msgstr "" + +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "" + +#: src/gui/window.py +msgid "Create new password" +msgstr "" + +#: src/gui/window.py +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "" + +#: src/gui/window.py +msgid "Password" +msgstr "" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "" + +#: src/gui/window.py +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +#: src/gui/password_checker.py +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" + +#: src/gui/password_checker.py +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" + +#: src/gui/window.py +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "" + +#: src/gui/window.py +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "" + +#: src/gui/window.py +msgid "Import" +msgstr "" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "" + +#: src/gui/window.py +msgid "Cancel" +msgstr "" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "" + +#: src/gui/window.py +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "" + +#: src/gui/window.py +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "" + +#: src/gui/window.py +msgid "Log Out" +msgstr "" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "" + +#: src/gui/window.py +msgid "Apply" +msgstr "" + +#: src/gui/window.py +msgid "Sync" +msgstr "" + +#: src/gui/window.py +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Copy" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "" + +#: src/gui/window.py +msgid "About app" +msgstr "" + +#: src/gui/window.py +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" + +#: src/main.py +msgid "Translator credits" +msgstr " " + diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 00000000..50158e4c --- /dev/null +++ b/po/sv.po @@ -0,0 +1,474 @@ +# Translation file for sv +# Generated from sv.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Spara" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Spara nuvarande konfiguration" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Ange filnamn" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Objekt som ska inkluderas i konfigurationsarkivet" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Dessa inställningar gäller även för periodiskt sparande" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Ikoner" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Teman" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Teckensnitt" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Bakgrunder" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Tillägg" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Skrivbord" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak program" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Lista av installerade Flatpak program" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Användardata av installerade Flatpak program" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Dataval för Flatpak program" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Mer alternativ" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Periodiskt sparande" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Ändringar träder i kraft först efter nästa inloggning" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Intervall" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Aldrig" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Dagligen" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Veckovis" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Månadsvis" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Manuellt" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Läs mer" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Mapp för periodiskt sparande" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Välj anpassad mapp för periodiskt sparande" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Välj en annan mapp" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Filnamnsformat" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Återställ till standard" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Lösenord för kryptering" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Manuell sparning" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Arkivkryptering" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"När du sparar konfigurationen manuellt blir du ombedd att skapa ett lösenord. Detta är användbart när du sparar konfigurationen på flyttbart media för bättre säkerhet för din data." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Spara konfigurationen utan att skapa ett arkiv" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Skapa nytt lösenord" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Skapa ett nytt lösenord för ditt arkiv. Kriterier inkluderar en längd på minst 12 tecken, en stor bokstav, en liten bokstav och ett specialtecken." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Generera lösenord" + +#: src/gui/window.py +msgid "Password" +msgstr "Lösenord" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Lås upp arkivet med ett lösenord" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Ange lösenordet nedan för att låsa upp arkivet med din konfiguration. Om du har glömt det kommer du inte att kunna packa upp arkivet och börja importera din konfiguration." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" +"Ange ett lösenord för att låsa upp arkivet för att synkronisera konfigurationen." + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Ett krypterat arkiv har valts ut för synkronisering med Save Desktop programmet. Ange lösenordet nedan för att låsa upp det och starta synkroniseringen." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Kom ihåg lösenord" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "" +"Lösenordet är inte inmatat, eller så är det felaktigt. Det går inte att fortsätta." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Sparar konfiguration …\nKonfigurationen av din skrivbordsmiljö kommer att sparas i:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Konfigurationen har sparats!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nDu kan nu se arkivet med konfigurationen av din skrivbordsmiljö, eller gå tillbaka till föregående sida.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Öppna mappen" + +#: src/gui/window.py +msgid "Import" +msgstr "Importera" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Importera sparad konfiguration" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Importera från fil" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Importera från mapp" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Avbryt" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop filer" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Importerar konfiguration …\nImporterar konfiguration från:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Konfigurationen har tillämpats!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nDu kan logga ut från systemet för att ändringarna ska träda i kraft, eller gå tillbaka till föregående sida och logga ut senare.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Tillbaka till föregående sida" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Logga ut" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Ett fel har uppstått" + +#: src/gui/window.py +msgid "Apply" +msgstr "Tillämpa" + +#: src/gui/window.py +msgid "Sync" +msgstr "Synkronisera" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Synkronisera konfigurationen av din skrivbordsmiljö med andra datorer i nätverket." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Inledande synkroniseringsinställningar" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Öppna systeminställningarna" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Gå till avsnittet Onlinekonton" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"I det här avsnittet väljer du den molntjänst du vill ha, till exempel Google, Microsoft 365 eller Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. Klicka på knappen Nästa och välj den skapade molnlagringsmappen" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Den skapade molnlagringsmappen finns i sidopanelen i filväljardialogrutan, i denna form: användarnamn@service.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"För att synkroniseringen ska fungera korrekt måste du ha mappen som är synkroniserad med din molntjänst med hjälp av Rclone.\nBörja med att välja den molnlagringstjänst du använder." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Kopiera nu kommandot för att ställa in Rclone med hjälp av sidoknappen och öppna terminalappen med kortkommandot Ctrl+Alt+T eller leta reda på det i programmenyn." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"När du har slutfört konfigureringen av Rclone med det angivna kommandot klickar du på \"Verkställ\" knappen" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Använd Syncthing mapp istället" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Nästan klart!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Du har nu skapatmolnenhet mappen! Klicka på nästa för att slutföra installationen." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Välj" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Nästa" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Ställ in synkfil" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Periodisk sparfil" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Periodisk sparfil existerar inte." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Skapa" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Vänligen vänta …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Ändra" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Anslut till molnlagring" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"På den andra datorn öppnar du Save Desktop programmet och på den här sidan klickar du på knappen \"Konfigurera synkroniseringsfil\" och gör nödvändiga inställningar. På den här datorn väljer du mappen som du har synkroniserat med din molnlagring och som även har sparat samma periodiska sparfil." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Välj mappen i molnlagring" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Du valde inte mappen för molnlagring!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Periodisk synkronisering" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Dubbelriktad synkronisering" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Om det är aktiverat och synkroniseringsintervallet och mappen för molnlagring är vald, kopieras den periodiska sparinformationen (intervall, mapp och filnamn) från den andra datorn med synkronisering inställd på att synkronisera till den här datorn." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Från och med nu kan du synkronisera konfigurationen från menyn i huvudfältet" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Synkronisera manuellt" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Tangentbordsgenvägar" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Öppna programmets wiki" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Avsluta" + +#: src/gui/window.py +msgid "About app" +msgstr "Om programmet" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Du har en miljö som inte stöds installerad. \nVänligen använd någon av dessa miljöer: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Spara din skrivbordskonfiguration" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop låter dig spara din nuvarande konfiguration (teman, ikoner, bakgrundsbilder, alla skrivbordsmiljöinställningar, tillägg, etc.) med ett klick." + +#: src/main.py +msgid "Translator credits" +msgstr "Luna Jernberg https://github.com/bittin/" + diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 00000000..cc7bacd9 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,471 @@ +# Translation file for ta +# Generated from ta.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: ta\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "சேமி" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "தற்போதைய உள்ளமைவைச் சேமி" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "கோப்புப் பெயரை அமை" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "உள்ளமைவு காப்பகத்தில் சேர்க்க வேண்டிய உருப்படிகள்" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "இந்த அமைப்புகள் அவ்வப்போது சேமிப்பதற்கும் பொருந்தும்" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "சின்னங்கள்" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "கருப்பொருள்கள்" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "எழுத்துருக்கள்" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "பின்னணிகள்" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "நீட்டிப்புகள்" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "பணிமேடை" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "தட்டைகட்டு பயன்பாடுகள்" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "நிறுவப்பட்ட தட்டைகட்டு பயன்பாடுகளின் பட்டியல்" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "நிறுவப்பட்ட தட்டைகட்டு பயன்பாடுகளின் பயனர் தரவு" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "தட்டைகட்டு பயன்பாடுகள் தரவுத் தேர்வு" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "மேலும் விருப்பங்கள்" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "அவ்வப்போது சேமி" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "அடுத்த உள்நுழைவுக்குப் பிறகுதான் மாற்றங்கள் நடைமுறைக்கு வரும்" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "இடைவேளை" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "ஒருபோதும்" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "நாள்தோறும்" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "வாராந்தோறும்" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "திங்கள்தோறும்" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "கைமுறையாக" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "மேலும் அறிக" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "அவ்வப்போது சேமிப்பதற்கான கோப்புறை" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "அவ்வப்போது சேமிக்க தனிப்பயன் கோப்புறையைத் தேர்வுசெய்க" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "மற்றொரு கோப்புறையைத் தேர்வுசெய்க" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "கோப்புப் பெயர் வடிவம்" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "இயல்புநிலைக்கு மீட்டமை" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "குறியாக்கத்திற்கான கடவுச்சொல்" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "கையேடு சேமிப்பு" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "காப்பக குறியாக்கம்" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"உள்ளமைவை கைமுறையாகச் சேமிக்கும்போது, கடவுச்சொல்லை உருவாக்கும்படி கேட்கப்படுவீர்கள். உங்கள் தரவின் சிறந்த பாதுகாப்பிற்காக உள்ளமைவை எடுத்துசெல்லதக்க ஊடகத்தில் சேமிக்கும்போது இது பயனுள்ளதாக இருக்கும்." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "காப்பகத்தை உருவாக்காமல் உள்ளமைவைச் சேமி" + +#: src/gui/window.py +msgid "Create new password" +msgstr "புதிய கடவுச்சொல்லை உருவாக்கு" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"உங்கள் காப்பகத்திற்கு புதிய கடவுச்சொல்லை உருவாக்கு. அளவுகோல்கள் குறைந்தது 12 எழுத்து நீளம், ஒரு பெரிய எழுத்து, ஒரு சிறிய எழுத்து மற்றும் ஒரு சிறப்பு எழுத்து ஆகியவை அடங்கும்." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "கடவுச்சொல்லை உருவாக்கு" + +#: src/gui/window.py +msgid "Password" +msgstr "கடவுச்சொல்" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "கடவுச்சொல் மூலம் காப்பகத்தைத் திற" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"உங்கள் உள்ளமைவுடன் காப்பகத்தைத் திறக்கக் கீழே உள்ள கடவுச்சொல்லை உள்ளிடவும். நீங்கள் அதை மறந்துவிட்டால், நீங்கள் காப்பகத்தை அவிழ்த்து உங்கள் உள்ளமைவை இறக்குமதி செய்யத் தொடங்க முடியாது." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "உள்ளமைவை ஒத்திசைக்க காப்பகத்தைத் திறக்கக் கடவுச்சொல்லை உள்ளிடவும்" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Savedesktop பயன்பாட்டைப் பயன்படுத்தி ஒத்திசைவுக்கு மறைகுறியாக்கப்பட்ட காப்பகம் தேர்ந்தெடுக்கப்பட்டுள்ளது. அதைத் திறக்கக் கீழே உள்ள கடவுச்சொல்லை உள்ளிடவும் மற்றும் ஒத்திசைவைத் தொடங்கவும்." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "கடவுச்சொல்லை நினைவில் கொள்" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "கடவுச்சொல் உள்ளிடப்படவில்லை, அல்லது அது தவறானது. தொடர முடியவில்லை." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +" உள்ளமைவைச் சேமித்தல்… \n உங்கள் பணிமேடை சூழலின் உள்ளமைவு சேமிக்கப்படும்:\n {}/{}. Sd.tar.gz \n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "உள்ளமைவு சேமிக்கப்பட்டது!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +" {} \n உங்கள் பணிமேடை சூழலின் உள்ளமைவுடன் காப்பகத்தை இப்போது காணலாம் அல்லது முந்தைய பக்கத்திற்குத் திரும்பலாம்.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "கோப்புறையைத் திற" + +#: src/gui/window.py +msgid "Import" +msgstr "இறக்குமதி" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "இறக்குமதி சேமிக்கப்பட்ட உள்ளமைவு" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "கோப்பிலிருந்து இறக்குமதி" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "கோப்புறையிலிருந்து இறக்குமதி" + +#: src/gui/window.py +msgid "Cancel" +msgstr "கைவிடு" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "சேமிபணிமேடை கோப்புகள்" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +" உள்ளமைவை இறக்குமதி செய்தல்… \n இதிலிருந்து உள்ளமைவை இறக்குமதி செய்தல்:\n {} \n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "உள்ளமைவு பயன்படுத்தப்பட்டது!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +" {} \n மாற்றங்கள் நடைமுறைக்கு வர நீங்கள் கணினியிலிருந்து வெளியேறலாம், அல்லது முந்தைய பக்கத்திற்குச் சென்று பின்னர் வெளியேறலாம்.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "முந்தைய பக்கத்திற்குத் திரும்பு" + +#: src/gui/window.py +msgid "Log Out" +msgstr "விடுபதிகை" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "பிழை ஏற்பட்டது" + +#: src/gui/window.py +msgid "Apply" +msgstr "இடு" + +#: src/gui/window.py +msgid "Sync" +msgstr "ஒத்திசைவு" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "இணைப்பில் உள்ள பிற கணினிகளுடன் உங்கள் பணிமேடை சூழல் உள்ளமைவை ஒத்திசை." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "ஆரம்ப ஒத்திசைவு அமைப்பு" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. கணினி அமைப்புகளைத் திற" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. நிகழ்நிலை கணக்குகள் பகுதிக்குச் செல்" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"இந்தப் பிரிவில் கூகிள், நுண்மென் 365 அல்லது அடுத்தமுகில் போன்ற நீங்கள் விரும்பும் முகில் சேவையைத் தேர்ந்தெடு." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. அடுத்த பொத்தானைக் சொடுக்கு செய்து உருவாக்கிய முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடு" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"உருவாக்கப்பட்ட முகில் இயக்கிக் கோப்புறையை கோப்புத் தேர்வு உரையாடலின் பக்க பலைகையில் இந்தப் படிவத்தில் காணலாம்: USERNAME@SERVICE.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"சரியாக வேலை செய்ய ஒத்திசைவு, நீங்கள் கோப்புறையை வைத்திருக்க வேண்டும், அது ஆர்நகலியைப் பயன்படுத்தி உங்கள் முகில் சேவையுடன் ஒத்திசைக்கப்படுகிறது.\n நீங்கள் பயன்படுத்தும் முகில் இயக்கிச் சேவையைத் தேர்ந்தெடுப்பதன் மூலம் தொடங்கு. " + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"இப்போது, பக்க பொத்தானைப் பயன்படுத்தி ஆர்நகலியை அமைக்கக் கட்டளையை நகலெடுத்து, கட்டு+மாற்று+ஏ விசைப்பலகை குறுக்குவழியைப் பயன்படுத்தி முனையப் பயன்பாட்டைத் திற அல்லது பயன்பாடுகளின் பட்டியலில் கண்டுபிடி." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"வழங்கப்பட்ட கட்டளையைப் பயன்படுத்தி ஆர்நகலியை அமைத்ததும், \"இடு\" பொத்தானைக் சொடுக்கு" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "அதற்குப் பதிலாக ஒத்திசைவு கோப்புறையைப் பயன்படுத்தவும்" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "கிட்டத்தட்ட முடிந்தது!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"நீங்கள் இப்போது முகில் இயக்கிக் கோப்புறையை உருவாக்கியுள்ளீர்கள்! அமைப்பை முடிக்க அடுத்த பொத்தானைக் சொடுக்கு." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "தேர்ந்தெடு" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "அடுத்தது" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "ஒத்திசைவு கோப்பை அமை" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "அவ்வப்போது சேமிக்கும் கோப்பு" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "அவ்வப்போது சேமிக்கும் கோப்பு இல்லை." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "உருவாக்கு" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "தயவுசெய்து காத்திரு…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "மாற்றம்" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "முகில் சேமிப்பகத்துடன் இணை" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"மற்றொரு கணினியில், சேமிபணிமேடை பயன்பாட்டைத் திறந்து, இந்தப் பக்கத்தில், \"ஒத்திசைவு கோப்பை அமைக்கவும்\" பொத்தானைக் சொடுக்கு செய்து தேவையான அமைப்புகளை உருவாக்கவும். இந்தக் கணினியில், உங்கள் மேகக்கணி சேமிப்பகத்துடன் நீங்கள் ஒத்திசைத்த கோப்புறையைத் தேர்ந்தெடுக்கவும், அதே கால சேமிப்பு கோப்பையும் சேமித்துள்ளீர்கள்." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடு" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "நீங்கள் முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடுக்கவில்லை!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "அவ்வப்போது ஒத்திசைவு" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "இருதரப்பு ஒத்திசைவு" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"இயக்கப்பட்டிருந்தால், மற்றும் ஒத்திசைவு இடைவெளி மற்றும் முகில் இயக்கிக் கோப்புறை தேர்ந்தெடுக்கப்பட்டால், ஒத்திசைவதற்கு அமைக்கப்பட்ட பிற கணினியிலிருந்து அவ்வப்போது சேமிக்கும் செய்தி (இடைவெளி, கோப்புறை மற்றும் கோப்புப் பெயர்) இந்தக் கணினியில் நகலெடுக்கப்படுகிறது." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "இனிமேல், தலைப்பு பட்டியில் உள்ள பட்டியலிருந்து உள்ளமைவை ஒத்திசைக்கலாம்" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "கைமுறையாக ஒத்திசை" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "விசைப்பலகை குறுக்குவழிகள்" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "பயன்பாட்டு விக்கியைத் திற" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "வெளியேறு" + +#: src/gui/window.py +msgid "About app" +msgstr "பயன்பாடுபற்றி" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +" உங்களிடம் ஆதரிக்கப்படாத சூழல் நிறுவப்பட்டுள்ளது. \nஇந்தச் சூழல்களில் ஒன்றைப் பயன்படுத்தவும்: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "உங்கள் பணிமேடை உள்ளமைவைச் சேமி" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"உங்கள் தற்போதைய உள்ளமைவை (கருப்பொருள்கள், சின்னங்கள், பின்ணணிகள், அனைத்து பணிமேடை சுற்றுச்சூழல் அமைப்புகள், நீட்டிப்புகள் போன்றவை) ஒரே சொடுக்கில் சேமிக்க சேமிபணிமேடை உங்களை அனுமதிக்கிறது." + +#: src/main.py +msgid "Translator credits" +msgstr "தமிழ்நேரம் " + diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 00000000..2270e7c4 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,475 @@ +# Translation file for tr +# Generated from tr.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Kaydet" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Şuanki ayarları kaydet" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Dosya adı" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Yapılandırma arşivine eklenecek ögeler" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Bu ayarlar aynı zamanda düzenli kayıt için de uygulanır" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Simgeler" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Temalar" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Yazı Tipleri" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Arka Planlar" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Uzantılar" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Masaüstü" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak uygulamaları" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Kurulu Flatpak uygulamalarının listesi" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Kurulu Flatpak uygulamalarının kullanıcı verileri" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Flatpak uygulamaları veri seçimi" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Daha çok seçenek" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Düzenli kaydetme" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "" +"Değişiklikler yalnızca sonraki oturum açma işleminden sonra geçerli olacak" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Aralık" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Asla" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Günlük" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Haftalık" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Aylık" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Elle" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Daha çoğunu öğren" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Düzenli kayıt klasörü" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Düzenli kayıt için özel klasör seçin" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Başka bir klasör seçin" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Dosya adı biçimi" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Öntanımlılara sıfırla" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Şifreleme için parola" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Manuel kaydet" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Arşiv şifreleme" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"Yapılandırmayı elle kaydederken parola oluşturmanız istenir. Bu, verilerinizin daha iyi güvenliği için yapılandırmayı taşınabilir ortama kaydederken kullanışlıdır." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Arşiv oluşturmadan yapılandırmayı kaydedin" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Yeni parola oluştur" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Lütfen arşiviniz için yeni parola oluşturun. Parolanız en az 12 karakter uzunluğunda olmalı, bir büyük harf, bir küçük harf ve bir özel karakter içermelidir." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Parola Oluştur" + +#: src/gui/window.py +msgid "Password" +msgstr "Parola" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Arşiv kilidini parolayla aç" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Yapılandırmanızın bulunduğu arşivin kilidini açmak için aşağıya parolayı girin. Parolayı unuttuysanız, arşivi açamaz ve yapılandırmanızı içe aktarmaya başlayamazsınız." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" +"Yapılandırmayı senkronize etmek için arşivin kilidini açmak üzere lütfen bir parola girin" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" +"Save Desktop uygulaması kullanılarak senkronizasyon için şifrelenmiş bir arşiv seçildi. Lütfen kilidini açmak ve senkronizasyonu başlatmak için aşağıdaki şifreyi girin." + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Parolayı hatırla" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Şifre girilmedi veya yanlış. Devam edilemiyor." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Yapılandırma kaydediliyor…\nMasaüstü ortamınızın yapılandırması şuraya kaydedilecek:\n{}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Ayarlar kayıt edildi!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nArtık arşivi masaüstü ortamınızın yapılandırmasıyla görüntüleyebilir ya da önceki sayfaya dönebilirsiniz.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Klasörü aç" + +#: src/gui/window.py +msgid "Import" +msgstr "İçe Aktar" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Kaydedilmiş ayarları yükle" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Dosyadan içe aktar" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Klasörden aktar" + +#: src/gui/window.py +msgid "Cancel" +msgstr "İptal et" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop dosyaları" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Yapılandırma içe aktarılıyor...\nYapılandırma şuradan içe aktarılıyor:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Ayarlar uygulandı !" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nDeğişikliklerin geçerli olması için oturumu şimdi kapatabilir ya da önceki sayfaya geri dönüp daha sonra oturumu kapatabilirsiniz.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Önceki sayfaya dön" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Çıkış Yap" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Hata oluştu" + +#: src/gui/window.py +msgid "Apply" +msgstr "Uygula" + +#: src/gui/window.py +msgid "Sync" +msgstr "Eşzamanla" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Masaüstü ortamı yapılandırmanızı ağdaki diğer bilgisayarlarla eşzamanlayın." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "İlk senkronizasyon kurulumu" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Sistem ayarlarını açın." + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Çevrimiçi Hesaplar bölümüne gidin" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"Bu bölümde Google, Microsoft 365 veya Nextcloud gibi istediğiniz bulut hizmetini seçin." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "" +"3. İleri düğmesine tıklayın ve oluşturulan bulut sürücü klasörünü seçin" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Oluşturulan bulut sürücü klasörü, dosya seçici iletişim kutusunun yan panelinde, şu biçimde bulunabilir: kullanıcıadı@sunucu.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Senkronizasyonun düzgün çalışması için, Rclone kullanarak bulut servisinizle senkronize edilmiş klasöre sahip olmanız gerekir.\nKullandığınız bulut sürücü servisini seçerek başlayın." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Şimdi, yan düğmeyi kullanarak Rclone'ı kurmak için komutu kopyalayın ve Ctrl+Alt+T klavye kısayolunu kullanarak veya uygulamalar menüsünden terminal uygulamasını açın." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Verilen komutu kullanarak Rclone kurulumunu tamamladıktan sonra \"Uygula\" düğmesine tıklayın" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Bunun yerine Syncthing klasörünü kullanın" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Az kaldı!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Bulut sürücü klasörünü oluşturdunuz! Kurulumu tamamlamak için İleri düğmesine tıklayın." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Seç" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Sürdür" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Eşzamanlama dosyası ayarla" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Düzenli kayıt dosyası" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Düzenli kayıt dosyası yok." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Oluştur" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Lütfen bekleyin …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Değiştir" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Bulut depolamaya bağlan" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"Başka bilgisayarda Save Desktop uygulamasını açıp bu sayfadaki “Eşzamanlama dosyasını ayarla” düğmesine tıklayın ve gerekli ayarları yapın. Bu bilgisayarda, bulut depolama alanınızla eşzamanlamak istediğiniz ve aynı düzenli kayıt dosyasına kaydettiğiniz klasörü seçin." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Bulut sunucu klasörünü seç" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Bulut sürücü klasörünü seçmediniz!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Düzenli eşzamanlama" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Çift yönlü eşzamanlama" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Etkinse ve eşzamanlama aralığı ve bulut sürücü klasörü seçilirse, eşzamanlama ayarlı diğer bilgisayardaki düzenli kayıt bilgileri (aralık, klasör ve dosya adı) bu bilgisayara kopyalanır." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "Artık yapılandırmayı başlık çubuğundaki menüden eşzamanlayabilirsiniz" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Elle eşzamanla" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Klavye kısayolları" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Uygulama wiki'sini açın" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Çık" + +#: src/gui/window.py +msgid "About app" +msgstr "Uygulama Hakkında" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Daha önceden yüklenmiş , desteklenmeyen ortama sahipsiniz. \nLütfen bu ortamlardan herhangi birini kullanın.: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Masaüstü yapılandırmanızı kaydedin" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop senin suanki ayarlarını(temalar,iconlar,duvar kağıtları, tüm masaüstü ortam ayları , eklentiler , vb.) tek tıkla kaydetmene izin verir." + +#: src/main.py +msgid "Translator credits" +msgstr "" +"Batmanly https://github.com/batmanly\nSabri Ünal https://github.com/yakushabb" + diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 00000000..58889d56 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,473 @@ +# Translation file for uk +# Generated from uk.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "Зберегти" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "Зберегти поточну конфігурацію" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "Задайте ім'я файлу" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "Елементи для включення в архів конфігурації" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "Ці налаштування також застосовуються до періодичного збереження" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "Піктограми" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "Теми" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "Шрифти" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "Шпалери" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "Розширення" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "Робочий стіл" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Додатки Flatpak" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "Список встановлених додатків Flatpak" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "Дані користувача встановлених додатків Flatpak" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Обирання даних Flatpak додатків" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "Додаткові опції" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "Періодичне збереження" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "Зміни набудуть чинності тільки після наступного входу в систему" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "Інтервал" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "Ніколи" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "Щодня" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "Щотижня" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "Щомісяця" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "Вручну" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "Дізнатися більше" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "Тека для періодичного збереження" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "Виберіть власну теку для періодичного збереження" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "Виберіть іншу теку" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "Формат назви файлу" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "Скинути до замовчування" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "Пароль для шифрування" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "Ручне збереження" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "Шифрування архіву" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "" +"При ручному збереженні конфігурації вам буде запропоновано створити пароль. Це корисно, коли ви зберігаєте конфігурацію на портативних носіях для кращого захисту ваших даних." + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "Зберегти конфігурацію без створення архіву" + +#: src/gui/window.py +msgid "Create new password" +msgstr "Створити новий пароль" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" +"Будь ласка, створіть новий пароль для вашого архіву. Критерії включають довжину не менше 12 символів, одну велику літеру, одну маленьку літеру та один спеціальний символ." + +#: src/gui/window.py +msgid "Generate Password" +msgstr "Згенерувати пароль" + +#: src/gui/window.py +msgid "Password" +msgstr "Пароль" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "Розблокувати архів за допомогою пароля" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" +"Введіть пароль нижче, щоб розблокувати архів з вашою конфігурацією. Якщо ви його забули, ви не зможете розпакувати архів і почати імпорт конфігурації." + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "" +"Будь ласка, введіть пароль, щоб розблокувати архів для синхронізації конфігурації" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "Запам'ятати пароль" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "Введено не правильний пароль або нічого. Неможливо продовжити." + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"Збереження конфігурації...\nКонфігурація вашої стільниці буде збережена в:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "Конфігурацію збережено!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\nТепер ви можете переглянути архів з конфігурацією вашої стільниці або повернутися до попередньої сторінки.\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "Відкрити теку" + +#: src/gui/window.py +msgid "Import" +msgstr "Імпорт" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "Імпорт збереженої конфігурації" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "Імпорт з файлу" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "Імпортувати з теки" + +#: src/gui/window.py +msgid "Cancel" +msgstr "Скасувати" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Файли Save Desktop" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"Імпортування конфігурації...\nІмпортування конфігурації з:\n{}\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "Конфігурацію застосовано!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\nВи можете вийти із системи що зміни набули чинності, або повернутися до попередньої сторінки і вийти із системи пізніше.\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "Повернутися до попередньої сторінки" + +#: src/gui/window.py +msgid "Log Out" +msgstr "Вийти" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "Виникла помилка" + +#: src/gui/window.py +msgid "Apply" +msgstr "Застосувати" + +#: src/gui/window.py +msgid "Sync" +msgstr "Синхронізувати" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "" +"Синхронізуйте конфігурацію середовище стільниці з іншими комп'ютерами в мережі." + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "Налаштування початкової синхронізації" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. Відкрийте налаштування системи" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. Перейдіть до розділу \"Онлайн-акаунти\"" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "" +"У цьому розділі виберіть хмарний сервіс, який вам потрібен, наприклад, Google, Microsoft 365 або Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. Натисніть кнопку \"Далі\" та виберіть створену папку хмарного диска" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" +"Створену папку хмарного диска можна знайти в бічній панелі діалогу вибору файлів у вигляді: username@service.com." + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" +"Для правильного функціонування синхронізації, вам потрібно мати папку, яка синхронізується з вашим хмарним сервісом за допомогою Rclone.\nПочніть з вибору хмарного сервісу, який ви використовуєте." + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" +"Тепер скопіюйте команду для налаштування Rclone за допомогою бічної кнопки та відкрийте додаток термінала, використовуючи комбінацію клавіш Ctrl+Alt+T або знайшовши його в меню програм." + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" +"Після того, як ви завершите налаштування Rclone за допомогою наданої команди, натисніть кнопку \"Застосувати\"" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "Використовувати замість теку Syncthing" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "Майже готово!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "" +"Ви щойно створили папку хмарного диска! Натисніть кнопку \"Далі\", щоб завершити налаштування." + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "Вибрати" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "Далі" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "Налаштування файлу синхронізації" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "Періодичне збереження файлу" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "Файл періодичного збереження не існує." + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "Створити" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "Будь ласка, зачекайте…" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "Змінити" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "Підключитися до хмарного сховища" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" +"На іншому комп'ютері відкрийте додаток Save Desktop, а на цій сторінці натисніть кнопку \"Налаштувати файл синхронізації\" і зробіть необхідні налаштування. На цьому комп'ютері виберіть папку, яку ви синхронізували з вашим хмарним сховищем, і де також збережено той же файл періодичного збереження." + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "Виберіть папку хмарного диска" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "Ви не вибрали папку хмарного диска!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "Періодична синхронізація" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "Двостороння синхронізація" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" +"Якщо увімкнено, і вибрані інтервал синхронізації та папка хмарного диска, інформація про періодичне збереження (інтервал, папка та ім'я файлу) з іншого комп'ютера, для якого налаштовано синхронізацію, буде скопійована на цей комп'ютер." + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "" +"Відтепер ви можете синхронізувати налаштування з меню на панелі заголовка" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "Синхронізувати вручну" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "Клавіатурні скорочення" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "Відкрити вікі-документацію додатку" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "Вийти" + +#: src/gui/window.py +msgid "About app" +msgstr "Про додаток" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"Ви використовуєте не підтримуване середовище. \nБудь ласка, використовуйте одне з підтримуваних: {}." + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "Збережіть конфігурацію вашої стільниці" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "" +"Save Desktop дозволяє зберегти поточну конфігурацію (теми, значки, шпалери, всі налаштування середовища робочого столу, розширення тощо) в один клац." + +#: src/main.py +msgid "Translator credits" +msgstr "" +"Kefir2105 https://github.com/Kefir2105\nvolkov " + diff --git a/po/zh_Hans.po b/po/zh_Hans.po new file mode 100644 index 00000000..48715c3b --- /dev/null +++ b/po/zh_Hans.po @@ -0,0 +1,457 @@ +# Translation file for zh_Hans +# Generated from zh_Hans.json +# +msgid "" +msgstr "" +"Project-Id-Version: savedesktop\n" +"POT-Creation-Date: 2025-09-03 19:10\n" +"PO-Revision-Date: 2025-09-03 19:10\n" +"Last-Translator: Auto-generated\n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/window.py +msgid "Save" +msgstr "保存" + +#: src/gui/templates/shortcuts_window.ui:22 +#: src/gui/window.py +msgid "Save the current configuration" +msgstr "保存当前配置" + +#: src/gui/window.py +msgid "Set the file name" +msgstr "设置文件名" + +#: src/gui/templates/shortcuts_window.ui:64 +#: src/gui/window.py +#: src/gui/items_dialog.py +msgid "Items to include in the configuration archive" +msgstr "要包含在配置存档中的项目" + +#: src/gui/items_dialog.py +msgid "These settings also apply to periodic saving" +msgstr "这些设置也适用于定期保存" + +#: src/gui/items_dialog.py +msgid "Icons" +msgstr "图标" + +#: src/gui/items_dialog.py +msgid "Themes" +msgstr "主题" + +#: src/gui/items_dialog.py +msgid "Fonts" +msgstr "字体" + +# Translation key: backgrounds +msgid "Backgrounds" +msgstr "背景" + +#: src/gui/items_dialog.py +msgid "Extensions" +msgstr "扩展" + +#: src/gui/items_dialog.py +msgid "Desktop" +msgstr "桌面" + +#: src/gui/items_dialog.py +msgid "Flatpak apps" +msgstr "Flatpak 包" + +#: src/gui/items_dialog.py +msgid "List of installed Flatpak apps" +msgstr "已安装的Flatpak应用列表" + +#: src/gui/items_dialog.py +msgid "User data of installed Flatpak apps" +msgstr "使用已安装 Flatpak 程序的用户数据" + +#: src/gui/items_dialog.py +msgid "Flatpak apps data selection" +msgstr "Flatpak应用数据选项" + +#: src/gui/templates/shortcuts_window.ui:57 +#: src/gui/more_options_dialog.py +msgid "More options" +msgstr "更多选项" + +#: src/gui/more_options_dialog.py +msgid "Periodic saving" +msgstr "定期保存" + +#: src/gui/more_options_dialog.py +msgid "Changes will only take effect after the next login" +msgstr "更改仅在下次登录后生效" + +#: src/gui/more_options_dialog.py +msgid "Interval" +msgstr "" + +#: src/gui/more_options_dialog.py +msgid "Never" +msgstr "从不" + +#: src/gui/more_options_dialog.py +msgid "Daily" +msgstr "每日" + +#: src/gui/more_options_dialog.py +msgid "Weekly" +msgstr "每周" + +#: src/gui/more_options_dialog.py +msgid "Monthly" +msgstr "每月" + +#: src/gui/more_options_dialog.py +msgid "Manually" +msgstr "手动" + +#: src/gui/more_options_dialog.py +msgid "Learn more" +msgstr "学习更多" + +#: src/gui/more_options_dialog.py +msgid "Folder for periodic saving" +msgstr "定期保存目录" + +#: src/gui/more_options_dialog.py +msgid "Choose custom folder for periodic saving" +msgstr "手动选择定期保存目录" + +#: src/gui/more_options_dialog.py +msgid "Choose another folder" +msgstr "选择其他目录" + +#: src/gui/more_options_dialog.py +msgid "File name format" +msgstr "文件名称格式" + +#: src/gui/more_options_dialog.py +msgid "Reset to default" +msgstr "恢复默认" + +#: src/gui/more_options_dialog.py +msgid "Password for encryption" +msgstr "加密所需的密码" + +#: src/gui/more_options_dialog.py +msgid "Manual saving" +msgstr "手动保存" + +#: src/gui/more_options_dialog.py +msgid "Archive encryption" +msgstr "存档加密" + +# Translation key: archive_encryption_desc +msgid "" +"When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data." +msgstr "在手动保存配置的时候,会有创建密码的提示信息。这在使用移动便携存储设备保存配置时能更好的保护您的数据。" + +#: src/gui/more_options_dialog.py +msgid "Save the configuration without creating an archive" +msgstr "保存配置时不创建存档" + +#: src/gui/window.py +msgid "Create new password" +msgstr "创建新密码" + +# Translation key: create_pwd_desc +msgid "" +"Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character." +msgstr "" + +#: src/gui/window.py +msgid "Generate Password" +msgstr "生成密码" + +#: src/gui/window.py +msgid "Password" +msgstr "密码" + +#: src/gui/window.py +msgid "Unlock the archive with a password" +msgstr "解锁存档时不需要密码" + +# Translation key: check_pwd_desc +msgid "" +"Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration." +msgstr "" + +# Translation key: enter_password_title +msgid "" +"Please enter a password to unlock the archive for sync the configuration" +msgstr "请输入密码解锁存档以同步配置" + +# Translation key: enter_password_desc +msgid "" +"An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." +msgstr "" + +#: src/gui/password_checker.py +msgid "Remember Password" +msgstr "记住密码" + +#: src/core/synchronization.py +msgid "Password not entered, or it's incorrect. Unable to continue." +msgstr "密码为空或密码错误,无法进行下一步。" + +# Translation key: saving_config_status +msgid "" +"Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n" +msgstr "" +"保存配置……\n您的桌面环境配置将被保存至:\n {}/{}.sd.tar.gz\n" + +#: src/gui/window.py +msgid "Configuration has been saved!" +msgstr "配置已保存!" + +# Translation key: config_saved_desc +msgid "" +"{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n" +msgstr "" +"{}\n现在您可以查看桌面环境配置存档,或者返回上一页。\n" + +#: src/gui/window.py +msgid "Open the folder" +msgstr "打开文件夹" + +#: src/gui/window.py +msgid "Import" +msgstr "导入" + +#: src/gui/window.py +msgid "Import saved configuration" +msgstr "导入保存的配置" + +#: src/gui/templates/shortcuts_window.ui:29 +#: src/gui/window.py +msgid "Import from file" +msgstr "从文件导入" + +#: src/gui/window.py +msgid "Import from folder" +msgstr "从文件夹导入" + +#: src/gui/window.py +msgid "Cancel" +msgstr "取消" + +#: src/gui/window.py +msgid "Save Desktop files" +msgstr "Save Desktop文件" + +# Translation key: importing_config_status +msgid "" +"Importing configuration …\nImporting configuration from:\n{}\n" +msgstr "" +"导入配置……\n从:{}导入配置\n" + +#: src/gui/window.py +msgid "The configuration has been applied!" +msgstr "配置已应用!" + +# Translation key: config_imported_desc +msgid "" +"{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n" +msgstr "" +"{}\n您可以注销以使更改生效,或返回上一页稍后再注销。\n" + +#: src/gui/window.py +msgid "Back to previous page" +msgstr "返回上一页" + +#: src/gui/window.py +msgid "Log Out" +msgstr "注销" + +#: src/gui/window.py +msgid "An error occurred" +msgstr "出现一个错误" + +#: src/gui/window.py +msgid "Apply" +msgstr "应用" + +#: src/gui/window.py +msgid "Sync" +msgstr "同步" + +# Translation key: sync_desc +msgid "" +"Sync your desktop environment configuration with other computers in the network." +msgstr "将您的桌面环境配置与网络中的其他计算机同步。" + +#: src/gui/synchronization_dialogs.py +msgid "Initial synchronization setup" +msgstr "初始化同步设置" + +#: src/gui/synchronization_dialogs.py +msgid "1. Open the system settings" +msgstr "1. 打开系统设置" + +#: src/gui/synchronization_dialogs.py +msgid "2. Go to the Online Accounts section" +msgstr "2. 定位到在线账号(Online Accounts)部分" + +# Translation key: gnome_oa_section_desc +msgid "" +"In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud." +msgstr "选择你想使用的任一云服务,比如 Google,Microsoft 365 或 Nextcloud." + +#: src/gui/synchronization_dialogs.py +msgid "3. Click on the Next button and select the created cloud drive folder" +msgstr "3. 点击下一步,选择已创建的云同步文件夹" + +# Translation key: gnome_oa_chooser_desc +msgid "" +"The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com." +msgstr "" + +# Translation key: rclone_intro_desc +msgid "" +"For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use." +msgstr "" + +# Translation key: rclone_copy_cmd +msgid "" +"Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu." +msgstr "" + +# Translation key: rclone_cmd_copied_msg +msgid "" +"Once you have finished setting up Rclone using the command provided, click the \"Apply\" button" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Use Syncthing folder instead" +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Almost done!" +msgstr "马上就好!" + +# Translation key: almost_done_desc +msgid "" +"You've now created the cloud drive folder! Click on the Next button to complete the setup." +msgstr "您已经创建好云驱动文件夹了!点击下一步以完成设置。" + +#: src/gui/synchronization_dialogs.py +msgid "Select" +msgstr "选择" + +#: src/gui/synchronization_dialogs.py +msgid "Next" +msgstr "下一步" + +#: src/gui/templates/shortcuts_window.ui:71 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Set up the sync file" +msgstr "设置同步文件" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file" +msgstr "定期保存文件" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic saving file does not exist." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Create" +msgstr "新建" + +#: src/gui/window.py +msgid "Please wait …" +msgstr "请稍等 …" + +#: src/gui/synchronization_dialogs.py +msgid "Change" +msgstr "更改" + +#: src/gui/templates/shortcuts_window.ui:78 +#: src/gui/synchronization_dialogs.py +#: src/gui/window.py +msgid "Connect to the cloud storage" +msgstr "连接到云存储" + +# Translation key: connect_cloud_storage_desc +msgid "" +"On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file." +msgstr "" + +#: src/gui/synchronization_dialogs.py +msgid "Select the cloud drive folder" +msgstr "选择云驱动文件夹" + +#: src/gui/synchronization_dialogs.py +msgid "You didn't select the cloud drive folder!" +msgstr "您没有选择云驱动文件夹!" + +#: src/gui/synchronization_dialogs.py +msgid "Periodic synchronization" +msgstr "周期性同步" + +#: src/gui/synchronization_dialogs.py +msgid "Bidirectional synchronization" +msgstr "" + +# Translation key: bidirectional_sync_desc +msgid "" +"If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer." +msgstr "" + +#: src/gui/window.py +msgid "From now on, you can sync the config from the menu in the header bar" +msgstr "从现在开始,您可以从标题栏中的菜单中同步配置╰(*°▽°*)╯" + +#: src/gui/templates/shortcuts_window.ui:50 +#: src/gui/window.py +msgid "Synchronise manually" +msgstr "手动同步" + +#: src/gui/templates/shortcuts_window.ui:36 +#: src/gui/window.py +msgid "Keyboard shortcuts" +msgstr "快捷键" + +#: src/gui/templates/shortcuts_window.ui:15 +msgid "Open the application wiki" +msgstr "打开本应用使用说明(WIKI)" + +#: src/gui/templates/shortcuts_window.ui:43 +msgid "Quit" +msgstr "退出" + +#: src/gui/window.py +msgid "About app" +msgstr "关于应用" + +# Translation key: unsuppurted_env_desc +msgid "" +"You have an unsupported environment installed. \nPlease use one of these environments: {}." +msgstr "" +"您安装了不受支持的环境。\n请使用以下环境之一:{}。" + +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:39 +#: data/io.github.vikdevelop.SaveDesktop.desktop.in:4 +#: src/main.py +msgid "Save your desktop configuration" +msgstr "保存您的桌面环境配置" + +# Translation key: description +#: data/io.github.vikdevelop.SaveDesktop.metainfo.xml.in:42 +msgid "" +"Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click." +msgstr "Save Desktop 可让您一键保存当前配置(主题、图标、壁纸、所有桌面环境设置、扩展等)。" + +#: src/main.py +msgid "Translator credits" +msgstr "译者github链接" + diff --git a/src/README.md b/src/README.md deleted file mode 100644 index 9002eeed..00000000 --- a/src/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Navigation -In this directory is located the most important part of the app, which is its source code. -Because there are a lot of files, this README helps you navigate in this directory. - -What are the individual scripts used for? -- `config.py` - saving and importing a user configuration from and to the home folder's directories -- `install_flatpak_from_script.py` - installing Flatpak apps from the list to the system and copying user data from the configuration archive to the ~/.var/app directory -- `items_dialog.py` - selecting what items should be included in the configuration archive -- `localization.py` - setting up the app's language, cache, data directories, and more -- `main_window.py` - showing a GUI of the app -- `password_check_gui.py` - showing a dialog for entering a password to the encrypted archive in the synchronization mode -- `password_store.py` - storing the entered password in the More options dialog or the Connect to the cloud storage dialog to the file -- `periodic_saving.py` - saving a configuration periodically -- `shortcuts_window.py` - showing available keyboard shortcuts in the window -- `synchronization.py` - importing a configuration archive from the cloud storage folder diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 00000000..143f486c --- /dev/null +++ b/src/__init__.py @@ -0,0 +1 @@ +# __init__.py diff --git a/src/core/__init__.py b/src/core/__init__.py new file mode 100644 index 00000000..ac2514b9 --- /dev/null +++ b/src/core/__init__.py @@ -0,0 +1 @@ +# __init__.py (core) diff --git a/src/core/archive.py b/src/core/archive.py new file mode 100644 index 00000000..9b1e5e2a --- /dev/null +++ b/src/core/archive.py @@ -0,0 +1,178 @@ +import os, sys, shutil, subprocess, argparse, re +from savedesktop.globals import * + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--create", help="Create archive", type=str) +parser.add_argument("-u", "--unpack", help="Unpack archive", type=str) +args = parser.parse_args() + +def get_password(): + temp_file = f"{CACHE}/temp_file" + if os.path.exists(temp_file): + with open(temp_file) as tmp: + return tmp.read().strip() + else: + return None + +def remove_temp_file(): + try: + os.remove(f"{CACHE}/temp_file") + except FileNotFoundError: + pass + +class Create: + def __init__(self): + self.start_saving() + + def start_saving(self): + self._cleanup_cache_dir() + subprocess.run([sys.executable, "-m", "savedesktop.core.config", "--save"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + + print("Creating and moving the configuration archive or folder to the user-defined directory") + + if settings["save-without-archive"]: + self._copy_config_to_folder() + else: + self._create_archive() + shutil.copyfile('cfg.sd.zip', f"{args.create}.sd.zip") + + print("Configuration saved successfully.") + remove_temp_file() + + def _cleanup_cache_dir(self): + # Cleanup the cache dir before importing + print("Cleaning up the cache directory") + save_cache_dir = f"{CACHE}/save_config" + try: + shutil.rmtree(save_cache_dir) + except: + pass + os.makedirs(save_cache_dir, exist_ok=True) + os.chdir(save_cache_dir) + + def _copy_config_to_folder(self): + open(f"{CACHE}/save_config/.folder.sd", "w").close() + + if os.path.exists(args.create): + shutil.rmtree(args.create) + + shutil.move(f"{CACHE}/save_config", f"{args.create}") + + def _create_archive(self): + password = get_password() + cmd = ['7z', 'a', '-tzip', '-mx=3', '-x!*.zip', '-x!saving_status', 'cfg.sd.zip', '.'] + if settings["enable-encryption"]: + cmd.insert(4, "-mem=AES256") + cmd.insert(5, f"-p{password}") + + proc = subprocess.run(cmd, capture_output=True, text=True) + + if proc.returncode not in (0, 1): + # 0 = everything is OK, 1 = warning (e.g. file not found) + raise OSError(f"7z failed: {proc.stderr}") + else: + print("7z finished with warnings:", proc.stderr) + +class Unpack: + def __init__(self): + self.start_importing() + + def start_importing(self): + self.import_file = args.unpack + self.import_folder = args.unpack + + self._cleanup_cache_dir() + self._check_config_type() + + # Check, if the input is folder or not + if self.is_folder: + self._copy_folder_to_cache() + else: + if self.import_file.endswith(".sd.zip"): + self._unpack_zip_archive() + + elif ".sd.tar.gz" in self.import_file: + self._unpack_tar_archive() + + self._replace_home_in_files(".", home) + subprocess.run([sys.executable, "-m", "savedesktop.core.config", "--import_"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + + self._remove_status_file() + + print("Configuration imported successfully.") + remove_temp_file() + + def _cleanup_cache_dir(self): + # Cleanup the cache dir before importing + print("Cleaning up the cache directory") + imp_cache_dir = f"{CACHE}/import_config" + try: + shutil.rmtree(imp_cache_dir) + except: + pass + os.makedirs(imp_cache_dir, exist_ok=True) + os.chdir(imp_cache_dir) + + # Create a txt file to prevent removing the cache's content after closing the app window + open("import_status", "w").close() + + def _check_config_type(self): + if self.import_file.endswith(".sd.zip") or self.import_file.endswith(".sd.tar.gz"): + self.is_folder = False + else: + self.is_folder = True + + def _copy_folder_to_cache(self): + shutil.copytree(self.import_folder, f"{CACHE}/import_config", dirs_exist_ok=True, ignore_dangling_symlinks=True) + + def _unpack_zip_archive(self): + password = get_password() + + if password: + try: + subprocess.run( + ['7z', 'e', '-so', f'-p{password}' if password else '', self.import_file, 'dconf-settings.ini'], + capture_output=True, text=True, check=True + ) + except subprocess.CalledProcessError as e: + first_error = next((l for l in e.stderr.splitlines() if "Wrong password" in l), None) + raise ValueError(first_error or "Wrong password") + print("Checking password is completed.") + + subprocess.run( + ['7z', 'x', '-y', f'-p{password}', self.import_file, f'-o{CACHE}/import_config'], + capture_output=False, text=True, check=True + ) + + def _unpack_tar_archive(self): + subprocess.run(["tar", "-xzf", self.import_file, "-C", f"{CACHE}/import_config"],capture_output=True, text=True, check=True) + + # Replace original /home/$USER path with actual path in the dconf-settings.ini file and other XML files + def _replace_home_in_files(self, root, home, patterns=(".xml", ".ini")): + regex = re.compile(r"/home/[^/]+/") + for dirpath, _, filenames in os.walk(root): + for filename in filenames: + if filename.endswith(patterns): + path = os.path.join(dirpath, filename) + with open(path, "r", encoding="utf-8") as f: + text = f.read() + new_text = regex.sub(f"{home}/", text) + if new_text != text: + with open(path, "w", encoding="utf-8") as f: + f.write(new_text) + print(f"Updated /home/$USER path in: {path}") + + def _remove_status_file(self): + if all(not os.path.exists(p) for p in [ + f"{CACHE}/import_config/app", + f"{CACHE}/import_config/installed_flatpaks.sh", + f"{CACHE}/import_config/installed_user_flatpaks.sh" + ]): + os.remove("import_status") + +if args.create: + Create() +elif args.unpack: + Unpack() +else: + pass diff --git a/src/config.py b/src/core/config.py similarity index 98% rename from src/config.py rename to src/core/config.py index f2ab92fb..139422ee 100644 --- a/src/config.py +++ b/src/core/config.py @@ -1,6 +1,6 @@ import os, shutil, argparse from gi.repository import GLib -from localization import * +from savedesktop.globals import * # Helping functions def safe_copy(src: str, dst: str): @@ -207,7 +207,7 @@ def __init__(self): elif environment: print(f"Importing environment-specific config for: {environment['de_name']}") for src, dst in environment["dirs"]: - safe_copytree(dst, os.path.join(home, src)) + safe_copytree(dst, src) else: print(f"[WARN] Unknown DE: {environment_key}") @@ -217,13 +217,13 @@ def __init__(self): # Create an autostart file to install Flatpaks from a list after the next login def create_flatpak_autostart(self): - os.system(f"cp {system_dir}/install_flatpak_from_script.py {CACHE}/") + os.system(f"cp /app/share/savedesktop/savedesktop/core/flatpaks_installer.py {CACHE}/") if not os.path.exists(f"{DATA}/savedesktop-synchronization.sh") or not os.path.exists(f"{CACHE}/syncing/sync_status"): if not os.path.exists(f"{home}/.config/autostart"): os.mkdir(f"{home}/.config/autostart") if not os.path.exists(f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Flatpak.desktop"): with open(f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Flatpak.desktop", "w") as fa: - fa.write(f"[Desktop Entry]\nName=SaveDesktop (Flatpak Apps installer)\nType=Application\nExec=python3 {CACHE}/install_flatpak_from_script.py") + fa.write(f"[Desktop Entry]\nName=SaveDesktop (Flatpak Apps installer)\nType=Application\nExec=python3 {CACHE}/flatpaks_installer.py") if args.save: Save() diff --git a/src/install_flatpak_from_script.py b/src/core/flatpaks_installer.py similarity index 100% rename from src/install_flatpak_from_script.py rename to src/core/flatpaks_installer.py diff --git a/src/core/meson.build b/src/core/meson.build new file mode 100644 index 00000000..9b121859 --- /dev/null +++ b/src/core/meson.build @@ -0,0 +1,11 @@ +core_sources = [ '__init__.py', + 'archive.py', + 'config.py', + 'flatpaks_installer.py', + 'password_store.py', + 'periodic_saving.py', + 'synchronization.py', + 'synchronization_setup.py', + ] + +install_data(core_sources, install_dir: moduledir / 'core') \ No newline at end of file diff --git a/src/password_store.py b/src/core/password_store.py similarity index 98% rename from src/password_store.py rename to src/core/password_store.py index bc9b0524..8382765d 100644 --- a/src/password_store.py +++ b/src/core/password_store.py @@ -1,5 +1,5 @@ import hashlib, os -from localization import * +from savedesktop.globals import * # Repeated XOR with SHA-256-hashed key def xor(data: bytes, key: bytes) -> bytes: @@ -70,3 +70,4 @@ def load_pwd(self): except Exception as e: print("[ERROR]", e) return None + diff --git a/src/periodic_saving.py b/src/core/periodic_saving.py similarity index 86% rename from src/periodic_saving.py rename to src/core/periodic_saving.py index a9a90b56..dcdb5e0a 100644 --- a/src/periodic_saving.py +++ b/src/core/periodic_saving.py @@ -1,9 +1,9 @@ -import argparse, json, os, gi, shutil, subprocess +import argparse, json, os, gi, shutil, subprocess, sys from datetime import datetime, date, timedelta from pathlib import Path from gi.repository import GLib, Gio -from localization import * -from password_store import * +from savedesktop.globals import * +from savedesktop.core.password_store import PasswordStore # Get the current date dt = datetime.now() @@ -71,7 +71,7 @@ def backup(self): os.makedirs(f"{CACHE}/periodic_saving", exist_ok=True) os.chdir(f"{CACHE}/periodic_saving") os.system("echo > saving_status") - os.system(f"python3 {system_dir}/config.py --save") + subprocess.run([sys.executable, "-m", "savedesktop.core.config", "--save"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) print("creating the configuration archive") print("moving the configuration archive to the user-defined directory") @@ -87,9 +87,9 @@ def get_password_from_file(self): except: self.password = None if self.password != None: - os.system(f'7z a -tzip -mx=6 -p"{self.password}" -x!*.zip -x!saving_status cfg.sd.zip .') + subprocess.run(['7z', 'a', '-tzip', '-mx=6', f'-p{self.password}', '-mem=AES256', '-x!*.zip', '-x!saving_status', 'cfg.sd.zip', '.'], check=True) else: - os.system(f"7z a -tzip -mx=6 -x!*.zip -x!saving_status cfg.sd.zip .") + subprocess.run(['7z', 'a', '-tzip', '-mx=6', '-x!*.zip', '-x!saving_status', 'cfg.sd.zip', '.'], check=True) shutil.copyfile('cfg.sd.zip', f'{self.pbfolder}/{self.filename}.sd.zip') def save_last_backup_date(self): @@ -108,3 +108,4 @@ def config_saved(self): pb = PeriodicBackups() pb.run(args.now) + diff --git a/src/synchronization.py b/src/core/synchronization.py similarity index 78% rename from src/synchronization.py rename to src/core/synchronization.py index bcc264ee..395b453f 100644 --- a/src/synchronization.py +++ b/src/core/synchronization.py @@ -1,10 +1,10 @@ #!/usr/bin/python3 from pathlib import Path from datetime import datetime, date, timedelta -import subprocess, os, locale, json, gi, socket, shutil, zipfile, tarfile, re +import subprocess, os, locale, json, sys, gi, socket, shutil, zipfile, tarfile, re from gi.repository import Gio, GLib -from localization import * -from password_store import * +from savedesktop.globals import * +from savedesktop.core.password_store import PasswordStore dt = datetime.now() @@ -39,7 +39,7 @@ def get_sync_interval(self): if interval is None: settings["manually-sync"] = settings["periodic-import"] == "Manually2" if settings["manually-sync"]: - self.check_sync_date() + self.check_manually_sync_status() else: print("Synchronization is not set up.") else: @@ -63,19 +63,19 @@ def check_manually_sync_status(self): # Download the configuration archive from the cloud drive folder def download_config(self): - subtitle = (lambda s: re.sub(r'<.*?>', '', s).split('…')[-1].strip())(_["importing_config_status"].format(settings["file-for-syncing"])) + subtitle = (lambda s: re.sub(r'<.*?>', '', s).split('…')[-1].strip())(_("Importing configuration …\nImporting configuration from:\n{}").format(settings["file-for-syncing"])) os.system(f'notify-send "Save Desktop Synchronization" "{subtitle}"') if not os.path.exists(f"{settings['file-for-syncing']}/SaveDesktop.json"): - err_str = _["err_occured"] + err_str = _("An error occurred") err = "SaveDesktop.json doesn't exist in the cloud drive folder!" os.system(f'notify-send "{err_str}" "{err}"') - exit() - self.get_pb_info() - os.makedirs(f"{CACHE}/syncing", exist_ok=True) # create the subfolder in the cache directory - os.chdir(f"{CACHE}/syncing") - os.system("echo > sync_status") # create a txt file to prevent removing the sync's folder content after closing the app window - print("extracting the archive") - self.get_zip_file_status() + else: + self.get_pb_info() + os.makedirs(f"{CACHE}/syncing", exist_ok=True) # create the subfolder in the cache directory + os.chdir(f"{CACHE}/syncing") + os.system("echo > sync_status") # create a txt file to prevent removing the sync's folder content after closing the app window + print("extracting the archive") + self.get_zip_file_status() # Get data from the SaveDesktop.json file such as filename format, periodic saving interval and folder (for bidirectional synchronization) def get_pb_info(self): @@ -115,7 +115,7 @@ def try_passwordstore(): # #2 If it fails, run GUI if not self.password: - os.system(f"python3 {system_dir}/password_check_gui.py") + subprocess.run([sys.executable, "-m", "savedesktop.gui.password_checker"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) self.password = try_passwordstore() # #3 If password is still unavailable, get it from the {DATA}/entered-password.txt file @@ -125,10 +125,9 @@ def try_passwordstore(): # #4 Final check if not self.password: - msg = _["password_store_err"] - err_occured = _['err_occured'] - print(msg) - os.system(f'notify-send "{err_occured}" "{msg}"') + msg = _("Password not entered, or it's incorrect. Unable to continue.") + err_occurred = _("An error occurred") + os.system(f'notify-send "{msg}" "{err_occurred}"') exit() # #5 Continue in extraction @@ -158,13 +157,16 @@ def extract_archive(self): self.password = None os.system(f"rm {DATA}/entered-password.txt") except Exception as e: - os.system(f"notify-send '{_['err_occured']}' '{e}' -i io.github.vikdevelop.SaveDesktop-symbolic") - exit() - self.import_config() + err_occurred = _("An error occurred") + os.system(f"notify-send '{err_str}' '{e}' -i io.github.vikdevelop.SaveDesktop-symbolic") + if os.path.exists(f"{DATA}/password"): + os.remove(f"{DATA}/password") + else: + self.import_config() # Start importing a configuration from the configuration archive def import_config(self): - os.system(f"python3 {system_dir}/config.py --import_") + subprocess.run([sys.executable, "-m", "savedesktop.core.config", "--save"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) self.done() def done(self): @@ -179,6 +181,6 @@ def done(self): shutil.rmtree("syncing") # Send a notification about finished synchronization - os.system(f"notify-send 'Save Desktop ({self.file})' '{_['config_imported']} {_['periodic_saving_desc']}' -i io.github.vikdevelop.SaveDesktop-symbolic") + os.system(f"notify-send 'Save Desktop Synchronization ({self.file})' '{_('The configuration has been applied!')} {_('Changes will only take effect after the next login')}' -i io.github.vikdevelop.SaveDesktop-symbolic") Syncing() diff --git a/src/core/synchronization_setup.py b/src/core/synchronization_setup.py new file mode 100644 index 00000000..c7ea4292 --- /dev/null +++ b/src/core/synchronization_setup.py @@ -0,0 +1,98 @@ +import subprocess, argparse, re, os, gettext +from savedesktop.globals import * + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--checkfs", help="Check file system", action="store_true") +parser.add_argument("-s", "--automount-setup", help="Set up auto mount", type=str) +args = parser.parse_args() + +def check_fs(): + check_filesystem = subprocess.getoutput('df -T "%s" | awk \'NR==2 {print $2}\'' % settings['file-for-syncing']) + if not "gvfsd" in check_filesystem: + if not "rclone" in check_filesystem: + if not os.path.exists(f"{settings['file-for-syncing']}/.stfolder"): + print("You didn't select the cloud drive folder!") + +# set up auto-mounting of the cloud drives after logging in to the system +def set_up_auto_mount(): + if args.automount_setup == "periodic-saving": + cfile_subtitle = settings["periodic-saving-folder"] + elif args.automount_setup == "cloud-receiver": + cfile_subtitle = settings["file-for-syncing"] + else: + cfile_subtitle = "none" + + if not cfile_subtitle == "none": + if "gvfs" in cfile_subtitle: + pattern = r'.*/gvfs/([^:]*):host=([^,]*),user=([^/]*).*' if "google-drive" in cfile_subtitle else r'.*/gvfs/([^:]+):host=([^,]+),user=([^/]+)' if "onedrive" in cfile_subtitle else r'.*/gvfs/([^:]*):host=([^,]*),ssl=([^,]*),user=([^,]*),prefix=([^/]*).*' + + match = re.search(pattern, cfile_subtitle) + + if match: + if "google-drive" in cfile_subtitle: # Google Drive + cloud_service = match.group(1) # cloud_service for Google Drive + host = match.group(2) # host for Google Drive + user = match.group(3) + ssl = None # ssl is not relevant for Google Drive + prefix = None # prefix is not relevant for Google Drive + cmd = f"gio mount {cloud_service}://{user}@{host}" # command for Google Drive + elif "onedrive" in cfile_subtitle: # OneDrive + cloud_service = match.group(1) # cloud_service for OneDrive + host = match.group(2) # host for OneDrive + user = match.group(3) # user is not relevant for OneDrive + ssl = None # ssl is not relevant for OneDrive + prefix = None # prefix is not relevant for OneDrive + cmd = f"gio mount {cloud_service}://{user}@{host}" # command for OneDrive + elif "dav" in cfile_subtitle: # DAV + cloud_service = match.group(1) # cloud_service for DAV + host = match.group(2) # host for DAV + ssl = match.group(3) # ssl for DAV + user = match.group(4) # user for DAV + if match.group(5): # prefix for DAV + prefix_old = match.group(5) + prefix = re.sub(r'gio mount |%2F', '/', prefix_old).replace('//', '').strip() # Replace 2%F with / + else: + prefix = "" + fm = "nautilus" if not self.environment == "Cinnamon" else "nemo" + cmd = ( + f"output=$(secret-tool lookup object Nextcloud) && " + f"output=\"Positive signal\" || " + f"output=\"Negative signal\"\n" + f"if [[ \"$output\" == \"Positive signal\" ]]; then\n" + f" gio mount davs://{user}@{host}{prefix}\n" + f"else\n" + f" {fm} davs://{user}@{host}{prefix}\n" + f"fi" + ) + else: + extracted_values = { + "cloud_service": cloud_service, + "host": host, + "user": user, + "prefix": prefix, + "cmd": cmd + } + elif os.path.exists(f"{cfile_subtitle}/.stfolder"): + cmd = "" + else: + cmd = f"rclone mount {cfile_subtitle.split('/')[-1]}: {cfile_subtitle}" if not os.path.exists(f"{download_dir}/SaveDesktop/rclone_drive") else f"rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive" + + synchronization_content = f'#!/usr/bin/bash\n{cmd}\nsleep 60s\n{sync_cmd}\n{periodic_saving_cmd}' + if flatpak: + synchronization_content += f'\npython3 {CACHE}/flatpaks_installer.py' + with open(f"{DATA}/savedesktop-synchronization.sh", "w") as f: + f.write(synchronization_content) + + os.makedirs(f'{home}/.config/autostart', exist_ok=True) + open(f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", "w").write(f"[Desktop Entry]\nName=SaveDesktop (Synchronization)\nType=Application\nExec=sh {DATA}/savedesktop-synchronization.sh") + + [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Backup.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.MountDrive.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.server.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Flatpak.desktop"] if os.path.exists(path)] + else: + raise AttributeError("There aren't possible to get values from the periodic-saving-folder or file-for-syncing strings") + +if args.checkfs: + print("checkfs - executed") + check_fs() +elif args.automount_setup: + print("automount-setup - executed") + set_up_auto_mount() diff --git a/src/globals.py b/src/globals.py new file mode 100644 index 00000000..631030ec --- /dev/null +++ b/src/globals.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +import gi, os, locale +gi.require_version('Gtk', '4.0') +gi.require_version('Adw', '1') +from gi.repository import Gtk, Adw, Gio, GLib +from pathlib import Path + +# Environment detection +def get_app_environment(): + if os.path.exists("/.flatpak-info"): + return { + 'type': 'flatpak', + 'home': Path(os.getenv('HOME', Path.home())), + 'run_cmd': 'flatpak run io.github.vikdevelop.SaveDesktop' + } + + elif os.environ.get('SNAP_NAME') == 'savedesktop': + return { + 'type': 'snap', + 'home': Path(os.getenv('SNAP_REAL_HOME', os.getenv('HOME', Path.home()))), + 'run_cmd': 'savedesktop' + } + + else: + return { + 'type': 'native', + 'home': Path.home(), + 'run_cmd': 'savedesktop' + } + +env = get_app_environment() + +home = env['home'] + +# System paths +download_dir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD) +settings = Gio.Settings.new_with_path( + "io.github.vikdevelop.SaveDesktop", + "/io/github/vikdevelop/SaveDesktop/" +) + +DATA = f'{GLib.get_user_data_dir()}' +CACHE = f'{GLib.get_user_cache_dir()}' + +# Commands +periodic_saving_cmd = f'{env["run_cmd"]} --background' +sync_cmd = f'{env["run_cmd"]} --sync' + +# Detect flags +flatpak = (env['type'] == 'flatpak') +snap = (env['type'] == 'snap') + +app_prefix = os.environ.get('SAVEDESKTOP_DIR') + +# Export +__all__ = [ + 'home', 'download_dir', 'snap', 'flatpak', 'settings', + 'DATA', 'CACHE', 'app_prefix', 'periodic_saving_cmd', 'sync_cmd' +] + diff --git a/src/gui/__init__.py b/src/gui/__init__.py new file mode 100644 index 00000000..d392e590 --- /dev/null +++ b/src/gui/__init__.py @@ -0,0 +1 @@ +# __init__.py (gui) diff --git a/src/items_dialog.py b/src/gui/items_dialog.py similarity index 90% rename from src/items_dialog.py rename to src/gui/items_dialog.py index cb87b5ee..f258aad1 100644 --- a/src/items_dialog.py +++ b/src/gui/items_dialog.py @@ -2,7 +2,7 @@ gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, Gio, GLib -from localization import * +from savedesktop.globals import * # Row for showing available apps class FolderSwitchRow(Adw.ActionRow): @@ -42,9 +42,9 @@ def on_switch_activated(self, switch, state): # dialog for showing installed Flatpak apps class FlatpakAppsDialog(Adw.AlertDialog): - def __init__(self): + def __init__(self, parent): super().__init__() - self.set_heading(_["flatpaks_data_tittle"]) + self.set_heading(_("Flatpak apps data selection")) # primary Gtk.Box for this dialog self.dialogBox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) @@ -68,8 +68,8 @@ def __init__(self): scrolled_window.set_child(self.flowbox) # add buttons to the dialog - self.add_response('cancel', _["cancel"]) - self.add_response('ok', _["apply"]) + self.add_response('cancel', _("Cancel")) + self.add_response('ok', _("Apply")) self.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) self.connect('response', self.apply_settings) @@ -109,10 +109,12 @@ def apply_settings(self, w, response): settings["disabled-flatpak-apps-data"] = self.old_disabled_flatpaks class itemsDialog(Adw.AlertDialog): - def __init__(self): + def __init__(self, parent): super().__init__() - self.set_heading(_["items_for_archive"]) - self.set_body(_["items_desc"]) + self.parent = parent + + self.set_heading(_("Items to include in the configuration archive")) + self.set_body(_("These settings also apply to periodic saving")) # Box for loading widgets in this dialog self.itemsBox = Gtk.ListBox.new() @@ -127,7 +129,7 @@ def __init__(self): self.switch_01.set_valign(align=Gtk.Align.CENTER) self.icons_row = Adw.ActionRow.new() - self.icons_row.set_title(title=_["icons"]) + self.icons_row.set_title(title=_("Icons")) self.icons_row.set_use_markup(True) self.icons_row.set_title_lines(2) self.icons_row.set_subtitle_lines(3) @@ -142,7 +144,7 @@ def __init__(self): self.switch_02.set_valign(align=Gtk.Align.CENTER) self.themes_row = Adw.ActionRow.new() - self.themes_row.set_title(title=_["themes"]) + self.themes_row.set_title(title=_("Themes")) self.themes_row.set_use_markup(True) self.themes_row.set_title_lines(2) self.themes_row.set_subtitle_lines(3) @@ -157,7 +159,7 @@ def __init__(self): self.switch_03.set_valign(align=Gtk.Align.CENTER) self.fonts_row = Adw.ActionRow.new() - self.fonts_row.set_title(title=_["fonts"]) + self.fonts_row.set_title(title=_("Fonts")) self.fonts_row.set_use_markup(True) self.fonts_row.set_title_lines(2) self.fonts_row.set_subtitle_lines(3) @@ -172,7 +174,7 @@ def __init__(self): self.switch_04.set_valign(align=Gtk.Align.CENTER) self.backgrounds_row = Adw.ActionRow.new() - self.backgrounds_row.set_title(title=_["backgrounds"]) + self.backgrounds_row.set_title(title=_("Backgrounds")) self.backgrounds_row.set_use_markup(True) self.backgrounds_row.set_title_lines(2) self.backgrounds_row.set_subtitle_lines(3) @@ -192,7 +194,7 @@ def __init__(self): self.switch_de.set_valign(align=Gtk.Align.CENTER) self.desktop_row = Adw.ActionRow.new() - self.desktop_row.set_title(title=_["desktop_folder"]) + self.desktop_row.set_title(title=_("Desktop")) self.desktop_row.set_subtitle(subtitle=GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP)) self.desktop_row.set_subtitle_selectable(True) self.desktop_row.set_use_markup(True) @@ -204,7 +206,7 @@ def __init__(self): if flatpak: self.flatpak_row = Adw.ExpanderRow.new() - self.flatpak_row.set_title(title=_["save_installed_flatpaks"]) + self.flatpak_row.set_title(title=_("Flatpak apps")) self.flatpak_row.set_use_markup(True) self.flatpak_row.set_title_lines(2) self.flatpak_row.set_subtitle_lines(3) @@ -217,7 +219,7 @@ def __init__(self): self.switch_05.set_valign(align=Gtk.Align.CENTER) self.list_row = Adw.ActionRow.new() - self.list_row.set_title(title=_["list"]) + self.list_row.set_title(title=_("List of installed Flatpak apps")) self.list_row.set_use_markup(True) self.list_row.set_title_lines(4) self.list_row.add_suffix(self.switch_05) @@ -229,7 +231,7 @@ def __init__(self): self.appsButton = Gtk.Button.new_from_icon_name("go-next-symbolic") self.data_row = Adw.ActionRow.new() - self.data_row.set_title(title=_["user_data_flatpak"]) + self.data_row.set_title(title=_("User data of installed Flatpak apps")) self.data_row.set_use_markup(True) self.data_row.set_title_lines(4) self.data_row.add_suffix(self.switch_06) @@ -245,11 +247,11 @@ def __init__(self): self.appsButton.add_css_class("flat") self.appsButton.set_valign(Gtk.Align.CENTER) - self.appsButton.set_tooltip_text(_["flatpaks_data_tittle"]) + self.appsButton.set_tooltip_text(_("Flatpak apps data selection")) self.appsButton.connect("clicked", self.manage_data_list) - self.add_response('cancel', _["cancel"]) - self.add_response('ok', _["apply"]) + self.add_response('cancel', _("Cancel")) + self.add_response('ok', _("Apply")) self.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) self.connect('response', self.itemsdialog_closed) @@ -275,9 +277,9 @@ def itemsdialog_closed(self, w, response): # show dialog for managing Flatpak applications data def manage_data_list(self, w): self.close() - self.appd = FlatpakAppsDialog() - self.appd.choose(self, None, None, None) - self.appd.present() + self.appd = FlatpakAppsDialog(self.parent) + self.appd.choose(self.parent, None, None, None) + self.appd.present(self.parent) # show button after clicking on the switch "User data of Flatpak apps" def show_appsbtn(self, w, GParamBoolean): @@ -297,7 +299,7 @@ def show_extensions_row(self): self.switch_ext.set_valign(align=Gtk.Align.CENTER) self.ext_row = Adw.ActionRow.new() - self.ext_row.set_title(title=_["extensions"]) + self.ext_row.set_title(title=_("Extensions")) self.ext_row.set_use_markup(True) self.ext_row.set_title_lines(2) self.ext_row.set_subtitle_lines(3) diff --git a/src/gui/meson.build b/src/gui/meson.build new file mode 100644 index 00000000..7fcd64cd --- /dev/null +++ b/src/gui/meson.build @@ -0,0 +1,9 @@ +gui_sources = [ '__init__.py', + 'window.py', + 'password_checker.py', + 'items_dialog.py', + 'more_options_dialog.py', + 'synchronization_dialogs.py', + ] + +install_data(gui_sources, install_dir: moduledir / 'gui') diff --git a/src/gui/more_options_dialog.py b/src/gui/more_options_dialog.py new file mode 100644 index 00000000..42336e42 --- /dev/null +++ b/src/gui/more_options_dialog.py @@ -0,0 +1,197 @@ +import gi, os +gi.require_version('Gtk', '4.0') +gi.require_version('Adw', '1') +from gi.repository import Gtk, Adw +from savedesktop.globals import * +from savedesktop.core.password_store import PasswordStore + +class MoreOptionsDialog(Adw.AlertDialog): + def __init__(self, parent): + super().__init__() + self.parent = parent + self.set_heading(_("More options")) + + # Box for this dialog + self.msBox = Gtk.ListBox.new() + self.msBox.set_selection_mode(mode=Gtk.SelectionMode.NONE) + self.msBox.add_css_class('boxed-list') + self.set_extra_child(self.msBox) + + # Periodic saving section + # Expander row for showing options of the periodic saving + self.periodic_row = Adw.ExpanderRow.new() + self.periodic_row.set_title(_("Periodic saving")) + self.msBox.append(child=self.periodic_row) + self._expand_periodic_row() + + options = Gtk.StringList.new(strings=[ + _("Never"), _("Daily"), _("Weekly"), _("Monthly") + ]) + + self.pbRow = Adw.ComboRow.new() + self.pbRow.set_title(_("Interval")) + self.pbRow.set_use_markup(True) + self.pbRow.set_subtitle(_("Changes will only take effect after the next login")) + self.pbRow.set_subtitle_lines(4) + self.pbRow.set_model(model=options) + self.periodic_row.add_row(self.pbRow) + + # Load options from GSettings database + if settings["periodic-saving"] == 'Never': + self.pbRow.set_selected(0) + elif settings["periodic-saving"] == 'Daily': + self.pbRow.set_selected(1) + elif settings["periodic-saving"] == 'Weekly': + self.pbRow.set_selected(2) + elif settings["periodic-saving"] == 'Monthly': + self.pbRow.set_selected(3) + + # Restore filename format text to default + self.filefrmtButton = Gtk.Button.new_from_icon_name("view-refresh-symbolic") + self.filefrmtButton.add_css_class('destructive-action') + self.filefrmtButton.set_valign(Gtk.Align.CENTER) + self.filefrmtButton.set_tooltip_text(_("Reset to default")) + self.filefrmtButton.connect("clicked", self.reset_fileformat) + + # Entry for selecting file name format + self.filefrmtEntry = Adw.EntryRow.new() + self.filefrmtEntry.set_title(_("File name format")) + self.filefrmtEntry.add_suffix(self.filefrmtButton) + self.filefrmtEntry.set_text(settings["filename-format"]) + self.periodic_row.add_row(self.filefrmtEntry) + + # Button for choosing folder for periodic saving + self.folderButton = Gtk.Button.new_from_icon_name("document-open-symbolic") + self.folderButton.set_valign(Gtk.Align.CENTER) + self.folderButton.set_tooltip_text(_("Choose another folder")) + self.folderButton.connect("clicked", self.open_file_dialog) + + # Adw.ActionRow for showing folder for periodic saving + self.dirRow = Adw.ActionRow.new() + self.dirRow.set_title(_("Folder for periodic saving")) + self.dirRow.add_suffix(self.folderButton) + self.dirRow.set_use_markup(True) + self.dirRow.set_subtitle(settings["periodic-saving-folder"].format(download_dir)) + self.periodic_row.add_row(self.dirRow) + + # Adw.ActionRow for entering a password for the archive encryption + self.get_password_from_file() + + self.cpwdRow = Adw.PasswordEntryRow.new() + self.cpwdRow.set_title(_("Password for encryption")) + try: + self.cpwdRow.set_text(self.password) + except: + self.cpwdRow.set_text("") + self.periodic_row.add_row(self.cpwdRow) + + # Manual saving section + self.manRow = Adw.ExpanderRow.new() + self.manRow.set_title(_("Manual saving")) + self.manRow.set_expanded(True) + self.msBox.append(self.manRow) + + # action row and switch for showing options of the archive encryption + self.encryptSwitch = Gtk.Switch.new() + self.archSwitch = Gtk.Switch.new() + self.encryptSwitch.set_valign(Gtk.Align.CENTER) + self.encryptSwitch.connect('notify::active', self.set_encryptswitch_sensitivity) + if settings["enable-encryption"] == True: + self.encryptSwitch.set_active(True) + self.archSwitch.set_sensitive(False) + + self.encryptRow = Adw.ActionRow.new() + self.encryptRow.set_title(_("Archive encryption")) + self.encryptRow.set_subtitle(f'{_("When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.")}') + self.encryptRow.set_subtitle_lines(15) + self.encryptRow.add_suffix(self.encryptSwitch) + self.encryptRow.set_activatable_widget(self.encryptSwitch) + self.manRow.add_row(self.encryptRow) + + # action row and switch for showing the "Save a configuration without creating the archive" option + self.archSwitch.set_valign(Gtk.Align.CENTER) + self.archSwitch.connect('notify::active', self.set_archswitch_sensitivity) + if settings["save-without-archive"] == True: + self.archSwitch.set_active(True) + self.encryptSwitch.set_sensitive(False) + + self.archRow = Adw.ActionRow.new() + self.archRow.set_title(_("Save the configuration without creating an archive")) + self.archRow.add_suffix(self.archSwitch) + self.archRow.set_activatable_widget(self.archSwitch) + self.manRow.add_row(self.archRow) + + # add response of this dialog + self.add_response('cancel', _("Cancel")) + self.add_response('ok', _("Apply")) + self.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) + self.connect('response', self.msDialog_closed) + + def _expand_periodic_row(self): + if os.path.exists(f"{CACHE}/expand_pb_row"): + self.periodic_row.set_expanded(True) + + def get_password_from_file(self): + if os.path.exists(f"{DATA}/password"): + p = PasswordStore() + self.password = p.password + else: + self.password = "" + + def open_file_dialog(self, w): + self.parent.select_pb_folder(w="") + + # reset the file name format entry to the default value + def reset_fileformat(self, w): + self.filefrmtEntry.set_text("Latest_configuration") + + # set sensitivity of the encryptSwitch + def set_encryptswitch_sensitivity(self, GParamBoolean, encryptSwitch): + if self.encryptSwitch.get_active(): + self.archSwitch.set_sensitive(False) + else: + self.archSwitch.set_sensitive(True) + + # set sensitivity of the archSwitch + def set_archswitch_sensitivity(self, GParamBoolean, archSwitch): + if self.archSwitch.get_active(): + self.encryptSwitch.set_sensitive(False) + else: + self.encryptSwitch.set_sensitive(True) + + # Action after closing dialog for showing more options + def msDialog_closed(self, w, response): + if response == 'ok': + settings["filename-format"] = self.filefrmtEntry.get_text() # save the file name format entry + settings["periodic-saving-folder"] = self.dirRow.get_subtitle() # save the selected periodic saving folder + settings["enable-encryption"] = self.encryptSwitch.get_active() # save the archive encryption's switch state + settings["save-without-archive"] = self.archSwitch.get_active() # save the switch state of the "Save a configuration without creating the configuration archive" option + self._save_periodic_saving_values() + self._save_password() + + def _save_periodic_saving_values(self): + # save the periodic saving interval + self.selected_item = self.pbRow.get_selected_item() + self.backup_mapping = {_("Never"): "Never", _("Daily"): "Daily", _("Weekly"): "Weekly", _("Monthly"): "Monthly"} + self.backup_item = self.backup_mapping.get(self.selected_item.get_string(), "Never") + settings["periodic-saving"] = self.backup_item + if not self.backup_item == "Never": + self.__create_pb_desktop() + + # create desktop file for enabling periodic saving at startup + def __create_pb_desktop(self): + os.makedirs(f'{home}/.config/autostart', exist_ok=True) + if not os.path.exists(f"{DATA}/savedesktop-synchronization.sh"): + with open(f'{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Backup.desktop', 'w') as cb: + cb.write(f'[Desktop Entry]\nName=SaveDesktop (Periodic backups)\nType=Application\nExec={periodic_saving_cmd}') + + # save the entered password to the file + def _save_password(self): + if self.cpwdRow.get_text(): + password = self.cpwdRow.get_text() + PasswordStore(password) + else: + try: + os.remove(f"{DATA}/password") + except: + pass diff --git a/src/password_check_gui.py b/src/gui/password_checker.py similarity index 81% rename from src/password_check_gui.py rename to src/gui/password_checker.py index 56a7779d..4a03e095 100644 --- a/src/password_check_gui.py +++ b/src/gui/password_checker.py @@ -2,13 +2,15 @@ gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, Gio -from localization import * -from password_store import * +from savedesktop.globals import * +from savedesktop.core.password_store import * class PasswordWindow(Gtk.ApplicationWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.set_title(f"{_['sync']} | Save Desktop") + + sync = _("Sync") + self.set_title(f"{sync} | Save Desktop") # Header bar self.headerbar = Gtk.HeaderBar.new() @@ -31,16 +33,16 @@ def __init__(self, *args, **kwargs): # Label self.titleRow = Adw.ActionRow.new() - self.titleRow.set_title(_["enter_password_title"]) + self.titleRow.set_title(_("Please enter a password to unlock the archive for sync the configuration")) self.titleRow.set_title_lines(3) - self.titleRow.set_subtitle(_["enter_password_desc"]) + self.titleRow.set_subtitle(_("An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization.")) self.titleRow.set_size_request(10, -1) self.titleRow.set_subtitle_lines(10) self.winBox.append(self.titleRow) # Password Entry self.passEntry = Adw.PasswordEntryRow.new() - self.passEntry.set_title(_["password_entry"]) + self.passEntry.set_title(_("Password")) self.winBox.append(self.passEntry) # Switch and row for showing the "Remember a password" option @@ -49,12 +51,12 @@ def __init__(self, *args, **kwargs): self.remSwitch.set_active(True) self.remRow = Adw.ActionRow.new() - self.remRow.set_title(_["remember_password"]) + self.remRow.set_title(_("Remember Password")) self.remRow.add_suffix(self.remSwitch) self.remRow.set_activatable_widget(self.remSwitch) self.winBox.append(self.remRow) - self.applyButton = Gtk.Button.new_with_label(_["apply"]) + self.applyButton = Gtk.Button.new_with_label(_("Apply")) self.applyButton.add_css_class('suggested-action') self.applyButton.add_css_class('pill') self.applyButton.set_halign(Gtk.Align.CENTER) diff --git a/src/gui/synchronization_dialogs.py b/src/gui/synchronization_dialogs.py new file mode 100644 index 00000000..ef32b814 --- /dev/null +++ b/src/gui/synchronization_dialogs.py @@ -0,0 +1,484 @@ +import gi, sys, subprocess, os, locale +gi.require_version('Gtk', '4.0') +gi.require_version('Adw', '1') +from threading import Thread +from gi.repository import Gtk, Gdk, Adw, GLib +from savedesktop.globals import * + +class InitSetupDialog(Adw.AlertDialog): + def __init__(self, parent): + super().__init__() + self.parent = parent + self.cloud_dialog = CloudDialog(parent) + + # set the self.get_button_type variable before starting the dialog + self.get_button_type = self.parent.get_btn_type + + # Dialog itself + self.set_heading(_("Initial synchronization setup")) + self.set_body_use_markup(True) + self.set_can_close(False) + self.add_response('cancel', _("Cancel")) + #self.add_response('ok-syncthing', _("Use Syncthing folder instead")) + self.set_response_appearance('cancel', Adw.ResponseAppearance.DESTRUCTIVE) + self.connect('response', self.initsetupDialog_closed) + + # create a ListBox for the rows below + self.initBox = Gtk.ListBox.new() + self.initBox.set_selection_mode(Gtk.SelectionMode.NONE) + self.initBox.add_css_class("boxed-list") + self.initBox.set_vexpand(True) + self.set_extra_child(self.initBox) + + # if the user has GNOME, Cinnamon, COSMIC (Old) or Budgie environment, it shows text about setting up GNOME Online Accounts. + # otherwise, it shows the text about setting up Rclone + if self.parent.environment in ["GNOME", "Cinnamon", "COSMIC (Old)", "Budgie"]: + self.firstRow = Adw.ActionRow.new() + self.firstRow.set_title(_("1. Open the system settings")) + self.initBox.append(self.firstRow) + + self.secondRow = Adw.ActionRow.new() + self.secondRow.set_title(_("2. Go to the Online Accounts section")) + self.secondRow.set_subtitle(_("In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.")) + self.initBox.append(self.secondRow) + + self.thirdRow = Adw.ActionRow.new() + self.thirdRow.set_title(_("3. Click on the Next button and select the created cloud drive folder")) + self.thirdRow.set_subtitle(_("The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.")) + self.initBox.append(self.thirdRow) + + self.add_response('next', _("Next")) + self.set_response_appearance('next', Adw.ResponseAppearance.SUGGESTED) + else: + self.set_body(_("For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.")) + + # create a list with available services, which can be connected via Rclone + services = Gtk.StringList.new(strings=[_("Select"), 'Google Drive', 'Microsoft OneDrive', 'DropBox', 'pCloud']) + + # row for selecting the cloud service + self.servRow = Adw.ComboRow.new() + self.servRow.set_model(services) + self.servRow.connect("notify::selected-item", self.get_service) + self.initBox.append(self.servRow) + + # button for copying the Rclone command to clipboard + self.copyButton = Gtk.Button.new() + self.copyButton.add_css_class('flat') + self.copyButton.set_valign(Gtk.Align.CENTER) + self.copyButton.set_sensitive(False) + + # row for showing the command for setting up the Rclone + self.cmdRow = Adw.ActionRow.new() + self.cmdRow.set_subtitle_selectable(True) + self.cmdRow.set_use_markup(True) + self.cmdRow.add_suffix(self.copyButton) + self.initBox.append(self.cmdRow) + + # add the Apply and Syncthing buttons to the dialog + self.add_response('ok-syncthing', _("Use Syncthing folder instead")) + self.add_response('ok-rclone', _("Apply")) + self.set_response_appearance('ok-rclone', Adw.ResponseAppearance.SUGGESTED) + self.set_response_enabled('ok-rclone', False) + + # Set the Rclone setup command + def get_service(self, comborow, GParamObject): + self.set_body("") + get_servrow = self.servRow.get_selected_item().get_string() + self.cloud_service = "drive" if get_servrow == "Google Drive" else "onedrive" if get_servrow == "Microsoft OneDrive" else "dropbox" if get_servrow == "DropBox" else "pcloud" + + self.cmdRow.set_title(_("Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.")) + self.cmdRow.set_subtitle(f"command -v rclone &> /dev/null && (rclone config create savedesktop {self.cloud_service} && rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive) || echo 'Rclone is not installed. Please install it from this website first: https://rclone.org/install/.'") + + # set the copyButton properties + self.copyButton.set_sensitive(True) + self.copyButton.set_icon_name("edit-copy-symbolic") + self.copyButton.set_tooltip_text(_("Copy")) + self.copyButton.connect("clicked", self.copy_rclone_command) + + # copy the command for setting up the Rclone using Gdk.Clipboard() + def copy_rclone_command(self, w): + os.makedirs(f"{download_dir}/SaveDesktop/rclone_drive", exist_ok=True) # create the requested folder before copying the command for setting up Rclone to the clipboard + + clipboard = Gdk.Display.get_default().get_clipboard() + Gdk.Clipboard.set(clipboard, f"command -v rclone &> /dev/null && (rclone config create savedesktop {self.cloud_service} && rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive) || echo 'Rclone is not installed. Please install it from this website first: https://rclone.org/install/.'") # copy the command for setting up Rclone to the clipboard + + self.copyButton.set_icon_name("done") + self.cmdRow.set_title(_("Once you have finished setting up Rclone using the command provided, click the \"Apply\" button")) + self.cmdRow.set_subtitle("") + + self.set_response_enabled('ok-rclone', True) + self.remove_response('ok-syncthing') + + # show the message about finished setup the synchronization + def almost_done(self): + self.remove_response('ok-rclone') + self.remove_response('next') + self.remove_response('ok-syncthing') + + self.set_extra_child(None) + self.set_heading(_("Almost done!")) + self.set_body(_("You've now created the cloud drive folder! Click on the Next button to complete the setup.")) + self.set_can_close(True) + + self.add_response('open-setdialog', _("Next")) if self.get_button_type == 'set-button' else self.add_response('open-clouddialog', _("Next")) + self.set_response_appearance('open-setdialog', Adw.ResponseAppearance.SUGGESTED) if self.get_button_type == 'set-button' else self.set_response_appearance('open-clouddialog', Adw.ResponseAppearance.SUGGESTED) + + # Responses of this dialog + def initsetupDialog_closed(self, w, response): + if response == 'next' or response == 'ok-syncthing': # open the Gtk.FileDialog in the GNOME Online accounts case + self.parent.select_pb_folder(w) if self.get_button_type == 'set-button' else self.cloud_dialog.select_folder_to_sync(w) + self.almost_done() + elif response == 'ok-rclone': # set the periodic saving folder in the Rclone case + if self.get_button_type == 'set-button': + settings["periodic-saving-folder"] = f"{download_dir}/SaveDesktop/rclone_drive" + else: + settings["file-for-syncing"] = f"{download_dir}/SaveDesktop/rclone_drive" + self.almost_done() + elif response == 'cancel': # if the user clicks on the Cancel button + self.set_can_close(True) + elif response == 'open-setdialog': # open the "Set up the sync file" dialog after clicking on the Next button in "Almost done!" page + self.auto_save_start = True + settings["periodic-saving"] = "Daily" + self.restart_app_win = True + self.parent._open_SetDialog(w) + elif response == 'open-clouddialog': # open the "Connect to the cloud folder" dialog after clicking on the Next button in "Almost done!" page + settings["first-synchronization-setup"] = False + self.restart_app_win = True + self.parent._open_CloudDialog(w) + +class SetDialog(Adw.AlertDialog): + def __init__(self, parent): + super().__init__() + self.parent = parent + self.app_wiki = "https://vikdevelop.github.io/SaveDesktop/wiki" + + # Dialog itself + self.set_heading(_("Set up the sync file")) + self.set_body(_("Please wait …")) + self.set_body_use_markup(True) + self.add_response('cancel', _("Cancel")) + self.add_response('ok', _("Apply")) + self.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) + self.connect('response', self.setDialog_closed) + + # List Box for appending widgets + self.l_setdBox = Gtk.ListBox.new() + self.l_setdBox.set_selection_mode(Gtk.SelectionMode.NONE) + self.l_setdBox.get_style_context().add_class('boxed-list') + self.l_setdBox.set_size_request(-1, 160) + self.set_extra_child(self.l_setdBox) + + # Check the synchronization matters + check_thread = Thread(target=self.check_filesystem_fnc) + check_thread.start() + + # Button for opening More options dialog + self._create_file_to_expand_row() + self.ps_button = Gtk.Button.new_with_label(_("Change")) + self.ps_button.connect('clicked', self.parent._open_more_options_dialog) + self.ps_button.set_valign(Gtk.Align.CENTER) + + # Row for showing the selected periodic saving interval + ## translate the periodic-saving key to the user language + pb = next((key for key, value in {_("Never"): "Never", _("Daily"): "Daily", _("Weekly"): "Weekly", _("Monthly"): "Monthly"}.items() if settings["periodic-saving"] == value), None) + self.ps_row = Adw.ActionRow.new() + self.ps_row.set_title(f'{_("Periodic saving")} ({_("Interval")})') + self.ps_row.set_use_markup(True) + self.ps_row.add_suffix(self.ps_button) + self.ps_row.set_subtitle(f'{_("Never")}' if settings["periodic-saving"] == "Never" + else f'{pb}') + self.ps_button.add_css_class('suggested-action') if settings["periodic-saving"] == "Never" else None + + # Create this file to set expanding the "Periodic saving" row in the More options dialog + def _create_file_to_expand_row(self): + open(f"{CACHE}/expand_pb_row", "w").close() + + # make the periodic saving file if it does not exist + def make_pb_file(self, w): + self.setupButton.set_sensitive(False) + pb_thread = Thread(target=self.save_now) + pb_thread.start() + + def save_now(self): + try: + e_o = False + self.file_row.set_subtitle(_("Please wait …")) + self.file_row.set_use_markup(False) + subprocess.run(['notify-send', 'Save Desktop', _("Please wait …")]) + subprocess.run([sys.executable, "-m", "savedesktop.core.periodic_saving", "--now"], check=True, capture_output=True, text=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + except Exception as e: + e_o = True + subprocess.run(['notify-send', _("An error occurred"), f'{e.stderr}']) + self.file_row.set_subtitle(f'{e.stderr}') + finally: + if not e_o: + self.file_row.remove(self.setupButton) + self.file_row.set_subtitle(f'{settings["periodic-saving-folder"]}/{settings["filename-format"]}.sd.zip') + os.system(f"notify-send 'SaveDesktop' '{_('Configuration has been saved!')}'") + self.set_response_enabled('ok', True) + + # Refer to the article about synchronization + def open_sync_link(self, w): + language = locale.getlocale()[0].split("_")[0] + os.system(f"xdg-open {self.app_wiki}/synchronization/{language}") + + def update_gui(self): + global folder, path, check_filesystem + self.file_row = Adw.ActionRow() + self.file_row.set_title(_("Periodic saving file")) + self.file_row.set_subtitle(folder) + self.file_row.add_suffix(Gtk.Image.new_from_icon_name("network-wired-symbolic")) if "red" not in folder else None + self.file_row.set_subtitle_lines(8) + self.file_row.set_use_markup(True) + self.file_row.set_subtitle_selectable(True) + self.l_setdBox.append(self.file_row) + self.l_setdBox.append(self.ps_row) + + set_button_sensitive = settings["periodic-saving"] != "Never" and not os.path.exists(path) + if "red" in folder: + self.set_response_enabled('ok', False) + [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", f"{DATA}/savedesktop-synchronization.sh"] if os.path.exists(path)] # remove these files if the periodic saving folder is not a cloud drive folder + if _("Periodic saving file does not exist.") in folder: + self.setupButton = Gtk.Button.new_with_label(_("Create")) + self.setupButton.set_valign(Gtk.Align.CENTER) + self.setupButton.add_css_class("suggested-action") + self.setupButton.connect("clicked", self.make_pb_file) + self.file_row.add_suffix(self.setupButton) + + if _("You didn't select the cloud drive folder!") in folder: + self.lmButton = Gtk.Button.new_with_label(_("Learn more")) + self.lmButton.set_valign(Gtk.Align.CENTER) + self.lmButton.add_css_class("suggested-action") + self.lmButton.connect("clicked", self.open_sync_link) + self.file_row.add_suffix(self.lmButton) + self.set_body("") # set the body as empty after loading the periodic saving information + + # Check the file system of the periodic saving folder and their existation + def check_filesystem_fnc(self): + global folder, path, check_filesystem + check_filesystem = subprocess.getoutput('df -T "%s" | awk \'NR==2 {print $2}\'' % settings["periodic-saving-folder"]) + + path = f'{settings["periodic-saving-folder"]}/{settings["filename-format"].replace(" ", "_")}.sd.zip' + + # Check if periodic saving is set to "Never" + if settings["periodic-saving"] == "Never": + folder = f'{_("Interval")}: {_("Never")}' + # Check if the filesystem is not FUSE + elif ("gvfsd" not in check_filesystem and "rclone" not in check_filesystem) and not os.path.exists(f"{settings['periodic-saving-folder']}/.stfolder"): + err = _("You didn't select the cloud drive folder!") + folder = f'{err}' + # Check if the periodic saving file exists + elif not os.path.exists(path): + folder = f'{_("Periodic saving file does not exist.")}' + else: + folder = path + + self.update_gui() + + # save the SaveDesktop.json file to the periodic saving folder and set up the auto-mounting the cloud drive + def save_file(self): + try: + self.mount_type = "periodic-saving" + open(f"{settings['periodic-saving-folder']}/SaveDesktop.json", "w").write('{\n "periodic-saving-interval": "%s",\n "filename": "%s"\n}' % (settings["periodic-saving"], settings["filename-format"])) + subprocess.run([sys.executable, "-m", "savedesktop.core.synchronization_setup", "--automount-setup", self.mount_type], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + except Exception as e: + os.system(f"notify-send \'{_('An error occurred')}\' '{e}'") + finally: + pass + + # Action after closing dialog for setting synchronization file + def setDialog_closed(self, w, response): + if response == 'ok': + thread = Thread(target=self.save_file) + thread.start() + else: + pass + +class CloudDialog(Adw.AlertDialog): + def __init__(self, parent): + super().__init__() + self.parent = parent + + self.set_heading(_("Connect to the cloud storage")) + self.set_body(_("On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.")) + self.add_response('cancel', _("Cancel")) + self.add_response('ok', _("Apply")) + self.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) + self.connect('response', self.cloudDialog_closed) + + # Box for adding widgets in this dialog + self.cloudBox = Gtk.ListBox.new() + self.cloudBox.set_selection_mode(mode=Gtk.SelectionMode.NONE) + self.cloudBox.get_style_context().add_class(class_name='boxed-list') + self.cloudBox.set_size_request(-1, 400) + self.set_extra_child(self.cloudBox) + + # Row and buttons for selecting the cloud drive folder + ## button for selecting the cloud drive folder + self.cloudButton = Gtk.Button.new_from_icon_name("document-open-symbolic") + self.cloudButton.add_css_class('flat') + self.cloudButton.set_valign(Gtk.Align.CENTER) + self.cloudButton.set_tooltip_text(_("Choose another folder")) + self.cloudButton.connect("clicked", self.select_folder_to_sync) + + ## button for reseting the selected cloud drive folder + self.resetButton = Gtk.Button.new_from_icon_name("view-refresh-symbolic") + self.resetButton.add_css_class('destructive-action') + self.resetButton.connect("clicked", self.reset_cloud_folder) + self.resetButton.set_tooltip_text(_("Reset to default")) + self.resetButton.set_valign(Gtk.Align.CENTER) + + ## the row itself + self.cfileRow = Adw.ActionRow.new() + self.cfileRow.add_suffix(self.resetButton) if not settings["file-for-syncing"] == "" else None + self.cfileRow.set_title(_("Select the cloud drive folder")) + self.cfileRow.set_subtitle(settings["file-for-syncing"]) + self.cfileRow.set_subtitle_selectable(True) + self.cfileRow.add_suffix(self.cloudButton) + self.cfileRow.set_activatable_widget(self.cloudButton) + self.cloudBox.append(self.cfileRow) + + if not self.cfileRow.get_subtitle(): + self.set_response_enabled('ok', False) + else: + self.set_response_enabled('ok', True) + + # Periodic sync section + options = Gtk.StringList.new(strings=[ + _("Never"), _("Manually"), _("Daily"), _("Weekly"), _("Monthly") + ]) + + self.psyncRow = Adw.ComboRow.new() + self.psyncRow.set_use_markup(True) + self.psyncRow.set_use_underline(True) + self.psyncRow.set_title(_("Periodic synchronization")) + self.psyncRow.set_title_lines(2) + self.psyncRow.set_model(model=options) + self.psyncRow.connect('notify::selected-item', self.on_psync_changed) + self.cloudBox.append(self.psyncRow) + + # Load periodic sync values form GSettings database + old_psync = settings["periodic-import"] + if settings["periodic-import"] == "Never2": + self.psyncRow.set_selected(0) + elif settings["periodic-import"] == "Manually2": + self.psyncRow.set_selected(1) + elif settings["periodic-import"] == "Daily2": + self.psyncRow.set_selected(2) + elif settings["periodic-import"] == "Weekly2": + self.psyncRow.set_selected(3) + elif settings["periodic-import"] == "Monthly2": + self.psyncRow.set_selected(4) + + # Bidirectional Synchronization section + ## Switch + self.bsSwitch = Gtk.Switch.new() + if settings["bidirectional-sync"] == True: + self.bsSwitch.set_active(True) + self.bsSwitch.set_valign(Gtk.Align.CENTER) + + ## Action Row + self.bsyncRow = Adw.ActionRow.new() + self.bsyncRow.set_title(_("Bidirectional synchronization")) + self.bsyncRow.set_subtitle(_("If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.")) + self.bsyncRow.set_title_lines(2) + self.bsyncRow.add_suffix(self.bsSwitch) + self.bsyncRow.set_activatable_widget(self.bsSwitch) + self.cloudBox.append(self.bsyncRow) + + # Select folder for syncing the configuration with other computers in the network + def select_folder_to_sync(self, w): + def set_selected(source, res, data): + try: + folder = source.select_folder_finish(res) + except: + return + self.sync_folder = folder.get_path() + settings["file-for-syncing"] = self.sync_folder if settings["first-synchronization-setup"] else settings["file-for-syncing"] + self.cfileRow.set_subtitle(self.sync_folder) if hasattr(self, 'cfileRow') else None + if hasattr(self, 'cloudDialog'): + self.cloudDialog.set_response_enabled('ok', True) if not self.psyncRow.get_selected_item().get_string() == _("Never") else None + + self.sync_folder_chooser = Gtk.FileDialog.new() + self.sync_folder_chooser.set_modal(True) + self.sync_folder_chooser.set_title(_("Select the cloud drive folder")) + self.sync_folder_chooser.select_folder(self.parent, None, set_selected, None) + + def reset_cloud_folder(self, w): + self.cfileRow.set_subtitle("") + self.cfileRow.remove(self.resetButton) + self.set_response_enabled('ok', True) + settings["file-for-syncing"] = self.cfileRow.get_subtitle() + [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", f"{DATA}/savedesktop-synchronization.sh"] if os.path.exists(path)] + + # enable or disable the response of this dialog in depending on the selected periodic synchronization interval + def on_psync_changed(self, psyncRow, GParamObject): + if not self.psyncRow.get_selected_item().get_string() == _("Never") and not self.cfileRow.get_subtitle(): + self.set_response_enabled('ok', True) + + def call_automount(self): + try: + if self.cfileRow.get_subtitle(): + self.mount_type = "cloud-receiver" + settings["file-for-syncing"] = self.cfileRow.get_subtitle() + result = subprocess.run([sys.executable, "-m", "savedesktop.core.synchronization_setup", "--checkfs"], + capture_output=True, text=True, + env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + + if result.returncode == 0: + output = result.stdout.strip() + if "You didn't selected the cloud drive folder!" in output: + settings["file-for-syncing"] = "" + if os.path.exists(f"{DATA}/savedesktop-synchronization.sh"): + os.remove(f"{DATA}/savedesktop-synchronization.sh") + raise AttributeError(_("You didn't select the cloud drive folder!")) + else: + subprocess.run([sys.executable, "-m", "savedesktop.core.synchronization_setup", + "--automount-setup", self.mount_type], + env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + else: + raise AttributeError(_("You didn't select the cloud drive folder!")) + except Exception as e: + os.system(f'notify-send \'{_("An error occurred")}\' \'{e}\'') + return + else: + GLib.idle_add(self.__post_setup) + + # check if the selected periodic sync interval was Never: if yes, shows the message about the necessity to log out of the system + def __post_setup(self): + if self.check_psync == "Never2": + if not settings["periodic-import"] == "Never2": + self.parent.show_warn_toast() + + # if it is selected to manually sync, it creates an option in the app menu in the header bar + if settings["manually-sync"]: + self.sync_menu = Gio.Menu() + self.sync_menu.append(_("Sync"), 'app.m-sync-with-key') + self.main_menu.prepend_section(None, self.sync_menu) + self.parent.show_special_toast() + else: + try: + self.sync_menu.remove_all() + except: + pass + + # Action after closing URL dialog + def cloudDialog_closed(self, w, response): + if response == 'ok': + self.check_psync = settings["periodic-import"] + # translate the periodic sync options to English + selected_item = self.psyncRow.get_selected_item() + sync = {_("Never"): "Never2", _("Manually"): "Manually2", _("Daily"): "Daily2", _("Weekly"): "Weekly2", _("Monthly"): "Monthly2"} + + sync_item = sync.get(selected_item.get_string(), "Never2") + + settings["periodic-import"] = sync_item + + # if the selected periodic saving interval is "Manually2", it enables the manually-sync value + settings["manually-sync"] = True and settings["periodic-import"] == "Manually2" + + # save the status of the Bidirectional Synchronization switch + settings["bidirectional-sync"] = self.bsSwitch.get_active() + + check_thread = Thread(target=self.call_automount) + check_thread.start() diff --git a/src/gui/templates/shortcuts_window.ui b/src/gui/templates/shortcuts_window.ui new file mode 100644 index 00000000..3af5df78 --- /dev/null +++ b/src/gui/templates/shortcuts_window.ui @@ -0,0 +1,88 @@ + + + + + diff --git a/src/gui/window.py b/src/gui/window.py new file mode 100644 index 00000000..d8575d9a --- /dev/null +++ b/src/gui/window.py @@ -0,0 +1,743 @@ +#!/usr/bin/python3 +import os, sys, re, zipfile, random, string, gi, subprocess, locale +gi.require_version('Gtk', '4.0') +gi.require_version('Adw', '1') +from gi.repository import Gtk, Adw, Gio, GLib, Gdk +from datetime import date +from pathlib import Path +from threading import Thread +from savedesktop.globals import * +from savedesktop.gui.items_dialog import FolderSwitchRow, FlatpakAppsDialog, itemsDialog +from savedesktop.gui.more_options_dialog import MoreOptionsDialog +from savedesktop.gui.synchronization_dialogs import InitSetupDialog, SetDialog, CloudDialog + +# Application window +class MainWindow(Adw.ApplicationWindow): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.set_title("Save Desktop") + self.app_wiki = "https://vikdevelop.github.io/SaveDesktop/wiki" + + # header bar and toolbarview + self.headerbar = Adw.HeaderBar.new() + self.toolbarview = Adw.ToolbarView.new() + self.toolbarview.add_top_bar(self.headerbar) + + # set the window size and maximization from the GSettings database + (width, height) = settings["window-size"] + self.set_default_size(width, height) + self.set_size_request(360, 500) + + # if the value is TRUE, it enables window maximalization + if settings["maximized"]: + self.maximize() + + # primary menu + self.main_menu = Gio.Menu() + + # primary menu section + self.general_menu = Gio.Menu() + self.general_menu.append(_("Keyboard shortcuts"), 'app.shortcuts') + self.general_menu.append(_("About app"), 'app.about') + self.main_menu.append_section(None, self.general_menu) + + # menu button + self.menu_button = Gtk.MenuButton.new() + self.menu_button.set_icon_name(icon_name='open-menu-symbolic') + self.menu_button.set_menu_model(menu_model=self.main_menu) + self.menu_button.set_primary(True) + self.headerbar.pack_end(child=self.menu_button) + + # add Manually sync section + if settings["manually-sync"] == True: + self.sync_menu = Gio.Menu() + self.sync_menu.append(_("Synchronise manually"), 'app.m-sync-with-key') + self.main_menu.prepend_section(None, self.sync_menu) + + # primary layout + self.headapp = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.headapp.set_valign(Gtk.Align.CENTER) + self.headapp.set_halign(Gtk.Align.CENTER) + self.toolbarview.set_content(self.headapp) + + # A view container for the menu switcher + self.stack = Adw.ViewStack(vexpand=True) + self.stack.set_hhomogeneous(True) + self.headapp.append(self.stack) + + # Layout for saving and importing configuration + self.saveBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15) + self.importBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.syncingBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + + # Add pages to the menu switcher + self.stack.add_titled_with_icon(self.saveBox,"savepage",_("Save"),"document-save-symbolic") + self.stack.add_titled_with_icon(self.importBox,"importpage",_("Import"),"document-open-symbolic") + self.stack.add_titled_with_icon(self.syncingBox,"syncpage",_("Sync"),"view-refresh-symbolic") if not snap else None + + # menu switcher + self.switcher_title = Adw.ViewSwitcherTitle.new() + self.switcher_title.set_stack(self.stack) + self.switcher_title.set_title("Save Desktop") + self.headerbar.set_title_widget(self.switcher_title) + + # menu bar + self.switcher_bar = Adw.ViewSwitcherBar.new() + self.switcher_bar.set_stack(self.stack) + self.toolbarview.add_bottom_bar(self.switcher_bar) + + self._setup_switcher_responsive() + + # Toast Overlay for showing the popup window + self.toast_overlay = Adw.ToastOverlay.new() + self.toast_overlay.set_child(self.toolbarview) + self.set_content(self.toast_overlay) + + # Popup window for showing messages about necessity to log out of the system after selected the periodic synchronization interval + self.toast = Adw.Toast.new(title='') + self.toast.set_timeout(0) + + self._env_detection() + + # If the user has a supported environment, it shows the app window, otherwise, it shows the window with information about an unsupported environment + def _env_detection(self): + def setup_environment(env_name): + self.environment = env_name + self.save_desktop() + self.import_desktop() + self.sync_desktop() if not snap else print("Synchronization in the Snap environment is temporarily disabled.") + self.connect("close-request", self.on_close) + + # Check the user's current desktop + desktop_env = os.getenv('XDG_CURRENT_DESKTOP') + desktop_map = { + 'GNOME': 'GNOME', + 'zorin:GNOME': 'GNOME', + 'ubuntu:GNOME': 'GNOME', + 'pop:GNOME': 'COSMIC (Old)', + 'COSMIC': 'COSMIC (New)', + 'Pantheon': 'Pantheon', + 'X-Cinnamon': 'Cinnamon', + 'Budgie:GNOME': 'Budgie', + 'XFCE': 'Xfce', + 'MATE': 'MATE', + 'KDE': 'KDE Plasma', + 'Deepin': 'Deepin', + 'Hyprland': 'Hyprland'} + + if desktop_env in desktop_map: + setup_environment(desktop_map[desktop_env]) + else: + # Handle unsupported desktop environments + self.headerbar.set_title_widget(None) + self.toolbarview.remove(self.switcher_bar) + self.pBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.pBox.set_halign(Gtk.Align.CENTER) + self.pBox.set_valign(Gtk.Align.CENTER) + self.pBox.set_margin_start(50) + self.pBox.set_margin_end(50) + self.toolbarview.set_content(self.pBox) + self.unsupp_label = Gtk.Label.new(str=f'{_("You have an unsupported environment installed.\nPlease use one of these environments: {}.")}'.format(', '.join(set(desktop_map.values())))); self.unsupp_label.set_use_markup(True); self.unsupp_label.set_justify(Gtk.Justification.CENTER); self.unsupp_label.set_wrap(True); self.pBox.append(self.unsupp_label) + + # Switch between ViewSwitcherTitle and ViewSwitcherBar based on the Adw.Breakpoint status + def _setup_switcher_responsive(self): + self.break_point = Adw.Breakpoint.new( + Adw.BreakpointCondition.parse("max-width: 400sp") + ) + + # When activating a narrow breakpoint, display the switcher_bar + self.apply_handler = self.break_point.connect("apply", self.__on_break_point_apply) + + # Hide switcher_bar when narrow breakpoint is deactivated + self.unapply_handler = self.break_point.connect("unapply", self.__on_break_point_unapply) + + # Add a breakpoint to the window + self.add_breakpoint(self.break_point) + + # Default state - hidden (only displayed when the breakpoint is met) + self.switcher_bar.set_reveal(False) + + def __on_break_point_apply(self, break_point): + self.switcher_bar.set_reveal(True) + + def __on_break_point_unapply(self, break_point): + self.switcher_bar.set_reveal(False) + + # Show main page + def save_desktop(self): + # Set valign for the save desktop layout + self.saveBox.set_valign(Gtk.Align.CENTER) + + # Title image for the save page + self.titleImage = Gtk.Image.new_from_icon_name("preferences-desktop-display-symbolic") + self.titleImage.set_pixel_size(64) + self.saveBox.append(self.titleImage) + + # Title "Save Current configuration" for save page and subtitle "{user_desktop}" + self.label_title = Gtk.Label.new() + self.label_title.set_markup('{}\n{}'.format(_("Save the current configuration"), self.environment)) + self.label_title.set_justify(Gtk.Justification.CENTER) + self.saveBox.append(self.label_title) + + # Box for show these options: set the filename, set items that will be included to the config archive and periodic saving + self.lbox_e = Gtk.ListBox.new() + self.lbox_e.set_selection_mode(mode=Gtk.SelectionMode.NONE) + self.lbox_e.add_css_class(css_class='boxed-list-separate') + self.lbox_e.set_margin_start(20) + self.lbox_e.set_margin_end(20) + self.lbox_e.set_halign(Gtk.Align.CENTER) + self.lbox_e.set_valign(Gtk.Align.CENTER) + self.saveBox.append(self.lbox_e) + + # set the filename section + self.saveEntry = Adw.EntryRow.new() + self.saveEntry.set_title(_("Set the file name")) + self.saveEntry.set_text(settings["filename"]) + self.lbox_e.append(self.saveEntry) + + # Button for opening dialog for selecting items that will be included to the config archive + self.itemsButton = Gtk.Button.new_from_icon_name("go-next-symbolic") + self.itemsButton.set_valign(Gtk.Align.CENTER) + self.itemsButton.add_css_class("flat") + self.itemsButton.connect("clicked", self._open_items_dialog) + + # Action row for opening dialog for selecting items that will be included to the config archive + self.items_row = Adw.ActionRow.new() + self.items_row.set_title(title=_("Items to include in the configuration archive")) + self.items_row.set_use_markup(True) + self.items_row.set_title_lines(5) + self.items_row.add_suffix(self.itemsButton) + self.items_row.set_activatable_widget(self.itemsButton) + self.lbox_e.append(child=self.items_row) + + self.lbox_e.set_show_separators(True) + + # section for showing dialog with more options + # button + self.msButton = Gtk.Button.new_from_icon_name("go-next-symbolic") + self.msButton.add_css_class('flat') + self.msButton.set_valign(Gtk.Align.CENTER) + self.msButton.connect("clicked", self._open_more_options_dialog) + + # action row + self.moreSettings = Adw.ActionRow.new() + self.moreSettings.set_title(_("More options")) + self.moreSettings.set_subtitle(f'{_("Periodic saving")}, {_("Manual saving")}') + self.moreSettings.set_subtitle_lines(3) + self.moreSettings.add_suffix(self.msButton) + self.moreSettings.set_activatable_widget(self.msButton) + self.lbox_e.append(self.moreSettings) + + # Save configuration button + self.saveButton = Gtk.Button.new_with_label(_("Save")) + self.saveButton.add_css_class("suggested-action") + self.saveButton.add_css_class("pill") + self.saveButton.connect("clicked", self.select_folder) + self.saveButton.set_valign(Gtk.Align.CENTER) + self.saveButton.set_halign(Gtk.Align.CENTER) + self.saveBox.append(self.saveButton) + + def _open_more_options_dialog(self, w): + self.more_options_dialog = MoreOptionsDialog(self) + self.more_options_dialog.choose(self, None, None, None) + self.more_options_dialog.present(self) + + # open a dialog for selecting the items to include in the configuration archive + def _open_items_dialog(self, w): + self.items_dialog = itemsDialog(self) + self.items_dialog.choose(self, None, None, None) + self.items_dialog.present(self) + + # Import configuration page + def import_desktop(self): + self.importBox.set_valign(Gtk.Align.CENTER) + self.importBox.set_halign(Gtk.Align.CENTER) + + # Box for the below buttons + self.btnBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + + # Import configuration button + self.fileButton = Gtk.Button.new_with_label(_("Import from file")) + self.fileButton.add_css_class("pill") + self.fileButton.add_css_class("suggested-action") + self.fileButton.set_halign(Gtk.Align.CENTER) + self.fileButton.set_valign(Gtk.Align.CENTER) + self.fileButton.connect("clicked", self.select_file_to_import) + self.btnBox.append(self.fileButton) + + # Import configuration from folder button + self.folderButton = Gtk.Button.new_with_label(_("Import from folder")) + self.folderButton.add_css_class("pill") + self.folderButton.set_halign(Gtk.Align.CENTER) + self.folderButton.set_valign(Gtk.Align.CENTER) + self.folderButton.connect("clicked", self.select_folder_to_import) + self.btnBox.append(self.folderButton) + + # Image and title for the Import page + self.importPage = Adw.StatusPage.new() + self.importPage.set_icon_name("document-open-symbolic") + self.importPage.set_title(_("Import")) + self.importPage.set_description(_("Import saved configuration")) + self.importPage.set_size_request(360, -1) + self.importPage.set_child(self.btnBox) + self.importBox.append(self.importPage) + + # Syncing desktop page + def sync_desktop(self): + self._basic_setup() + + # Box, image and title for this page + self.sync_btn_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.syncPage = Adw.StatusPage.new() + self.syncPage.set_icon_name("view-refresh-symbolic") + self.syncPage.set_title(_("Sync")) + self.syncPage.set_description(f'{_("Sync your desktop environment configuration with other computers in the network.")} {_("Learn more")}') + self.syncPage.set_child(self.sync_btn_box) + self.syncingBox.append(self.syncPage) + + # "Set up the sync file" button + self.setButton = Gtk.Button.new_with_label(_("Set up the sync file")) + self.setButton.set_name("set-button") + self.setButton.add_css_class("pill") + self.setButton.add_css_class("suggested-action") + self.setButton.connect("clicked", self._open_SetDialog if not settings["first-synchronization-setup"] else self._open_InitSetupDialog) + self.setButton.set_valign(Gtk.Align.CENTER) + self.setButton.set_halign(Gtk.Align.CENTER) + self.sync_btn_box.append(self.setButton) + + # "Connect with other computer" button + self.getButton = Gtk.Button.new_with_label(_("Connect to the cloud storage")) + self.getButton.set_name("get-button") + self.getButton.add_css_class("pill") + self.getButton.connect("clicked", self._open_CloudDialog if not settings["first-synchronization-setup"] else self._open_InitSetupDialog) + self.getButton.set_valign(Gtk.Align.CENTER) + self.getButton.set_halign(Gtk.Align.CENTER) + self.sync_btn_box.append(self.getButton) + + def _basic_setup(self): + # Set showing the Initial synchronization setup dialog only if the periodic saving folder or cloud drive folder does not use GVFS or Rclone filesystem + settings["first-synchronization-setup"] = True if not os.path.exists(f"{DATA}/savedesktop-synchronization.sh") else False + # Get language to show the wiki page in the correct ones + self.language = locale.getlocale()[0].split("_")[0] + + def _open_InitSetupDialog(self, w): + self.__get_button_type(w) + self.init_setup_dialog = InitSetupDialog(self) + self.init_setup_dialog.choose(self, None, None, None) + self.init_setup_dialog.present(self) + + def __get_button_type(self, w): + try: + self.get_btn_type = w.get_name() + except: + self.get_btn_type = w + + def _open_SetDialog(self, w): + self.set_dialog = SetDialog(self) + self.set_dialog.choose(self, None, None, None) + self.set_dialog.present(self) + + def _open_CloudDialog(self, w): + self.set_dialog = CloudDialog(self) + self.set_dialog.choose(self, None, None, None) + self.set_dialog.present(self) + + # Select folder for periodic saving + def select_pb_folder(self, w): + def save_selected(source, res, data): + try: + folder = source.select_folder_finish(res) + except: + return + self.folder_pb = folder.get_path() + settings["periodic-saving-folder"] = self.folder_pb if settings["first-synchronization-setup"] else settings["periodic-saving-folder"] + self.dirRow.set_subtitle(f"{self.folder_pb}") if hasattr(self, 'dirRow') else None + + self.pb_chooser = Gtk.FileDialog.new() + self.pb_chooser.set_modal(True) + self.pb_chooser.set_title(_("Choose custom folder for periodic saving")) + self.pb_chooser.select_folder(self, None, save_selected, None) + + # Select folder for saving configuration + def select_folder(self, w): + def save_selected(source, res, data): + try: + folder = source.select_folder_finish(res) + except: + return + self.folder = folder.get_path() + if settings["enable-encryption"] == True: + self.create_password_dialog() + else: + self.save_config() + + if self.saveEntry.get_text() == "": + self.filename_text = "config" + else: + if " " in self.saveEntry.get_text(): + self.with_spaces_text = self.saveEntry.get_text() + self.filename_text = self.with_spaces_text.replace(" ", "_") + else: + self.filename_text = f'{self.saveEntry.get_text()}' + + self.folderchooser = Gtk.FileDialog.new() + self.folderchooser.set_modal(True) + self.folderchooser.set_title(_("Save the current configuration")) + self.folderchooser.select_folder(self, None, save_selected, None) + + # Select a ZIP or TAR.GZ file to import + def select_file_to_import(self, w): + # Show a "Please wait" pop-up window while checking the archive type + def show_please_wait_toast(): + wait_toast = Adw.Toast.new(title=_("Please wait …")) + wait_toast.set_timeout(10) + self.toast_overlay.add_toast(wait_toast) + + # Check, if the archive is encrypted or not + def get_status_of_encryption(): + self.is_folder = False + try: + status = any(z.flag_bits & 0x1 for z in zipfile.ZipFile(self.import_file).infolist() if not z.filename.endswith("/")) + except: + status = False + if status == True: + GLib.idle_add(self.check_password_dialog) + else: + self.import_config() + + # Get path from the dialog + def open_selected(source, res, data): + try: + file = source.open_finish(res) + except: + return + self.import_file = file.get_path() + show_please_wait_toast() + check_thread = Thread(target=get_status_of_encryption) + check_thread.start() + + self.file_chooser = Gtk.FileDialog.new() + self.file_chooser.set_modal(True) + self.file_chooser.set_title(_("Import saved configuration")) + self.file_filter = Gtk.FileFilter.new() + self.file_filter.set_name(_("Save Desktop files")) + self.file_filter.add_pattern('*.sd.tar.gz') + self.file_filter.add_pattern('*.sd.zip') + self.file_filter_list = Gio.ListStore.new(Gtk.FileFilter); + self.file_filter_list.append(self.file_filter) + self.file_chooser.set_filters(self.file_filter_list) + self.file_chooser.open(self, None, open_selected, None) + + # Select folder to import configuration + def select_folder_to_import(self, w): + def import_selected(source, res, data): + try: + folder = source.select_folder_finish(res) + except: + return + self.import_folder = folder.get_path() + self.is_folder = True if os.path.exists(f"{self.import_folder}/.folder.sd") else False + self.import_config() + + self.file_chooser = Gtk.FileDialog.new() + self.file_chooser.set_modal(True) + self.file_chooser.set_title(_("Import saved configuration")) + self.file_chooser.select_folder(self, None, import_selected, None) + + # Dialog for creating password for the config archive + def create_password_dialog(self): + # Action after closing pswdDialog + def pswdDialog_closed(w, response): + if response == 'ok': + with open(f"{CACHE}/temp_file", "w") as tmp: + tmp.write(self.pswdEntry.get_text()) + self.save_config() + + # Check the password to see if it meets the criteria + def check_password(pswdEntry): + password = self.pswdEntry.get_text() + criteria = [ + (len(password) < 12, "The password is too short. It should has at least 12 characters"), + (not re.search(r'[A-Z]', password), "The password should has at least one capital letter"), + (not re.search(r'[a-z]', password), "The password should has at least one lowercase letter"), + (not re.search(r'[-_@.:,+=]', password), "The password should has at least one special character"), + (" " in password, "The password must not contain spaces") + ] + + for condition, message in criteria: + if condition: + self.pswdDialog.set_response_enabled("ok", False) + print(message) + return + + self.pswdDialog.set_response_enabled("ok", True) + + # Generate Password + def pswd_generator(w): + safe = "-_@.:,+=" + allc = safe + string.ascii_letters + string.digits + password = [random.choice(safe), random.choice(string.ascii_letters), random.choice(string.digits)] + \ + [random.choice(allc) for _ in range(21)] + random.shuffle(password) + password = ''.join(password) + self.pswdEntry.set_text(password) + + # Dialog itself + self.pswdDialog = Adw.AlertDialog.new() + self.pswdDialog.set_heading(_("Create new password")) + self.pswdDialog.set_body(_("Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.")) + self.pswdDialog.choose(self, None, None, None) + self.pswdDialog.add_response("cancel", _("Cancel")) + self.pswdDialog.add_response("ok", _("Apply")) + self.pswdDialog.set_response_enabled("ok", False) + self.pswdDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) + self.pswdDialog.connect('response', pswdDialog_closed) + self.pswdDialog.present() + + # Button for generating strong password + self.pswdgenButton = Gtk.Button.new_from_icon_name("dialog-password-symbolic") + self.pswdgenButton.set_tooltip_text(_("Generate Password")) + self.pswdgenButton.add_css_class("flat") + self.pswdgenButton.set_valign(Gtk.Align.CENTER) + self.pswdgenButton.connect("clicked", pswd_generator) + + # entry for entering password + self.pswdEntry = Adw.PasswordEntryRow.new() + self.pswdEntry.set_title(_("Password")) + self.pswdEntry.connect('changed', check_password) + self.pswdEntry.add_suffix(self.pswdgenButton) + self.pswdDialog.set_extra_child(self.pswdEntry) + + # dialog for entering password of the archive + def check_password_dialog(self): + # action after closing dialog for checking password + def checkDialog_closed(w, response): + if response == 'ok': + self.checkDialog.set_response_enabled("ok", False) + with open(f"{CACHE}/temp_file", "w") as tmp: + tmp.write(self.checkEntry.get_text()) + + self.import_config() + + # Dialog itself + self.checkDialog = Adw.AlertDialog.new() + self.checkDialog.set_heading(_("Unlock the archive with a password")) + self.checkDialog.set_body(_("Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.")) + self.checkDialog.choose(self, None, None, None) + self.checkDialog.add_response("cancel", _("Cancel")) + self.checkDialog.add_response("ok", _("Apply")) + self.checkDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) + self.checkDialog.connect('response', checkDialog_closed) + self.checkDialog.present() + + self.checkEntry = Adw.PasswordEntryRow.new() + self.checkEntry.set_title(_("Password")) + self.checkDialog.set_extra_child(self.checkEntry) + + # Save configuration + def save_config(self): + self.archive_mode = "--create" + self.archive_name = f"{self.folder}/{self.filename_text}" + self.status_title = _("Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n").split('')[0].split('')[-1] + self.status_desc = self._set_status_desc_save() + self.done_title = _("Configuration has been saved!") + self.done_desc = _("{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n").format(_("Configuration has been saved!")) + + self.please_wait() + save_thread = Thread(target=self._call_archive_command) + save_thread.start() + + def _set_status_desc_save(self): + # Use "sd.zip" if Archive Encryption is enabled + status_old = _("Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n") + status = status_old.replace("sd.tar.gz", "sd.zip") if not settings["save-without-archive"] else status_old.replace("sd.tar.gz", "") + return status.format(self.folder, self.filename_text) + + # Import configuration + def import_config(self): + self._identify_file_type() + + self.archive_mode = "--unpack" + self.status_title = _("Importing configuration …\nImporting configuration from:\n{}\n").split('')[0].split('')[-1] + self.status_desc = _("Importing configuration …\nImporting configuration from:\n{}\n").format(self.archive_name) + self.done_title = _("The configuration has been applied!") + self.done_desc = _("{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n").format(_("The configuration has been applied!")) + + self.please_wait() + import_thread = Thread(target=self._call_archive_command) + import_thread.start() + + def _identify_file_type(self): + try: + self.archive_name = self.import_folder + except: + self.archive_name = self.import_file + + def _call_archive_command(self): + try: + subprocess.run([sys.executable, "-m", "savedesktop.core.archive", self.archive_mode, self.archive_name], check=True, capture_output=True, text=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + except subprocess.CalledProcessError as err: + e = err.stderr + GLib.idle_add(self.show_err_msg, e) + self._set_default_widgets_state() + finally: + GLib.idle_add(self.done) + + # "Please wait" information page + def please_wait(self): + self.headerbar.set_title_widget(None) + self.break_point.disconnect(self.apply_handler) + self.switcher_bar.set_reveal(False) + + # Create box widget for this page + self.status_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.status_box.set_halign(Gtk.Align.CENTER) + self.status_box.set_valign(Gtk.Align.CENTER) + self.status_box.set_size_request(350, 100) + self.toolbarview.set_content(self.status_box) + + # Set bold title + self.set_title(self.status_title) + + # Create spinner for this page + self.spinner = Gtk.Spinner.new() + self.spinner.set_size_request(100, 100) + self.spinner.start() + self.status_box.append(self.spinner) + + # Adw.StatusPage() + self.status_page = Adw.StatusPage.new() + self.status_page.set_description(self.status_desc) + self.status_box.append(self.status_page) + + # Create button for cancel saving configuration + self.cancel_button = Gtk.Button.new_with_label(_("Cancel")) + self.cancel_button.add_css_class("pill") + self.cancel_button.add_css_class("destructive-action") + self.cancel_button.connect("clicked", self._cancel) + self.cancel_button.set_valign(Gtk.Align.CENTER) + self.cancel_button.set_halign(Gtk.Align.CENTER) + self.status_box.append(self.cancel_button) + + # Stop Saving/Importing Configuration + def _cancel(self, w): + os.popen('pkill -f "savedesktop.core.config"') + os.popen('pkill -9 7z') + os.popen('pkill -9 tar') + self._set_default_widgets_state() + for widget in [self.spinner, self.cancel_button, self.status_page]: + self.status_box.remove(widget) + + def _set_default_widgets_state(self): + self.toolbarview.set_content(self.headapp) + self.headerbar.set_title_widget(self.switcher_title) + self.set_title("Save Desktop") + self.apply_handler = self.break_point.connect("apply", self.__on_break_point_apply) + if self.get_default_size()[0] < 400: + self.switcher_bar.set_reveal(True) + + # config has been saved action + def done(self): + self._send_notification() + + # stop spinner animation + self.spinner.stop() + self.status_box.remove(self.cancel_button) + self.status_box.remove(self.spinner) + + # set title to "Configuration has been saved!" + self.set_title(self.done_title) + + # Adw.StatusPage() + self.status_page.set_icon_name("done") + self.status_page.set_description(self.done_desc) + + # Box layout for the buttons below + self.buttons_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.status_page.set_child(self.buttons_box) + + self._add_specific_button() + + # create button for backing to the previous page + self.back_button = Gtk.Button.new_with_label(_("Back to previous page")) + self.back_button.connect("clicked", self._back_to_main) + self.back_button.add_css_class("pill") + self.back_button.set_valign(Gtk.Align.CENTER) + self.back_button.set_halign(Gtk.Align.CENTER) + self.buttons_box.append(self.back_button) + + # send notification about saved configuration if application window is inactive only + def _send_notification(self): + self.notification_save = Gio.Notification.new("Save Desktop") + self.notification_save.set_body(self.done_title) + app = self.get_application() + active_window = app.get_active_window() + if active_window is None or not active_window.is_active(): + app.send_notification(None, self.notification_save) + + def _add_specific_button(self): + if self.archive_mode == "--create": + self.open_folder_button = Gtk.Button.new_with_label(_("Open the folder")) + self.open_folder_button.add_css_class('pill') + self.open_folder_button.add_css_class('suggested-action') + self.open_folder_button.set_action_name("app.open_dir") + self.open_folder_button.set_valign(Gtk.Align.CENTER) + self.open_folder_button.set_halign(Gtk.Align.CENTER) + self.buttons_box.append(self.open_folder_button) + elif self.archive_mode == "--unpack": + self.logout_button = Gtk.Button.new_with_label(_("Log Out")) + self.logout_button.add_css_class('pill') + self.logout_button.add_css_class('suggested-action') + self.logout_button.set_halign(Gtk.Align.CENTER) + self.logout_button.set_valign(Gtk.Align.CENTER) + self.logout_button.set_action_name("app.logout") + if not (flatpak and self.environment == "Hyprland"): + self.buttons_box.append(self.logout_button) + + def _back_to_main(self, w): + self._set_default_widgets_state() + if self.archive_mode == "--create": + widgets = [self.status_page, self.open_folder_button, self.back_button] + else: + widgets = [self.status_page, self.logout_button, self.back_button] + for widget in widgets: + self.status_box.remove(widget) + + # show message dialog in the error case + def show_err_msg(self, error): + error_str = str(error) + if "died" in error_str: + return + + self.errDialog = Adw.AlertDialog.new() + self.errDialog.choose(self, None, None, None) + self.errDialog.set_heading(heading=_("An error occurred")) + self.errDialog.set_body(body=f"{error_str}") + self.errDialog.add_response('cancel', _("Cancel")) + self.errDialog.present() + + # a warning indicating that the user must log out + def show_warn_toast(self): + self.warn_toast = Adw.Toast.new(title=_("Changes will only take effect after the next login")) + self.warn_toast.set_button_label(_("Log Out")) + self.warn_toast.set_action_name("app.logout") + self.toast_overlay.add_toast(self.warn_toast) + + # message that says where will be run a synchronization + def show_special_toast(self): + self.special_toast = Adw.Toast.new(title=_("From now on, you can sync the config from the menu in the header bar")) + self.toast_overlay.add_toast(self.special_toast) + + # action after closing the main window + def on_close(self, w): + self.close() + # Save window size, state, and filename + settings["window-size"] = self.get_default_size() + settings["maximized"] = self.is_maximized() + settings["filename"] = self.saveEntry.get_text() + + # Check for ongoing operations before clearing cache + if any(os.path.exists(f"{CACHE}/{path}") for path in ["import_config/import_status", "syncing/sync_status", "periodic_saving/saving_status"]): + print("saving/importing/syncing configuration in progress...") + else: + pass diff --git a/src/localization.py b/src/localization.py deleted file mode 100644 index 37d0c9b7..00000000 --- a/src/localization.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/python3 -import json, locale, os, socket, subprocess, gi -from pathlib import Path -from gi.repository import Gio, GLib - -# For simpler import this script to the other scripts -__all__ = ['_', 'home', 'download_dir', 'snap', 'flatpak', 'settings', 'DATA', 'CACHE', 'r_lang', 'version', 'icon', 'rel_notes', 'system_dir', 'periodic_saving_cmd', 'sync_cmd'] - -# Load system language -p_lang = locale.getlocale()[0] -if p_lang == 'pt_BR': - r_lang = 'pt_BR' -elif p_lang == 'nb_NO': - r_lang = 'nb_NO' -elif 'zh' in p_lang: - r_lang = 'zh_Hans' -else: - r_lang = p_lang[:-3] - -# Set application version, icon, and release notes -v = "3.6.2-hotfix" -icon = "io.github.vikdevelop.SaveDesktop" -rel_notes = "

    Fixed a bug with importing configuration from the archive

    \ -

    3.6.2

      \ -
    • Fixed a bug with properly including extensions in the archive (#428)
    • \ -
    • Fixed a bug with importing a configuration from the folder
    • \ -
    • Fixed a bug with cancelling saving or importing configuration
    • \ -
    • Fixed a bug with crashing the app after setting up the synchronization
    • \ -
    • Added the Ctrl+W keyboard shortcut for closing the app window
    \ -

    3.6.1

    This version brings significant speedup of saving and importing configurations thanks to parallel copying (thanks to @ArthurValadares), change of application name from \"SaveDesktop\" to \"Save Desktop\" and minor user interface improvements along with minor bug fixes. Also improved the import of dynamic wallpapers in GNOME and improved archive encryption.

    \ -

    3.6-hotfix

    Fixed a \"buffer overflow\" error when creating configuration archives by replacing the ZIP utility with 7-Zip.

    \ -

    3.6

      \ -
    • Added an option to encrypt the periodic saving files and added support for its usage in the synchronization mode
    • \ -
    • Migrated from the *.sd.tar.gz to the *.sd.zip archive format, but for backward compatibility reasons, it will still be possible to select the first named archive format
    • \ -
    • Added support for using the syncthing folders in the synchronization mode (#392)
    • \ -
    • Fixed other minor bugs
    • \ -
    " - -flatpak = os.path.exists("/.flatpak-info") -snap = os.environ.get('SNAP_NAME', '') == 'savedesktop' - -# Checking for Snap and Real Home directories - -snap_home = Path.home()#keeping this value if it comes handy -snap_real_home = os.getenv('SNAP_REAL_HOME') - -# Setting home as per the confinement -home = snap_real_home if 'SNAP' in os.environ else snap_home - -# Load GSettings database -settings = Gio.Settings.new_with_path("io.github.vikdevelop.SaveDesktop", "/io/github/vikdevelop/SaveDesktop/") - -# Get the user download dir -download_dir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD) - -# Check, if the app is running in the sandbox (Flatpak or Snap) -if flatpak: - try: - locale = open(f"/app/translations/{r_lang}.json") - except: - locale = open(f"/app/translations/en.json") - version = f"{v}" - # Directories - system_dir = "/app" - CACHE = f"{GLib.get_user_cache_dir()}/tmp" - DATA = f"{GLib.get_user_data_dir()}" - # Commands - periodic_saving_cmd = 'flatpak run io.github.vikdevelop.SaveDesktop --background' - sync_cmd = "flatpak run io.github.vikdevelop.SaveDesktop --sync" -elif snap: - try: - locale = open(f"{os.getenv('SNAP')}/usr/translations/{r_lang}.json") - except: - locale = open(f"{os.getenv('SNAP')}/usr/translations/en.json") - version = f"{v}-snap" - # Directories - import dbus - system_dir = f"{os.getenv('SNAP')}/usr" - CACHE = f"{os.getenv('SNAP_USER_COMMON')}/.cache/tmp" - DATA = f"{os.getenv('SNAP_USER_DATA')}/.local/share" - os.makedirs(f"{CACHE}", exist_ok=True) - # Commands - periodic_saving_cmd = 'savedesktop --background' - sync_cmd = "savedesktop --sync" -else: - try: - locale = open(f"{home}/.local/share/savedesktop/translations/{r_lang}.json") - except: - locale = open(f"{home}/.local/share/savedesktop/translations/en.json") - version = f"{v}-native" - # Directories - system_dir = f"{home}/.local/share/savedesktop/src" - CACHE = f"{GLib.get_user_cache_dir()}/io.github.vikdevelop.SaveDesktop" - DATA = f"{GLib.get_user_data_dir()}/io.github.vikdevelop.SaveDesktop" - [os.makedirs(path, exist_ok=True) for path in (CACHE, DATA)] - # Commands - periodic_saving_cmd = f'savedesktop --background' - sync_cmd = f"savedesktop --sync" - -# Load the translation file -_ = json.load(locale) diff --git a/src/main.py b/src/main.py new file mode 100644 index 00000000..84ce7f6f --- /dev/null +++ b/src/main.py @@ -0,0 +1,156 @@ +import os, sys, gi, subprocess +gi.require_version('Gtk', '4.0') +gi.require_version('Adw', '1') +from gi.repository import Gtk, Adw, Gio, GLib +from threading import Thread +from savedesktop.gui.window import MainWindow +from savedesktop.globals import * + +@Gtk.Template(resource_path="/io/github/vikdevelop/SaveDesktop/gui/templates/shortcuts_window.ui") +class ShortcutsWindow(Gtk.ShortcutsWindow): + __gtype_name__ = 'SaveDesktopShortcutsWindow' + + def __init__(self, **kwargs): + super().__init__(**kwargs) + +class SaveDesktopApp(Adw.Application): + def __init__(self, **kwargs): + super().__init__(**kwargs, flags=Gio.ApplicationFlags.FLAGS_NONE, + application_id="io.github.vikdevelop.SaveDesktop" if not snap else None) + self.create_action('m-sync-with-key', self.sync_pc, ["s"] if settings["manually-sync"] else None) + self.create_action('save-config', self.call_saving_config, ["s"]) + self.create_action('import-config', self.call_importing_config, ["o"]) + self.create_action('ms-dialog', self.call_ms_dialog, ["m"]) + self.create_action('items-dialog', self.call_items_dialog, ["i"]) + self.create_action('set-dialog', self.call_setDialog, ["f"]) + self.create_action('cloud-dialog', self.call_cloudDialog, ["c"]) + self.create_action('open-wiki', self.open_wiki, ["F1"]) + self.create_action('quit', self.app_quit, ["q", "w"]) + self.create_action('shortcuts', self.shortcuts, ["question"]) + self.create_action('logout', self.logout) + self.create_action('open_dir', self.open_dir) + self.create_action('about', self.on_about_action) + self.connect('activate', self.on_activate) + + # Synchronize configuation manually after clicking on the "Synchronise manually" button in the header bar menu + def sync_pc(self, action, param): + self.win.import_file = settings["file-for-syncing"] + self.win.please_wait_import() + sync_thread = Thread(target=self._sync_process) + sync_thread.start() + + def _sync_process(self): + try: + os.system(f'notify-send "{_("Please wait …")}"') + os.system(f"echo > {CACHE}/.from_app") + subprocess.run([sys.executable, "-m", "savedesktop.core.synchronization"], check=True, env={**os.environ, "PYTHONPATH": f"{app_prefix}"}) + except subprocess.CalledProcessError as e: + GLib.idle_add(self.win.show_err_msg, e) + self.toolbarview.set_content(self.headapp) + self.headerbar.set_title_widget(self.switcher_title) + self.switcher_bar.set_reveal(self.switcher_title.get_title_visible()) + finally: + self.win.applying_done() + + # Start saving the configuration using Ctrl+S keyboard shortcut + def call_saving_config(self, action, param): + self.win.select_folder(w="") + + # Start importing the configuration using Ctrl+I keyboard shortcut + def call_importing_config(self, action, param): + self.win.select_file_to_import(w="") + + # Open the More options dialog using Ctrl+Shift+M keyboard shortcut + def call_ms_dialog(self, action, param): + self.win._open_more_options_dialog(w="") + + # Open the "Items to include in the configuration archive" dialog using Ctrl+Shift+I keyboard shortcut + def call_items_dialog(self, action, param): + self.win._open_itemsDialog(w="") + + # Open the "Set up the sync file" dialog using Ctrl+Shift+S keyboard shortcut + def call_setDialog(self, action, param): + if not snap: + self.win._open_SetDialog(w="set-button") if not settings["first-synchronization-setup"] else self.win._open_InitSetupDialog(w="set-button") + + # Open the "Connect to the cloud drive" dialog using Ctrl+Shift+C keyboard shortcut + def call_cloudDialog(self, action, param): + if not snap: + self.win._open_CloudDialog(w="get-button") if not settings["first-synchronization-setup"] else self.win._open_InitSetupDialog(w="get-button") + + # Open the application wiki using F1 keyboard shortcut + def open_wiki(self, action, param): + os.system("xdg-open https://vikdevelop.github.io/SaveDesktop/wiki") + + # Action after closing the application using Ctrl+Q keyboard shortcut + def app_quit(self, action, param): + self.win.on_close(w="") + self.quit() + + # Show Keyboard Shortcuts window + def shortcuts(self, action, param): + ShortcutsWindow(transient_for=self.get_active_window()).present() + + # log out of the system after clicking on the "Log Out" button + def logout(self, action, param): + if snap: + os.system("dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.TerminateSession string:$(dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.ListSessions | awk -F 'string \"' '/string \"/ {print $2; exit}' | awk -F '\"' '{print $1}')") + else: + if self.win.environment == 'Xfce': + os.system("dbus-send --print-reply --session --dest=org.xfce.SessionManager /org/xfce/SessionManager org.xfce.Session.Manager.Logout boolean:true boolean:false") + elif self.win.environment == 'KDE Plasma': + os.system("dbus-send --print-reply --session --dest=org.kde.LogoutPrompt /LogoutPrompt org.kde.LogoutPrompt.promptLogout") + elif self.win.environment == 'COSMIC (New)': + os.system("dbus-send --print-reply --session --dest=com.system76.CosmicSession --type=method_call /com/system76/CosmicSession com.system76.CosmicSession.Exit") + elif self.win.environment == 'Hyprland': + os.system("hyprctl dispatch exit") + else: + os.system("gdbus call --session --dest org.gnome.SessionManager --object-path /org/gnome/SessionManager --method org.gnome.SessionManager.Logout 1") + + # open a directory with created configuration archive after clicking on the "Open the folder" button + def open_dir(self, action, param): + if settings["save-without-archive"]: + path = f"{self.win.folder}/{self.win.filename_text}" + else: + path = f"{self.win.folder}/{self.win.filename_text}.sd.zip" + + Gtk.FileLauncher.new(Gio.File.new_for_path(path)).open_containing_folder() + + # "About app" dialog + def on_about_action(self, action, param): + app_version = os.environ.get("SAVEDESKTOP_VERSION") + dialog = Adw.AboutDialog( + application_name="Save Desktop", + developer_name="vikdevelop", + comments=_("Save your desktop configuration"), + license_type=Gtk.License.GPL_3_0, + website="https://vikdevelop.github.io/SaveDesktop", + issue_url="https://github.com/vikdevelop/SaveDesktop/issues", + copyright="© 2023-2025 vikdevelop", + developers=["vikdevelop https://github.com/vikdevelop"], + artists=["Brage Fuglseth"], + version=app_version, + application_icon="io.github.vikdevelop.SaveDesktop", + release_notes=f"

    https://github.com/vikdevelop/SaveDesktop/releases/tag/{app_version}

    ", + ) + + if _("Translator credits") != "Translator credits": + dialog.set_translator_credits(_("Translator credits")) + + dialog.present(app.get_active_window()) + + # create Gio actions for opening the folder, logging out of the system, etc. + def create_action(self, name, callback, shortcuts=None): + action = Gio.SimpleAction.new(name, None) + action.connect('activate', callback) + self.add_action(action) + if shortcuts: + self.set_accels_for_action(f'app.{name}', shortcuts) + + # Show the main window of the application + def on_activate(self, app): + self.win = MainWindow(application=app) + self.win.present() + +app = SaveDesktopApp() +app.run(sys.argv) diff --git a/src/main_window.py b/src/main_window.py deleted file mode 100644 index 66427514..00000000 --- a/src/main_window.py +++ /dev/null @@ -1,1735 +0,0 @@ -#!/usr/bin/python3 -import os, socket, glob, sys, shutil, re, zipfile, random, string, gi, warnings, tarfile, subprocess, shlex -gi.require_version('Gtk', '4.0') -gi.require_version('Adw', '1') -from gi.repository import Gtk, Adw, Gio, GLib, Gdk -from datetime import date -from pathlib import Path -from threading import Thread -from localization import * -from shortcuts_window import * -from items_dialog import FolderSwitchRow, FlatpakAppsDialog, itemsDialog -from password_store import PasswordStore - -# Application window -class MainWindow(Adw.ApplicationWindow): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.set_title("Save Desktop") - self.app_wiki = "https://vikdevelop.github.io/SaveDesktop/wiki" - - # header bar and toolbarview - self.headerbar = Adw.HeaderBar.new() - self.toolbarview = Adw.ToolbarView.new() - self.toolbarview.add_top_bar(self.headerbar) - - # Values that are set if state of the switch "Extensions" in the Items, state of the switch "User data of installed Flatpak apps" will be saved or not, if whether to reopen the self.setDialog, if restarts the app window. Whether the Apply button in self.setDialog will be enabled or not. - self.save_ext_switch_state = self.flatpak_data_sw_state = self.open_setdialog_tf = self.set_button_sensitive = self.restart_app_win = self.auto_save_start = False - - # set the window size and maximization from the GSettings database - (width, height) = settings["window-size"] - self.set_default_size(width, height) - - # if the value is TRUE, it enables window maximalization - if settings["maximized"]: - self.maximize() - - # App menu - primary menu - self.main_menu = Gio.Menu() - - # primary menu section - self.general_menu = Gio.Menu() - self.general_menu.append(_["keyboard_shortcuts"], 'app.shortcuts') - self.general_menu.append(_["about_app"], 'app.about') - self.main_menu.append_section(None, self.general_menu) - - # menu button - self.menu_button = Gtk.MenuButton.new() - self.menu_button.set_icon_name(icon_name='open-menu-symbolic') - self.menu_button.set_menu_model(menu_model=self.main_menu) - self.menu_button.set_primary(True) - self.headerbar.pack_end(child=self.menu_button) - - # add Manually sync section - if settings["manually-sync"] == True: - self.sync_menu = Gio.Menu() - self.sync_menu.append(_["sync"], 'app.m-sync-with-key') - self.main_menu.prepend_section(None, self.sync_menu) - - # primary layout - self.headapp = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.headapp.set_valign(Gtk.Align.CENTER) - self.headapp.set_halign(Gtk.Align.CENTER) - self.toolbarview.set_content(self.headapp) - - # A view container for the menu switcher - self.stack = Adw.ViewStack(vexpand=True) - self.stack.set_hhomogeneous(True) - self.headapp.append(self.stack) - - # Layout for saving and importing configuration - self.saveBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15) - self.importBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.syncingBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - - # Add pages to the menu switcher - self.stack.add_titled_with_icon(self.saveBox,"savepage",_["save"],"document-save-symbolic") - self.stack.add_titled_with_icon(self.importBox,"importpage",_["import_title"],"document-open-symbolic") - self.stack.add_titled_with_icon(self.syncingBox,"syncpage",_["sync"],"emblem-synchronizing-symbolic") if not snap else None - - # menu switcher - self.switcher_title = Adw.ViewSwitcherTitle.new() - self.switcher_title.set_stack(self.stack) - self.switcher_title.set_title("Save Desktop") - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_title.connect("notify::title-visible", self.change_bar) - - # menu bar - self.switcher_bar = Adw.ViewSwitcherBar.new() - self.switcher_bar.set_stack(self.stack) - self.toolbarview.add_bottom_bar(self.switcher_bar) - - # Toast Overlay for showing the popup window - self.toast_overlay = Adw.ToastOverlay.new() - self.toast_overlay.set_margin_top(margin=1) - self.toast_overlay.set_margin_end(margin=1) - self.toast_overlay.set_margin_bottom(margin=1) - self.toast_overlay.set_margin_start(margin=1) - self.toast_overlay.set_child(self.toolbarview) - self.set_content(self.toast_overlay) - - # Popup window for showing messages about necessity to log out of the system after selected the periodic synchronization interval - self.toast = Adw.Toast.new(title='') - self.toast.set_timeout(0) - - # Check the user's current desktop - desktop_env = os.getenv('XDG_CURRENT_DESKTOP') - desktop_map = { - 'GNOME': 'GNOME', - 'zorin:GNOME': 'GNOME', - 'ubuntu:GNOME': 'GNOME', - 'pop:GNOME': 'COSMIC (Old)', - 'COSMIC': 'COSMIC (New)', - 'Pantheon': 'Pantheon', - 'X-Cinnamon': 'Cinnamon', - 'Budgie:GNOME': 'Budgie', - 'XFCE': 'Xfce', - 'MATE': 'MATE', - 'KDE': 'KDE Plasma', - 'Deepin': 'Deepin', - 'Hyprland': 'Hyprland'} - - # If the user has a supported environment, it shows the app window, otherwise, it shows the window with information about an unsupported environment - def setup_environment(env_name): - self.environment = env_name - self.save_desktop() - self.import_desktop() - self.sync_desktop() if not snap else print("Synchronization in the Snap environment is temporarily disabled.") - self.connect("close-request", self.on_close) - - if desktop_env in desktop_map: - setup_environment(desktop_map[desktop_env]) - else: - # Handle unsupported desktop environments - self.headerbar.set_title_widget(None) - self.toolbarview.remove(self.switcher_bar) - self.pBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.pBox.set_halign(Gtk.Align.CENTER) - self.pBox.set_valign(Gtk.Align.CENTER) - self.pBox.set_margin_start(50) - self.pBox.set_margin_end(50) - self.toolbarview.set_content(self.pBox) - self.unsupp_img = Gtk.Image.new_from_icon_name("exclamation_mark"); self.unsupp_img.set_pixel_size(128); self.pBox.append(self.unsupp_img) - self.unsupp_label = Gtk.Label.new(str=f'{_["unsuppurted_env_desc"]}'.format(', '.join(set(desktop_map.values())))); self.unsupp_label.set_use_markup(True); self.unsupp_label.set_justify(Gtk.Justification.CENTER); self.unsupp_label.set_wrap(True); self.pBox.append(self.unsupp_label) - - # Switch between ViewSwitcherTitle and ViewSwitcherBar based on the title visible - def change_bar(self, *data): - if self.switcher_title.get_title_visible() == True: - self.switcher_bar.set_reveal(True) - else: - self.switcher_bar.set_reveal(False) - - # Show main page - def save_desktop(self): - # More options dialog - def more_options_dialog(w): - # create desktop file for enabling periodic saving at startup - def create_pb_desktop(): - os.makedirs(f'{home}/.config/autostart', exist_ok=True) - if not os.path.exists(f"{DATA}/savedesktop-synchronization.sh"): - with open(f'{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Backup.desktop', 'w') as cb: - cb.write(f'[Desktop Entry]\nName=SaveDesktop (Periodic backups)\nType=Application\nExec={periodic_saving_cmd}') - - # Action after closing dialog for showing more options - def msDialog_closed(w, response): - if response == 'ok': - settings["filename-format"] = self.filefrmtEntry.get_text() # save the file name format entry - settings["periodic-saving-folder"] = self.dirRow.get_subtitle() # save the selected periodic saving folder - # save the periodic saving interval - selected_item = self.pbRow.get_selected_item() - backup_mapping = {_["never"]: "Never", _["daily"]: "Daily", _["weekly"]: "Weekly", _["monthly"]: "Monthly"} - backup_item = backup_mapping.get(selected_item.get_string(), "Never") - create_pb_desktop() if not backup_item == "Never" else None - settings["periodic-saving"] = backup_item - settings["enable-encryption"] = self.encryptSwitch.get_active() # save the archive encryption's switch state - settings["save-without-archive"] = self.archSwitch.get_active() # save the switch state of the "Save a configuration without creating the configuration archive" option - # save the entered password to the file - if self.cpwdRow.get_text(): - password = self.cpwdRow.get_text() - PasswordStore(password) - else: - try: - os.remove(f"{DATA}/password") - except: - pass - - # restart the SetDialog() after closing this dialog - if self.open_setdialog_tf: - self.setDialog.close() - w = "" - self.open_setDialog(w) - - # open a link to the wiki page about periodic saving - def open_pb_wiki(w): - os.system(f"xdg-open {pb_wiki}") - - # reset the file name format entry to the default value - def reset_fileformat(w): - self.filefrmtEntry.set_text("Latest_configuration") - - # set sensitivity of the encryptSwitch - def set_encryptswitch_sensitivity(GParamBoolean, encryptSwitch): - if self.encryptSwitch.get_active(): - self.archSwitch.set_sensitive(False) - else: - self.archSwitch.set_sensitive(True) - - # set sensitivity of the archSwitch - def set_archswitch_sensitivity(GParamBoolean, archSwitch): - if self.archSwitch.get_active(): - self.encryptSwitch.set_sensitive(False) - else: - self.encryptSwitch.set_sensitive(True) - - # Dialog itself - self.msDialog = Adw.AlertDialog.new() - self.msDialog.set_heading(_["more_options"]) - self.msDialog.choose(self, None, None, None) - - # Box for this dialog - self.msBox = Gtk.ListBox.new() - self.msBox.set_selection_mode(mode=Gtk.SelectionMode.NONE) - self.msBox.add_css_class('boxed-list') - self.msBox.set_size_request(-1, 520) if self.open_setdialog_tf else self.msBox.set_size_request(-1, 320) - self.msDialog.set_extra_child(self.msBox) - - # Periodic saving section - # Expander row for showing options of the periodic saving - self.saving_eRow = Adw.ExpanderRow.new() - self.saving_eRow.set_title(_["periodic_saving"]) - self.saving_eRow.set_expanded(True) if self.open_setdialog_tf else None - self.msBox.append(child=self.saving_eRow) - - options = Gtk.StringList.new(strings=[ - _["never"], _["daily"], _["weekly"], _["monthly"] - ]) - - self.pbRow = Adw.ComboRow.new() - self.pbRow.set_title(_["pb_interval"]) - self.pbRow.set_use_markup(True) - self.pbRow.set_subtitle(f"{_['periodic_saving_desc']}") - self.pbRow.set_subtitle_lines(4) - self.pbRow.set_model(model=options) - self.saving_eRow.add_row(self.pbRow) - - # Load options from GSettings database - if settings["periodic-saving"] == 'Never': - self.pbRow.set_selected(0) - elif settings["periodic-saving"] == 'Daily': - self.pbRow.set_selected(1) - elif settings["periodic-saving"] == 'Weekly': - self.pbRow.set_selected(2) - elif settings["periodic-saving"] == 'Monthly': - self.pbRow.set_selected(3) - - # Restore filename format text to default - self.filefrmtButton = Gtk.Button.new_from_icon_name("view-refresh-symbolic") - self.filefrmtButton.add_css_class('destructive-action') - self.filefrmtButton.set_valign(Gtk.Align.CENTER) - self.filefrmtButton.set_tooltip_text(_["reset_button"]) - self.filefrmtButton.connect("clicked", reset_fileformat) - - # Entry for selecting file name format - self.filefrmtEntry = Adw.EntryRow.new() - self.filefrmtEntry.set_title(_["filename_format"]) - self.filefrmtEntry.add_suffix(self.filefrmtButton) - self.filefrmtEntry.set_text(settings["filename-format"]) - self.saving_eRow.add_row(self.filefrmtEntry) - - # Button for choosing folder for periodic saving - self.folderButton = Gtk.Button.new_from_icon_name("document-open-symbolic") - self.folderButton.set_valign(Gtk.Align.CENTER) - self.folderButton.set_tooltip_text(_["set_another"]) - self.folderButton.connect("clicked", self.select_pb_folder) - - # Adw.ActionRow for showing folder for periodic saving - self.dirRow = Adw.ActionRow.new() - self.dirRow.set_title(_["pb_folder"]) - self.dirRow.add_suffix(self.folderButton) - self.dirRow.set_use_markup(True) - self.dirRow.set_subtitle(settings["periodic-saving-folder"].format(download_dir)) - self.saving_eRow.add_row(self.dirRow) - - # Adw.ActionRow for entering a password for the archive encryption - self.get_password_from_file() - - self.cpwdRow = Adw.PasswordEntryRow.new() - self.cpwdRow.set_title(_["pwd_for_encryption"]) - try: - self.cpwdRow.set_text(self.password) - except: - self.cpwdRow.set_text("") - self.saving_eRow.add_row(self.cpwdRow) - - # Manual saving section - self.manRow = Adw.ExpanderRow.new() - self.manRow.set_title(_["manual_saving"]) - self.manRow.set_expanded(True) - self.msBox.append(self.manRow) - - # action row and switch for showing options of the archive encryption - self.encryptSwitch = Gtk.Switch.new() - self.archSwitch = Gtk.Switch.new() - self.encryptSwitch.set_valign(Gtk.Align.CENTER) - self.encryptSwitch.connect('notify::active', set_encryptswitch_sensitivity) - if settings["enable-encryption"] == True: - self.encryptSwitch.set_active(True) - self.archSwitch.set_sensitive(False) - - self.encryptRow = Adw.ActionRow.new() - self.encryptRow.set_title(_["archive_encryption"]) - self.encryptRow.set_subtitle(f'{_["archive_encryption_desc"]}') - self.encryptRow.set_subtitle_lines(15) - self.encryptRow.add_suffix(self.encryptSwitch) - self.encryptRow.set_activatable_widget(self.encryptSwitch) - self.manRow.add_row(self.encryptRow) - - # action row and switch for showing the "Save a configuration without creating the archive" option - self.archSwitch.set_valign(Gtk.Align.CENTER) - self.archSwitch.connect('notify::active', set_archswitch_sensitivity) - if settings["save-without-archive"] == True: - self.archSwitch.set_active(True) - self.encryptSwitch.set_sensitive(False) - - self.archRow = Adw.ActionRow.new() - self.archRow.set_title(_["save_without_archive"]) - self.archRow.add_suffix(self.archSwitch) - self.archRow.set_activatable_widget(self.archSwitch) - self.manRow.add_row(self.archRow) - - # add response of this dialog - self.msDialog.add_response('cancel', _["cancel"]) - self.msDialog.add_response('ok', _["apply"]) - self.msDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) - self.msDialog.connect('response', msDialog_closed) - - self.msDialog.present() - - # open a dialog for selecting the items to include in the configuration archive - def open_itemsDialog(w): - self.itemsd = itemsDialog() - self.itemsd.choose(self, None, None, None) - self.itemsd.present() - - # ========= - # Save page - - # Open the More options dialog from the self.setDialog - self.more_options_dialog = more_options_dialog - self.items_dialog = open_itemsDialog - - # Set valign for the save desktop layout - self.saveBox.set_valign(Gtk.Align.CENTER) - - # Title image for the save page - self.titleImage = Gtk.Image.new_from_icon_name("desktop-symbolic") - self.titleImage.set_pixel_size(64) - self.saveBox.append(self.titleImage) - - # Title "Save Current configuration" for save page and subtitle "{user_desktop}" - self.label_title = Gtk.Label.new() - self.label_title.set_markup('{}\n{}'.format(_["save_config"], self.environment)) - self.label_title.set_justify(Gtk.Justification.CENTER) - self.saveBox.append(self.label_title) - - # Box for show these options: set the filename, set items that will be included to the config archive and periodic saving - self.lbox_e = Gtk.ListBox.new() - self.lbox_e.set_selection_mode(mode=Gtk.SelectionMode.NONE) - self.lbox_e.add_css_class(css_class='boxed-list-separate') - self.lbox_e.set_margin_start(20) - self.lbox_e.set_margin_end(20) - self.lbox_e.set_halign(Gtk.Align.CENTER) - self.lbox_e.set_valign(Gtk.Align.CENTER) - self.saveBox.append(self.lbox_e) - - # set the filename section - self.saveEntry = Adw.EntryRow.new() - self.saveEntry.set_title(_["set_filename"]) - self.saveEntry.set_text(settings["filename"]) - self.lbox_e.append(self.saveEntry) - - # Button for opening dialog for selecting items that will be included to the config archive - self.itemsButton = Gtk.Button.new_from_icon_name("go-next-symbolic") - self.itemsButton.set_valign(Gtk.Align.CENTER) - self.itemsButton.add_css_class("flat") - self.itemsButton.connect("clicked", open_itemsDialog) - - # Action row for opening dialog for selecting items that will be included to the config archive - self.items_row = Adw.ActionRow.new() - self.items_row.set_title(title=_["items_for_archive"]) - self.items_row.set_use_markup(True) - self.items_row.set_title_lines(5) - self.items_row.add_suffix(self.itemsButton) - self.items_row.set_activatable_widget(self.itemsButton) - self.lbox_e.append(child=self.items_row) - - self.lbox_e.set_show_separators(True) - - # section for showing dialog with more options - # button - self.msButton = Gtk.Button.new_from_icon_name("go-next-symbolic") - self.msButton.add_css_class('flat') - self.msButton.set_valign(Gtk.Align.CENTER) - self.msButton.connect("clicked", more_options_dialog) - - # action row - self.moreSettings = Adw.ActionRow.new() - self.moreSettings.set_title(_["more_options"]) - self.moreSettings.set_subtitle(f"{_['periodic_saving']}, {_['manual_saving']}") - self.moreSettings.set_subtitle_lines(3) - self.moreSettings.add_suffix(self.msButton) - self.moreSettings.set_activatable_widget(self.msButton) - self.lbox_e.append(self.moreSettings) - - # Save configuration button - self.saveButton = Gtk.Button.new_with_label(_["save"]) - self.saveButton.add_css_class("suggested-action") - self.saveButton.add_css_class("pill") - self.saveButton.connect("clicked", self.select_folder) - self.saveButton.set_valign(Gtk.Align.CENTER) - self.saveButton.set_halign(Gtk.Align.CENTER) - self.saveBox.append(self.saveButton) - - # Import configuration page - def import_desktop(self): - self.importBox.set_valign(Gtk.Align.CENTER) - self.importBox.set_halign(Gtk.Align.CENTER) - - # Box for the below buttons - self.btnBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - - # Import configuration button - self.fileButton = Gtk.Button.new_with_label(_["import_from_file"]) - self.fileButton.add_css_class("pill") - self.fileButton.add_css_class("suggested-action") - self.fileButton.set_halign(Gtk.Align.CENTER) - self.fileButton.set_valign(Gtk.Align.CENTER) - self.fileButton.connect("clicked", self.select_file_to_import) - self.btnBox.append(self.fileButton) - - # Import configuration from folder button - self.folderButton = Gtk.Button.new_with_label(_["import_from_folder"]) - self.folderButton.add_css_class("pill") - self.folderButton.set_halign(Gtk.Align.CENTER) - self.folderButton.set_valign(Gtk.Align.CENTER) - self.folderButton.connect("clicked", self.select_folder_to_import) - self.btnBox.append(self.folderButton) - - # Image and title for the Import page - self.importPage = Adw.StatusPage.new() - self.importPage.set_icon_name("document-open-symbolic") - self.importPage.set_title(_["import_title"]) - self.importPage.set_description(_["import_config"]) - self.importPage.set_size_request(360, -1) - self.importPage.set_child(self.btnBox) - self.importBox.append(self.importPage) - - # Syncing desktop page - def sync_desktop(self): - # Set showing the Initial synchronization setup dialog only if the periodic saving folder or cloud drive folder does not use GVFS or Rclone filesystem - settings["first-synchronization-setup"] = True if not os.path.exists(f"{DATA}/savedesktop-synchronization.sh") else False - - # Box, image and title for this page - self.sync_btn_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.syncPage = Adw.StatusPage.new() - self.syncPage.set_icon_name("emblem-synchronizing-symbolic") - self.syncPage.set_title(_["sync"]) - self.syncPage.set_description(f'{_["sync_desc"]} {_["learn_more"]}') - self.syncPage.set_child(self.sync_btn_box) - self.syncingBox.append(self.syncPage) - - # "Set up the sync file" button - self.setButton = Gtk.Button.new_with_label(_["set_up_sync_file"]) - self.setButton.set_name("set-button") - self.setButton.add_css_class("pill") - self.setButton.add_css_class("suggested-action") - self.setButton.connect("clicked", self.open_setDialog if not settings["first-synchronization-setup"] else self.open_initsetupDialog) - self.setButton.set_valign(Gtk.Align.CENTER) - self.setButton.set_halign(Gtk.Align.CENTER) - self.sync_btn_box.append(self.setButton) - - # "Connect with other computer" button - self.getButton = Gtk.Button.new_with_label(_["connect_cloud_storage"]) - self.getButton.set_name("get-button") - self.getButton.add_css_class("pill") - self.getButton.connect("clicked", self.open_cloudDialog if not settings["first-synchronization-setup"] else self.open_initsetupDialog) - self.getButton.set_valign(Gtk.Align.CENTER) - self.getButton.set_halign(Gtk.Align.CENTER) - self.sync_btn_box.append(self.getButton) - - # Dialog for initial setting up the synchronization - def open_initsetupDialog(self, w): - # set the self.get_button_type variable before starting the dialog - try: - self.get_button_type = w.get_name() - except AttributeError: - self.get_button_type = w - - # show the message about finished setup the synchronization - def almost_done(): - self.initsetupDialog.remove_response('ok-rclone') - self.initsetupDialog.remove_response('ok-syncthing') - self.initsetupDialog.remove_response('next') - self.initsetupDialog.set_extra_child(None) - self.initsetupDialog.set_heading(_["almost_done_title"]) - self.initsetupDialog.set_body(_["almost_done_desc"]) - self.initsetupDialog.set_can_close(True) - self.initsetupDialog.add_response('open-setdialog', _["next"]) if self.get_button_type == 'set-button' else self.initsetupDialog.add_response('open-clouddialog', _["next"]) - self.initsetupDialog.set_response_appearance('open-setdialog', Adw.ResponseAppearance.SUGGESTED) if self.get_button_type == 'set-button' else self.initsetupDialog.set_response_appearance('open-clouddialog', Adw.ResponseAppearance.SUGGESTED) - - # copy the command for setting up the Rclone using Gdk.Clipboard() - def copy_rclone_command(w): - os.makedirs(f"{download_dir}/SaveDesktop/rclone_drive", exist_ok=True) # create the requested folder before copying the command for setting up Rclone to the clipboard - clipboard = Gdk.Display.get_default().get_clipboard() - Gdk.Clipboard.set(clipboard, f"command -v rclone &> /dev/null && (rclone config create savedesktop {self.cloud_service} && rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive) || echo 'Rclone is not installed. Please install it from this website first: https://rclone.org/install/.'") # copy the command for setting up Rclone to the clipboard - self.copyButton.set_icon_name("done") - self.cmdRow.set_title(_["rclone_cmd_copied_msg"]) - self.cmdRow.set_subtitle("") - self.initsetupDialog.set_response_enabled('ok-rclone', True) - - # Set the Rclone setup command - def get_service(comborow, GParamObject): - self.initsetupDialog.set_body("") - get_servrow = self.servRow.get_selected_item().get_string() - self.cloud_service = "drive" if get_servrow == "Google Drive" else "onedrive" if get_servrow == "Microsoft OneDrive" else "dropbox" if get_servrow == "DropBox" else "pcloud" - self.cmdRow.set_title(_["rclone_copy_cmd"]) - self.cmdRow.set_subtitle(f"command -v rclone &> /dev/null && (rclone config create savedesktop {self.cloud_service} && rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive) || echo 'Rclone is not installed. Please install it from this website first: https://rclone.org/install/.'") - # set the copyButton properties - self.copyButton.set_sensitive(True) - self.copyButton.set_icon_name("edit-copy-symbolic") - self.copyButton.set_tooltip_text("Copy") - self.copyButton.connect("clicked", copy_rclone_command) - - # Responses of this dialog - def initsetupDialog_closed(w, response): - if response == 'next' or response == 'ok-syncthing': # open the Gtk.FileDialog in the GNOME Online accounts case - self.select_pb_folder(w) if self.get_button_type == 'set-button' else self.select_folder_to_sync(w) - almost_done() - elif response == 'ok-rclone': # set the periodic saving folder in the Rclone case - if self.get_button_type == 'set-button': - settings["periodic-saving-folder"] = f"{download_dir}/SaveDesktop/rclone_drive" - else: - settings["file-for-syncing"] = f"{download_dir}/SaveDesktop/rclone_drive" - almost_done() - elif response == 'cancel': # if the user clicks on the Cancel button - self.initsetupDialog.set_can_close(True) - elif response == 'open-setdialog': # open the "Set up the sync file" dialog after clicking on the Next button in "Almost done!" page - self.auto_save_start = True - settings["periodic-saving"] = "Daily" - self.restart_app_win = True - self.open_setDialog(w) - elif response == 'open-clouddialog': # open the "Connect to the cloud folder" dialog after clicking on the Next button in "Almost done!" page - settings["first-synchronization-setup"] = False - self.restart_app_win = True - self.open_cloudDialog(w) - - # Dialog itself - self.initsetupDialog = Adw.AlertDialog.new() - self.initsetupDialog.set_heading(_["initial_setup"]) - self.initsetupDialog.choose(self, None, None, None) - self.initsetupDialog.set_body_use_markup(True) - self.initsetupDialog.set_can_close(False) - self.initsetupDialog.add_response('cancel', _["cancel"]) - self.initsetupDialog.set_response_appearance('cancel', Adw.ResponseAppearance.DESTRUCTIVE) - self.initsetupDialog.add_response('ok-syncthing', _["syncthing_folder"]) - self.initsetupDialog.connect('response', initsetupDialog_closed) - self.initsetupDialog.present() - - # create a ListBox for the rows below - self.initBox = Gtk.ListBox.new() - self.initBox.set_selection_mode(Gtk.SelectionMode.NONE) - self.initBox.add_css_class("boxed-list") - self.initBox.set_vexpand(True) - self.initsetupDialog.set_extra_child(self.initBox) - - # if the user has GNOME, Cinnamon, COSMIC (Old) or Budgie environment, it shows text about setting up GNOME Online Accounts. - # otherwise, it shows the text about setting up Rclone - if self.environment in ["GNOME", "Cinnamon", "COSMIC (Old)", "Budgie"]: - self.initBox.set_size_request(-1, 330) - self.firstRow = Adw.ActionRow.new() - self.firstRow.set_title(_["gnome_oa_settings"]) - self.initBox.append(self.firstRow) - - self.secondRow = Adw.ActionRow.new() - self.secondRow.set_title(_["gnome_oa_section"]) - self.secondRow.set_subtitle(_["gnome_oa_section_desc"]) - self.initBox.append(self.secondRow) - - self.thirdRow = Adw.ActionRow.new() - self.thirdRow.set_title(_["gnome_oa_chooser"]) - self.thirdRow.set_subtitle(_["gnome_oa_chooser_desc"]) - self.initBox.append(self.thirdRow) - - self.initsetupDialog.add_response('next', _["next"]) - self.initsetupDialog.set_response_appearance('next', Adw.ResponseAppearance.SUGGESTED) - else: - self.initsetupDialog.set_body(_["rclone_intro_desc"]) - - # create a list with available services, which can be connected via Rclone - services = Gtk.StringList.new(strings=[_["select"], 'Google Drive', 'Microsoft OneDrive', 'DropBox', 'pCloud']) - - # row for selecting the cloud service - self.servRow = Adw.ComboRow.new() - self.servRow.set_model(services) - self.servRow.connect("notify::selected-item", get_service) - self.initBox.append(self.servRow) - - # button for copying the Rclone command to clipboard - self.copyButton = Gtk.Button.new() - self.copyButton.add_css_class('flat') - self.copyButton.set_valign(Gtk.Align.CENTER) - self.copyButton.set_sensitive(False) - - # row for showing the command for setting up the Rclone - self.cmdRow = Adw.ActionRow.new() - self.cmdRow.set_title_selectable(True) - self.cmdRow.set_use_markup(True) - self.cmdRow.add_suffix(self.copyButton) - self.initBox.append(self.cmdRow) - - # add the Apply button to the dialog - self.initsetupDialog.add_response('ok-rclone', _["apply"]) - self.initsetupDialog.set_response_appearance('ok-rclone', Adw.ResponseAppearance.SUGGESTED) - self.initsetupDialog.set_response_enabled('ok-rclone', False) - - # Dialog for setting the sync file, periodic synchronization interval and copying the URL for synchronization - def open_setDialog(self, w): - # Create periodic saving file if it does not exist - def save_now(): - try: - e_o = False - subprocess.run(['notify-send', 'SaveDesktop', _["please_wait"]]) - self.file_row.set_subtitle(_["please_wait"]) - self.file_row.set_use_markup(False) - from periodic_saving import PeriodicBackups - pb = PeriodicBackups() - pb.run(now=True) - except Exception as e: - e_o = True - subprocess.run(['notify-send', _["err_occured"], f'{e}']) - self.file_row.set_subtitle(f'{e}') - finally: - if not e_o: - self.file_row.remove(self.setupButton) - self.file_row.set_subtitle(f'{settings["periodic-saving-folder"]}/{settings["filename-format"]}.sd.zip') - os.system(f"notify-send 'SaveDesktop' '{_['config_saved']}'") - self.setDialog.set_response_enabled('ok', True) - self.auto_save_start = False - - # make the periodic saving file if it does not exist - def make_pb_file(w): - self.setupButton.set_sensitive(False) - pb_thread = Thread(target=save_now) - pb_thread.start() - - # Refer to the article about synchronization - def open_sync_link(w): - os.system(f"xdg-open {self.app_wiki}/synchronization/{r_lang}") - - def update_gui(): - global folder, path, check_filesystem - self.file_row = Adw.ActionRow() - self.file_row.set_title(_["periodic_saving_file"]) - self.file_row.set_subtitle(folder) - self.file_row.add_suffix(Gtk.Image.new_from_icon_name("network-wired-symbolic")) if "red" not in folder else None - self.file_row.set_subtitle_lines(8) - self.file_row.set_use_markup(True) - self.file_row.set_subtitle_selectable(True) - self.l_setdBox.append(self.file_row) - self.l_setdBox.append(self.ps_row) - - set_button_sensitive = settings["periodic-saving"] != "Never" and not os.path.exists(path) - if "red" in folder: - self.setDialog.set_response_enabled('ok', False) - [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", f"{DATA}/savedesktop-synchronization.sh"] if os.path.exists(path)] # remove these files if the periodic saving folder is not a cloud drive folder - if _["periodic_saving_file_err"] in folder: - self.setupButton = Gtk.Button.new_with_label(_["create"]) - self.setupButton.set_valign(Gtk.Align.CENTER) - self.setupButton.add_css_class("suggested-action") - self.setupButton.connect("clicked", make_pb_file) - self.file_row.add_suffix(self.setupButton) - make_pb_file(w) if self.auto_save_start else None # start creating the periodic saving file if the self.start_saving value is TRUE - if _["cloud_folder_err"] in folder: - self.lmButton = Gtk.Button.new_with_label(_["learn_more"]) - self.lmButton.set_valign(Gtk.Align.CENTER) - self.lmButton.add_css_class("suggested-action") - self.lmButton.connect("clicked", open_sync_link) - self.file_row.add_suffix(self.lmButton) - self.setDialog.set_body("") # set the body as empty after loading the periodic saving information - - # Check the file system of the periodic saving folder and their existation - def check_filesystem_fnc(): - global folder, path, check_filesystem - check_filesystem = subprocess.getoutput('df -T "%s" | awk \'NR==2 {print $2}\'' % settings["periodic-saving-folder"]) - - path = f'{settings["periodic-saving-folder"]}/{settings["filename-format"].replace(" ", "_")}.sd.zip' - - # Check if periodic saving is set to "Never" - if settings["periodic-saving"] == "Never": - folder = f'{_["pb_interval"]}: {_["never"]}' - # Check if the filesystem is not FUSE - elif ("gvfsd" not in check_filesystem and "rclone" not in check_filesystem) and not os.path.exists(f"{settings['periodic-saving-folder']}/.stfolder"): - folder = f'{_["cloud_folder_err"]}' - # Check if the periodic saving file exists - elif not os.path.exists(path): - folder = f'{_["periodic_saving_file_err"]}' - else: - folder = path - - update_gui() - - # save the SaveDesktop.json file to the periodic saving folder and set up the auto-mounting the cloud drive - def save_file(): - try: - open(f"{settings['periodic-saving-folder']}/SaveDesktop.json", "w").write('{\n "periodic-saving-interval": "%s",\n "filename": "%s"\n}' % (settings["periodic-saving"], settings["filename-format"])) - except Exception as e: - os.system(f"notify-send \'{_['err_occured']}\' '{e}'") - finally: - self.mount_type = "periodic-saving" - self.set_up_auto_mount() - - # Action after closing dialog for setting synchronization file - def setDialog_closed(w, response): - if response == 'ok': - self.open_setdialog_tf = False - - thread = Thread(target=save_file) - thread.start() - else: - self.open_setdialog_tf = False - - # Dialog itself - self.setDialog = Adw.AlertDialog.new() - self.setDialog.set_heading(_["set_up_sync_file"]) - self.setDialog.set_body(_["please_wait"]) - self.setDialog.set_body_use_markup(True) - self.setDialog.choose(self, None, None, None) - self.setDialog.add_response('cancel', _["cancel"]) - self.setDialog.add_response('ok', _["apply"]) - self.setDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) - self.setDialog.connect('response', setDialog_closed) - self.setDialog.present() - - # List Box for appending widgets - self.l_setdBox = Gtk.ListBox.new() - self.l_setdBox.set_selection_mode(Gtk.SelectionMode.NONE) - self.l_setdBox.get_style_context().add_class('boxed-list') - self.l_setdBox.set_size_request(-1, 160) - self.setDialog.set_extra_child(self.l_setdBox) - - # Check the synchronization matters - check_thread = Thread(target=check_filesystem_fnc) - check_thread.start() - - # Button for opening More options dialog - self.open_setdialog_tf = True # set this value to TRUE for expanding the Periodic saving row - self.ps_button = Gtk.Button.new_with_label(_["change"]) - self.ps_button.connect('clicked', self.more_options_dialog) - self.ps_button.set_valign(Gtk.Align.CENTER) - - # Row for showing the selected periodic saving interval - ## translate the periodic-saving key to the user language - pb = next((key for key, value in {_["never"]: "Never", _["daily"]: "Daily", _["weekly"]: "Weekly", _["monthly"]: "Monthly"}.items() if settings["periodic-saving"] == value), None) - self.ps_row = Adw.ActionRow.new() - self.ps_row.set_title(f'{_["periodic_saving"]} ({_["pb_interval"]})') - self.ps_row.set_use_markup(True) - self.ps_row.add_suffix(self.ps_button) - self.ps_row.set_subtitle(f'{_["never"]}' if settings["periodic-saving"] == "Never" - else f'{pb}') - self.ps_button.add_css_class('suggested-action') if settings["periodic-saving"] == "Never" else None - - # Update the Sync page after setting up synchronization - def _update_sync_page(self): - self.syncingBox.remove(self.syncPage) - self.sync_desktop() - return False - - # Dialog for selecting the cloud drive folder and periodic synchronization interval - def open_cloudDialog(self, w): - # reset the cloud folder selection to the default value - def reset_cloud_folder(w): - self.cfileRow.set_subtitle("") - self.cfileRow.remove(self.resetButton) - self.cloudDialog.set_response_enabled('ok', True) - settings["file-for-syncing"] = self.cfileRow.get_subtitle() - [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", f"{DATA}/savedesktop-synchronization.sh"] if os.path.exists(path)] - - # enable or disable the response of this dialog in depending on the selected periodic synchronization interval - def on_psync_changed(psyncRow, GParamObject): - self.cloudDialog.set_response_enabled('ok', not (self.psyncRow.get_selected_item().get_string() == _["never"] or not self.cfileRow.get_subtitle())) - - def call_automount(): - try: - check_filesystem = subprocess.getoutput('df -T "%s" | awk \'NR==2 {print $2}\'' % self.cfileRow.get_subtitle()) - if not "gvfsd" in check_filesystem: - if not "rclone" in check_filesystem: - if not os.path.exists(f"{self.cfileRow.get_subtitle()}/.stfolder"): - raise AttributeError(_["cloud_folder_err"]) - except Exception as e: - os.system(f'notify-send \'{_["err_occured"]}\' \'{e}\'') - finally: - settings["file-for-syncing"] = self.cfileRow.get_subtitle() - self.mount_type = "periodic-saving" - self.set_up_auto_mount() - - # Action after closing URL dialog - def cloudDialog_closed(w, response): - if response == 'ok': - self.check_psync = settings["periodic-import"] - # translate the periodic sync options to English - selected_item = self.psyncRow.get_selected_item() - sync = {_["never"]: "Never2", _["manually"]: "Manually2", _["daily"]: "Daily2", _["weekly"]: "Weekly2", _["monthly"]: "Monthly2"} - - sync_item = sync.get(selected_item.get_string(), "Never2") - - settings["periodic-import"] = sync_item - - # if the selected periodic saving interval is "Manually2", it enables the manually-sync value - settings["manually-sync"] = True and settings["periodic-import"] == "Manually2" - - # save the status of the Bidirectional Synchronization switch - settings["bidirectional-sync"] = self.bsSwitch.get_active() - - if self.cfileRow.get_subtitle(): - # check if the selected periodic sync interval was Never: if yes, shows the message about the necessity to log out of the system - if self.check_psync == "Never2": - if not settings["periodic-import"] == "Never2": - self.show_warn_toast() - - # if it is selected to manually sync, it creates an option in the app menu in the header bar - if settings["manually-sync"]: - self.sync_menu = Gio.Menu() - self.sync_menu.append(_["sync"], 'app.m-sync-with-key') - self.main_menu.prepend_section(None, self.sync_menu) - self.show_special_toast() - else: - try: - self.sync_menu.remove_all() - except: - pass - - check_thread = Thread(target=call_automount) - check_thread.start() - - # Dialog itself - self.cloudDialog = Adw.AlertDialog.new() - self.cloudDialog.set_heading(_["connect_cloud_storage"]) - self.cloudDialog.set_body(_["connect_cloud_storage_desc"]) - self.cloudDialog.choose(self, None, None, None) - self.cloudDialog.add_response('cancel', _["cancel"]) - self.cloudDialog.add_response('ok', _["apply"]) - self.cloudDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) - self.cloudDialog.connect('response', cloudDialog_closed) - self.cloudDialog.present() - - # Box for adding widgets in this dialog - self.cloudBox = Gtk.ListBox.new() - self.cloudBox.set_selection_mode(mode=Gtk.SelectionMode.NONE) - self.cloudBox.get_style_context().add_class(class_name='boxed-list') - self.cloudBox.set_size_request(-1, 400) - self.cloudDialog.set_extra_child(self.cloudBox) - - # Row and buttons for selecting the cloud drive folder - ## button for selecting the cloud drive folder - self.cloudButton = Gtk.Button.new_from_icon_name("document-open-symbolic") - self.cloudButton.add_css_class('flat') - self.cloudButton.set_valign(Gtk.Align.CENTER) - self.cloudButton.set_tooltip_text(_["set_another"]) - self.cloudButton.connect("clicked", self.select_folder_to_sync) - - ## button for reseting the selected cloud drive folder - self.resetButton = Gtk.Button.new_from_icon_name("view-refresh-symbolic") - self.resetButton.add_css_class('destructive-action') - self.resetButton.connect("clicked", reset_cloud_folder) - self.resetButton.set_tooltip_text(_["reset_button"]) - self.resetButton.set_valign(Gtk.Align.CENTER) - - ## the row itself - self.cfileRow = Adw.ActionRow.new() - self.cfileRow.add_suffix(self.resetButton) if not settings["file-for-syncing"] == "" else None - self.cfileRow.set_title(_["select_cloud_folder_btn"]) - self.cfileRow.set_subtitle(settings["file-for-syncing"]) - self.cfileRow.set_subtitle_selectable(True) - self.cfileRow.add_suffix(self.cloudButton) - self.cfileRow.set_activatable_widget(self.cloudButton) - self.cloudBox.append(self.cfileRow) - - if not self.cfileRow.get_subtitle(): - self.cloudDialog.set_response_enabled('ok', False) - else: - self.cloudDialog.set_response_enabled('ok', True) - - # Periodic sync section - options = Gtk.StringList.new(strings=[ - _["never"], _["manually"], _["daily"], _["weekly"], _["monthly"] - ]) - - self.psyncRow = Adw.ComboRow.new() - self.psyncRow.set_use_markup(True) - self.psyncRow.set_use_underline(True) - self.psyncRow.set_title(_["periodic_sync"]) - self.psyncRow.set_title_lines(2) - self.psyncRow.set_model(model=options) - self.psyncRow.connect('notify::selected-item', on_psync_changed) - self.cloudBox.append(self.psyncRow) - - # Load periodic sync values form GSettings database - old_psync = settings["periodic-import"] - if settings["periodic-import"] == "Never2": - self.psyncRow.set_selected(0) - elif settings["periodic-import"] == "Manually2": - self.psyncRow.set_selected(1) - elif settings["periodic-import"] == "Daily2": - self.psyncRow.set_selected(2) - elif settings["periodic-import"] == "Weekly2": - self.psyncRow.set_selected(3) - elif settings["periodic-import"] == "Monthly2": - self.psyncRow.set_selected(4) - - # Bidirectional Synchronization section - ## Switch - self.bsSwitch = Gtk.Switch.new() - if settings["bidirectional-sync"] == True: - self.bsSwitch.set_active(True) - self.bsSwitch.set_valign(Gtk.Align.CENTER) - - ## Action Row - self.bsyncRow = Adw.ActionRow.new() - self.bsyncRow.set_title(_["bidirectional_sync"]) - self.bsyncRow.set_subtitle(_["bidirectional_sync_desc"]) - self.bsyncRow.set_title_lines(2) - self.bsyncRow.add_suffix(self.bsSwitch) - self.bsyncRow.set_activatable_widget(self.bsSwitch) - self.cloudBox.append(self.bsyncRow) - - # set up auto-mounting of the cloud drives after logging in to the system - def set_up_auto_mount(self): - if self.mount_type == "periodic-saving": - cfile_subtitle = settings["periodic-saving-folder"] - elif self.mount_type == "cloud-receiver": - cfile_subtitle = settings["file-for-syncing"] - else: - cfile_subtitle = "none" - - if not cfile_subtitle == "none": - if "gvfs" in cfile_subtitle: - pattern = r'.*/gvfs/([^:]*):host=([^,]*),user=([^/]*).*' if "google-drive" in cfile_subtitle else r'.*/gvfs/([^:]+):host=([^,]+),user=([^/]+)' if "onedrive" in cfile_subtitle else r'.*/gvfs/([^:]*):host=([^,]*),ssl=([^,]*),user=([^,]*),prefix=([^/]*).*' - - match = re.search(pattern, cfile_subtitle) - - if match: - if "google-drive" in cfile_subtitle: # Google Drive - cloud_service = match.group(1) # cloud_service for Google Drive - host = match.group(2) # host for Google Drive - user = match.group(3) - ssl = None # ssl is not relevant for Google Drive - prefix = None # prefix is not relevant for Google Drive - cmd = f"gio mount {cloud_service}://{user}@{host}" # command for Google Drive - elif "onedrive" in cfile_subtitle: # OneDrive - cloud_service = match.group(1) # cloud_service for OneDrive - host = match.group(2) # host for OneDrive - user = match.group(3) # user is not relevant for OneDrive - ssl = None # ssl is not relevant for OneDrive - prefix = None # prefix is not relevant for OneDrive - cmd = f"gio mount {cloud_service}://{user}@{host}" # command for OneDrive - elif "dav" in cfile_subtitle: # DAV - cloud_service = match.group(1) # cloud_service for DAV - host = match.group(2) # host for DAV - ssl = match.group(3) # ssl for DAV - user = match.group(4) # user for DAV - if match.group(5): # prefix for DAV - prefix_old = match.group(5) - prefix = re.sub(r'gio mount |%2F', '/', prefix_old).replace('//', '').strip() # Replace 2%F with / - else: - prefix = "" - fm = "nautilus" if not self.environment == "Cinnamon" else "nemo" - cmd = """output=$(secret-tool lookup object Nextcloud) && output="Positive signal" || output="Negative signal" -if [[ "$output" == "Positive signal" ]]; then - gio mount davs://%s@%s%s -else - %s davs://%s@%s%s -fi""" % (user, host, prefix, fm, user, host, prefix) - else: - extracted_values = { - "cloud_service": cloud_service, - "host": host, - "user": user, - "prefix": prefix, - "cmd": cmd - } - elif os.path.exists(f"{cfile_subtitle}/.stfolder"): - cmd = "" - else: - cmd = f"rclone mount {cfile_subtitle.split('/')[-1]}: {cfile_subtitle}" if not os.path.exists(f"{download_dir}/SaveDesktop/rclone_drive") else f"rclone mount savedesktop: {download_dir}/SaveDesktop/rclone_drive" - synchronization_content = f'#!/usr/bin/bash\n{cmd}\nsleep 60s\n{sync_cmd}\n{periodic_saving_cmd}' - if flatpak: - synchronization_content += f'\npython3 {CACHE}/install_flatpak_from_script.py' - with open(f"{DATA}/savedesktop-synchronization.sh", "w") as f: - f.write(synchronization_content) - os.makedirs(f'{home}/.config/autostart', exist_ok=True) - open(f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.sync.desktop", "w").write(f"[Desktop Entry]\nName=SaveDesktop (Synchronization)\nType=Application\nExec=sh {DATA}/savedesktop-synchronization.sh") - [os.remove(path) for path in [f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Backup.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.MountDrive.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.server.desktop", f"{home}/.config/autostart/io.github.vikdevelop.SaveDesktop.Flatpak.desktop"] if os.path.exists(path)] - else: - raise AttributeError("There aren't possible to get values from the periodic-saving-folder or file-for-syncing strings") - - # Select folder for periodic backups (Gtk.FileDialog) - def select_pb_folder(self, w): - def save_selected(source, res, data): - try: - folder = source.select_folder_finish(res) - except: - return - self.folder_pb = folder.get_path() - settings["periodic-saving-folder"] = self.folder_pb if settings["first-synchronization-setup"] else settings["periodic-saving-folder"] - self.dirRow.set_subtitle(f"{self.folder_pb}") if hasattr(self, 'dirRow') else None - - self.pb_chooser = Gtk.FileDialog.new() - self.pb_chooser.set_modal(True) - self.pb_chooser.set_title(_["set_pb_folder_tooltip"]) - self.pb_chooser.select_folder(self, None, save_selected, None) - - # Select folder for saving configuration - def select_folder(self, w): - def save_selected(source, res, data): - try: - folder = source.select_folder_finish(res) - except: - return - self.folder = folder.get_path() - if settings["enable-encryption"] == True: - self.create_password_dialog() - else: - self.save_config() - - if self.saveEntry.get_text() == "": - self.filename_text = "config" - else: - if " " in self.saveEntry.get_text(): - self.with_spaces_text = self.saveEntry.get_text() - self.filename_text = self.with_spaces_text.replace(" ", "_") - else: - self.filename_text = f'{self.saveEntry.get_text()}' - - self.folderchooser = Gtk.FileDialog.new() - self.folderchooser.set_modal(True) - self.folderchooser.set_title(_["save_config"]) - self.folderchooser.select_folder(self, None, save_selected, None) - - # Select a ZIP or TAR.GZ file to import - def select_file_to_import(self, w): - # Show a "Please wait" pop-up window while checking the archive type - def show_please_wait_toast(): - wait_toast = Adw.Toast.new(title=_["please_wait"]) - wait_toast.set_timeout(10) - self.toast_overlay.add_toast(wait_toast) - - # Check, if the archive is encrypted or not - def get_status_of_encryption(): - self.is_folder = False - try: - status = any(z.flag_bits & 0x1 for z in zipfile.ZipFile(self.import_file).infolist() if not z.filename.endswith("/")) - except: - status = False - if status == True: - GLib.idle_add(self.check_password_dialog) - else: - self.import_config() - - # Get path from the dialog - def open_selected(source, res, data): - try: - file = source.open_finish(res) - except: - return - self.import_file = file.get_path() - show_please_wait_toast() - check_thread = Thread(target=get_status_of_encryption) - check_thread.start() - - self.file_chooser = Gtk.FileDialog.new() - self.file_chooser.set_modal(True) - self.file_chooser.set_title(_["import_config"]) - self.file_filter = Gtk.FileFilter.new() - self.file_filter.set_name(_["savedesktop_f"]) - self.file_filter.add_pattern('*.sd.tar.gz') - self.file_filter.add_pattern('*.sd.zip') - self.file_filter_list = Gio.ListStore.new(Gtk.FileFilter); - self.file_filter_list.append(self.file_filter) - self.file_chooser.set_filters(self.file_filter_list) - self.file_chooser.open(self, None, open_selected, None) - - # Select folder to import configuration - def select_folder_to_import(self, w): - def import_selected(source, res, data): - try: - folder = source.select_folder_finish(res) - except: - return - self.import_folder = folder.get_path() - self.is_folder = True if os.path.exists(f"{self.import_folder}/.folder.sd") else False - self.import_config() - - self.file_chooser = Gtk.FileDialog.new() - self.file_chooser.set_modal(True) - self.file_chooser.set_title(_["import_config"]) - self.file_chooser.select_folder(self, None, import_selected, None) - - # Select folder for syncing the configuration with other computers in the network - def select_folder_to_sync(self, w): - def set_selected(source, res, data): - try: - folder = source.select_folder_finish(res) - except: - return - self.sync_folder = folder.get_path() - settings["file-for-syncing"] = self.sync_folder if settings["first-synchronization-setup"] else settings["file-for-syncing"] - self.cfileRow.set_subtitle(self.sync_folder) if hasattr(self, 'cfileRow') else None - if hasattr(self, 'cloudDialog'): - self.cloudDialog.set_response_enabled('ok', True) if not self.psyncRow.get_selected_item().get_string() == _["never"] else None - - self.sync_folder_chooser = Gtk.FileDialog.new() - self.sync_folder_chooser.set_modal(True) - self.sync_folder_chooser.set_title(_["select_cloud_folder_btn"]) - self.sync_folder_chooser.select_folder(self, None, set_selected, None) - - # Get a password from the {DATA}/password file - def get_password_from_file(self): - if os.path.exists(f"{DATA}/password"): - p = PasswordStore() - self.password = p.password - else: - self.password = "" - - # Dialog for creating password for the config archive - def create_password_dialog(self): - # Action after closing pswdDialog - def pswdDialog_closed(w, response): - if response == 'ok': - self.password = self.pswdEntry.get_text() - self.save_config() - - # Check the password to see if it meets the criteria - def check_password(pswdEntry): - password = self.pswdEntry.get_text() - criteria = [ - (len(password) < 12, "The password is too short. It should has at least 12 characters"), - (not re.search(r'[A-Z]', password), "The password should has at least one capital letter"), - (not re.search(r'[a-z]', password), "The password should has at least one lowercase letter"), - (not re.search(r'[-_@.:,+=]', password), "The password should has at least one special character"), - (" " in password, "The password must not contain spaces") - ] - - for condition, message in criteria: - if condition: - self.pswdDialog.set_response_enabled("ok", False) - print(message) - return - - self.pswdDialog.set_response_enabled("ok", True) - - # Generate Password - def pswd_generator(w): - safe = "-_@.:,+=" - allc = safe + string.ascii_letters + string.digits - password = [random.choice(safe), random.choice(string.ascii_letters), random.choice(string.digits)] + \ - [random.choice(allc) for _ in range(21)] - random.shuffle(password) - password = ''.join(password) - self.pswdEntry.set_text(password) - - # Dialog itself - self.pswdDialog = Adw.AlertDialog.new() - self.pswdDialog.set_heading(_["create_pwd_title"]) - self.pswdDialog.set_body(_["create_pwd_desc"]) - self.pswdDialog.choose(self, None, None, None) - self.pswdDialog.add_response("cancel", _["cancel"]) - self.pswdDialog.add_response("ok", _["apply"]) - self.pswdDialog.set_response_enabled("ok", False) - self.pswdDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) - self.pswdDialog.connect('response', pswdDialog_closed) - self.pswdDialog.present() - - # Button for generating strong password - self.pswdgenButton = Gtk.Button.new_from_icon_name("dialog-password-symbolic") - self.pswdgenButton.set_tooltip_text(_["gen_password"]) - self.pswdgenButton.add_css_class("flat") - self.pswdgenButton.set_valign(Gtk.Align.CENTER) - self.pswdgenButton.connect("clicked", pswd_generator) - - # entry for entering password - self.pswdEntry = Adw.PasswordEntryRow.new() - self.pswdEntry.set_title(_["password_entry"]) - self.pswdEntry.connect('changed', check_password) - self.pswdEntry.add_suffix(self.pswdgenButton) - self.pswdDialog.set_extra_child(self.pswdEntry) - - # Save configuration - def save_config(self): - self.please_wait_save() - save_thread = Thread(target=self.start_saving) - save_thread.start() - - # start process of saving the configuration - def start_saving(self): - try: - e_o = False - # Cleanup the cache dir before importing - print("Cleaning up the cache directory") - save_cache_dir = f"{CACHE}/save_config" - try: - shutil.rmtree(save_cache_dir) - except: - pass - os.makedirs(save_cache_dir, exist_ok=True) - os.chdir(save_cache_dir) - subprocess.run(["python3", f"{system_dir}/config.py", "--save"], check=True) - - print("Creating and moving the configuration archive or folder to the user-defined directory") - - if settings["save-without-archive"]: - open(f"{CACHE}/save_config/.folder.sd", "w").close() - shutil.move(f"{CACHE}/save_config", f"{self.folder}/{self.filename_text}") - else: - cmd = ['7z', 'a', '-tzip', '-mx=3', '-x!*.zip', '-x!saving_status', 'cfg.sd.zip', '.'] - if settings["enable-encryption"]: - cmd.insert(4, "-mem=AES256") - cmd.insert(5, f"-p{self.password}") - - proc = subprocess.run(cmd, capture_output=True, text=True) - - if proc.returncode not in (0, 1): - # 0 = everything is OK, 1 = warning (e.g. file not found) - raise OSError(f"7z failed: {proc.stderr}") - else: - print("7z finished with warnings:", proc.stderr) - - shutil.copyfile('cfg.sd.zip', f"{self.folder}/{self.filename_text}.sd.zip") - - print("Configuration saved successfully.") - - except Exception as e: - e_o = True - GLib.idle_add(self.show_err_msg, e) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(self.switcher_title.get_title_visible()) - self.toolbarview.set_content(self.headapp) - finally: - if not e_o: - GLib.idle_add(self.exporting_done) - - # "Please wait" information page on the "Save" page - def please_wait_save(self): - # Stop saving configuration - def cancel_save(w): - os.popen(f"pkill -xf 'python3 {system_dir}/config.py --save'") - os.popen(f"pkill -9 7z") - self.toolbarview.set_content(self.headapp) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(True if self.switcher_title.get_title_visible() else False) - self.set_title("Save Desktop") - for widget in [self.savewaitSpinner, self.savewaitLabel, self.savewaitButton, self.sdoneImage, self.opensaveButton, self.backtomButton]: - self.savewaitBox.remove(widget) - - self.headerbar.set_title_widget(None) - self.switcher_bar.set_reveal(False) - - # Create box widget for this page - self.savewaitBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.savewaitBox.set_halign(Gtk.Align.CENTER) - self.savewaitBox.set_valign(Gtk.Align.CENTER) - self.toolbarview.set_content(self.savewaitBox) - - # Set bold title - self.set_title(_["saving_config_status"].split('
    ')[0].split('')[-1]) - - # Create spinner for this page - self.savewaitSpinner = Gtk.Spinner.new() - self.savewaitSpinner.set_size_request(100, 100) - self.savewaitSpinner.start() - self.savewaitBox.append(self.savewaitSpinner) - - # Prepare Gtk.Image widget for the next page - self.sdoneImage = Gtk.Image.new() - self.savewaitBox.append(self.sdoneImage) - - # Use "sd.zip" if Archive Encryption is enabled - status_old = _["saving_config_status"] - status = status_old.replace("sd.tar.gz", "sd.zip") if not settings["save-without-archive"] else status_old.replace("sd.tar.gz", "") - - # Create label about selected directory for saving the configuration - self.savewaitLabel = Gtk.Label.new(str=status.format(self.folder, self.filename_text)) - self.savewaitLabel.set_use_markup(True) - self.savewaitLabel.set_justify(Gtk.Justification.CENTER) - self.savewaitLabel.set_wrap(True) - self.savewaitBox.append(self.savewaitLabel) - - # Create button for cancel saving configuration - self.savewaitButton = Gtk.Button.new_with_label(_["cancel"]) - self.savewaitButton.add_css_class("pill") - self.savewaitButton.add_css_class("destructive-action") - self.savewaitButton.connect("clicked", cancel_save) - self.savewaitButton.set_valign(Gtk.Align.CENTER) - self.savewaitButton.set_halign(Gtk.Align.CENTER) - self.savewaitBox.append(self.savewaitButton) - - # config has been saved action - def exporting_done(self): - # back to the previous page from this page - def back_to_main(w): - self.toolbarview.set_content(self.headapp) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(True if self.switcher_title.get_title_visible() else False) - self.set_title("Save Desktop") - for widget in [self.savewaitSpinner, self.savewaitLabel, self.savewaitButton, self.sdoneImage, self.opensaveButton, self.backtomButton]: - self.savewaitBox.remove(widget) - - # send notification about saved configuration if application window is inactive only - self.notification_save = Gio.Notification.new("SaveDesktop") - self.notification_save.set_body(_["config_saved"]) - active_window = app.get_active_window() - if active_window is None or not active_window.is_active(): - app.send_notification(None, self.notification_save) - - # stop spinner animation - self.savewaitSpinner.stop() - self.savewaitBox.remove(self.savewaitButton) - - # set title to "Configuration has been saved!" - self.set_title(_['config_saved']) - - # use widget for showing done.svg icon - self.sdoneImage.set_from_icon_name("done") - self.sdoneImage.set_pixel_size(128) - - # edit label for the purposes of this page - self.savewaitLabel.set_label(_["config_saved_desc"].format(_['config_saved'])) - self.opensaveButton = Gtk.Button.new_with_label(_["open_folder"]) - self.opensaveButton.add_css_class('pill') - self.opensaveButton.add_css_class('suggested-action') - self.opensaveButton.set_action_name("app.open_dir") - self.opensaveButton.set_valign(Gtk.Align.CENTER) - self.opensaveButton.set_halign(Gtk.Align.CENTER) - self.savewaitBox.append(self.opensaveButton) - - # create button for backing to the previous page - self.backtomButton = Gtk.Button.new_with_label(_["back_to_page"]) - self.backtomButton.connect("clicked", back_to_main) - self.backtomButton.add_css_class("pill") - self.backtomButton.set_valign(Gtk.Align.CENTER) - self.backtomButton.set_halign(Gtk.Align.CENTER) - self.savewaitBox.append(self.backtomButton) - - # dialog for entering password of the archive - def check_password_dialog(self): - # action after closing dialog for checking password - def checkDialog_closed(w, response): - if response == 'ok': - self.checkDialog.set_response_enabled("ok", False) - self.import_config() - - # Dialog itself - self.checkDialog = Adw.AlertDialog.new() - self.checkDialog.set_heading(_["check_pwd_title"]) - self.checkDialog.set_body(_["check_pwd_desc"]) - self.checkDialog.choose(self, None, None, None) - self.checkDialog.add_response("cancel", _["cancel"]) - self.checkDialog.add_response("ok", _["apply"]) - self.checkDialog.set_response_appearance('ok', Adw.ResponseAppearance.SUGGESTED) - self.checkDialog.connect('response', checkDialog_closed) - self.checkDialog.present() - - self.checkEntry = Adw.PasswordEntryRow.new() - self.checkEntry.set_title(_["password_entry"]) - self.checkDialog.set_extra_child(self.checkEntry) - - # Import configuration - def import_config(self): - self.please_wait_import() - import_thread = Thread(target=self.start_importing) - import_thread.start() - - def start_importing(self): - try: - e_o = False - - # Cleanup the cache dir before importing - print("Cleaning up the cache directory") - imp_cache_dir = f"{CACHE}/import_config" - try: - shutil.rmtree(imp_cache_dir) - except: - pass - os.makedirs(imp_cache_dir, exist_ok=True) - os.chdir(imp_cache_dir) - - # Create a txt file to prevent removing the cache's content after closing the app window - open("import_status", "w").close() - - # Check, if the input is folder or not - if self.is_folder: - shutil.copytree(self.import_folder, f"{CACHE}/import_config", - dirs_exist_ok=True, ignore_dangling_symlinks=True) - else: - if ".sd.zip" in self.import_file: - try: - password = getattr(self.checkEntry, "get_text", lambda: None)() - except: - password = None - - if password: - try: - subprocess.run( - ['7z', 'e', '-so', f'-p{password}' if password else '', self.import_file, 'dconf-settings.ini'], - capture_output=True, text=True, check=True - ) - except subprocess.CalledProcessError as e: - first_error = next((l for l in e.stderr.splitlines() if "Wrong password" in l), None) - raise ValueError(first_error or "Wrong password") - print("Checking password is completed.") - - subprocess.run( - ['7z', 'x', '-y', f'-p{password}', self.import_file, f'-o{CACHE}/import_config'], - capture_output=False, text=True, check=True - ) - - elif ".sd.tar.gz" in self.import_file: - subprocess.run(["tar", "-xzf", self.import_file, "-C", f"{CACHE}/import_config"], - capture_output=True, text=True, check=True) - - self.replace_home_in_files(".", home) - subprocess.run(["python3", f"{system_dir}/config.py", "--import_"], check=True) - - if all(not os.path.exists(p) for p in [ - f"{CACHE}/import_config/app", - f"{CACHE}/import_config/installed_flatpaks.sh", - f"{CACHE}/import_config/installed_user_flatpaks.sh" - ]): - os.remove("import_status") - - print("Configuration imported successfully.") - - except Exception as e: - e_o = True - GLib.idle_add(self.show_err_msg, e) - self.toolbarview.set_content(self.headapp) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(self.switcher_title.get_title_visible()) - finally: - if not e_o: - GLib.idle_add(self.applying_done) - - # Replace original /home/$USER path with actual path in the dconf-settings.ini file and other XML files - def replace_home_in_files(self, root, home, patterns=(".xml", ".ini")): - regex = re.compile(r"/home/[^/]+/") - for dirpath, _, filenames in os.walk(root): - for filename in filenames: - if filename.endswith(patterns): - path = os.path.join(dirpath, filename) - with open(path, "r", encoding="utf-8") as f: - text = f.read() - new_text = regex.sub(f"{home}/", text) - if new_text != text: - with open(path, "w", encoding="utf-8") as f: - f.write(new_text) - print(f"Updated /home/$USER path in: {path}") - - # "Please wait" information on the "Import" page - def please_wait_import(self): - # Stop importing configuration - def cancel_import(w): - os.popen("pkill -9 7z") - os.popen("pkill -9 tar") - os.popen(f"pkill -xf 'python3 {system_dir}/config.py --import_'") - self.toolbarview.set_content(self.headapp) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(True if self.switcher_title.get_title_visible() else False) - self.set_title("Save Desktop") - for widget in [self.importwaitSpinner, self.importwaitLabel, self.importwaitButton, self.idoneImage, self.logoutButton, self.backtomButton]: - self.importwaitBox.remove(widget) - - # Add new headerbar for this page - self.headerbar.set_title_widget(None) - self.switcher_bar.set_reveal(False) - - # Create box widget for this page - self.importwaitBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.importwaitBox.set_halign(Gtk.Align.CENTER) - self.importwaitBox.set_valign(Gtk.Align.CENTER) - self.toolbarview.set_content(self.importwaitBox) - - # Set bold title - self.set_title(_["importing_config_status"].split('')[0].split('')[-1]) - - # Create spinner for this page - self.importwaitSpinner = Gtk.Spinner.new() - self.importwaitSpinner.set_size_request(100, 100) - self.importwaitSpinner.start() - self.importwaitBox.append(self.importwaitSpinner) - - # Prepare Gtk.Image widget for this page - self.idoneImage = Gtk.Image.new() - self.importwaitBox.append(self.idoneImage) - - # Create label about configuration archive name - try: - self.importwaitLabel = Gtk.Label.new(str=_["importing_config_status"].format(self.import_file)) - except: - self.importwaitLabel = Gtk.Label.new(str=_["importing_config_status"].format(self.import_folder)) - self.importwaitLabel.set_use_markup(True) - self.importwaitLabel.set_justify(Gtk.Justification.CENTER) - self.importwaitLabel.set_wrap(True) - self.importwaitBox.append(self.importwaitLabel) - - # Create button for canceling importing configuration - self.importwaitButton = Gtk.Button.new_with_label(_["cancel"]) - self.importwaitButton.add_css_class("pill") - self.importwaitButton.add_css_class("destructive-action") - self.importwaitButton.connect("clicked", cancel_import) - self.importwaitButton.set_halign(Gtk.Align.CENTER) - self.importwaitButton.set_valign(Gtk.Align.CENTER) - self.importwaitBox.append(self.importwaitButton) - - # Config has been imported action - def applying_done(self): - # back to the previous page from this page - def back_to_main(w): - self.toolbarview.set_content(self.headapp) - self.headerbar.set_title_widget(self.switcher_title) - self.switcher_bar.set_reveal(True if self.switcher_title.get_title_visible() else False) - self.set_title("Save Desktop") - [self.importwaitBox.remove(widget) for widget in [self.importwaitSpinner, self.importwaitLabel, self.importwaitButton, self.idoneImage, self.logoutButton, self.backtomButton]] - if hasattr(self, 'flistBox'): - self.pBox.remove(self.flistBox) - - # send notification about imported configuration if application window is inactive only - self.notification_import = Gio.Notification.new("Save Desktop") - self.notification_import.set_body(_["config_imported"]) - active_window = app.get_active_window() - if active_window is None or not active_window.is_active(): - app.send_notification(None, self.notification_import) - - # stop spinner animation - self.importwaitSpinner.stop() - self.importwaitBox.remove(self.importwaitButton) - - # set title to "Configuration has been applied!" - self.set_title(_['config_imported']) - - # widget for showing done.svg icon - self.idoneImage.set_from_icon_name("done") - self.idoneImage.set_pixel_size(128) - - # edit label for the purposes of this page - self.importwaitLabel.set_label(_["config_imported_desc"].format(_['config_imported'])) - - # create button for loging out of the system - self.logoutButton = Gtk.Button.new_with_label(_["logout"]) - self.logoutButton.add_css_class('pill') - self.logoutButton.add_css_class('suggested-action') - self.logoutButton.set_halign(Gtk.Align.CENTER) - self.logoutButton.set_valign(Gtk.Align.CENTER) - self.logoutButton.set_action_name("app.logout") - self.importwaitBox.append(self.logoutButton) if not (flatpak and self.environment == "Hyprland") else None - - # create button for backing to the previous page - self.backtomButton = Gtk.Button.new_with_label(_["back_to_page"]) - self.backtomButton.connect("clicked", back_to_main) - self.backtomButton.add_css_class("pill") - self.backtomButton.set_halign(Gtk.Align.CENTER) - self.backtomButton.set_valign(Gtk.Align.CENTER) - self.importwaitBox.append(self.backtomButton) - - # show message dialog in the error case - def show_err_msg(self, error): - error_str = str(error) - if "died" in error_str: - return - - self.errDialog = Adw.AlertDialog.new() - self.errDialog.choose(self, None, None, None) - self.errDialog.set_heading(heading=_["err_occured"]) - self.errDialog.set_body(body=f"{error_str}") - self.errDialog.add_response('cancel', _["cancel"]) - self.errDialog.present() - - # a warning indicating that the user must log out - def show_warn_toast(self): - self.warn_toast = Adw.Toast.new(title=_["periodic_saving_desc"]) - self.warn_toast.set_button_label(_["logout"]) - self.warn_toast.set_action_name("app.logout") - self.toast_overlay.add_toast(self.warn_toast) - - # message that says where will be run a synchronization - def show_special_toast(self): - self.special_toast = Adw.Toast.new(title=_["m_sync_desc"]) - self.toast_overlay.add_toast(self.special_toast) - - # action after closing the main window - def on_close(self, w): - self.close() - # Save window size, state, and filename - settings["window-size"] = self.get_default_size() - settings["maximized"] = self.is_maximized() - settings["filename"] = self.saveEntry.get_text() - - # Check for ongoing operations before clearing cache - if any(os.path.exists(f"{CACHE}/{path}") for path in ["import_config/import_status", "syncing/sync_status", "periodic_saving/saving_status"]): - print("saving/importing/syncing configuration in progress...") - else: - os.popen(f"rm -rf {CACHE}/* {CACHE}/.*") - -class MyApp(Adw.Application): - def __init__(self, **kwargs): - super().__init__(**kwargs, flags=Gio.ApplicationFlags.FLAGS_NONE, - application_id="io.github.vikdevelop.SaveDesktop" if not snap else None) - self.create_action('m-sync-with-key', self.sync_pc, ["s"] if settings["manually-sync"] else None) - self.create_action('save-config', self.call_saving_config, ["s"]) - self.create_action('import-config', self.call_importing_config, ["o"]) - self.create_action('ms-dialog', self.call_ms_dialog, ["m"]) - self.create_action('items-dialog', self.call_items_dialog, ["i"]) - self.create_action('set-dialog', self.call_setDialog, ["f"]) - self.create_action('cloud-dialog', self.call_cloudDialog, ["c"]) - self.create_action('open-wiki', self.open_wiki, ["F1"]) - self.create_action('quit', self.app_quit, ["q", "w"]) - self.create_action('shortcuts', self.shortcuts, ["question"]) - self.create_action('logout', self.logout) - self.create_action('open_dir', self.open_dir) - self.create_action('about', self.on_about_action) - self.connect('activate', self.on_activate) - - # Synchronize configuation manually after clicking on the "Sync" button in the header bar menu - def sync_pc(self, action, param): - os.system(f'notify-send "{_["please_wait"]}"') - os.system(f"echo > {CACHE}/.from_app") - self.sync_m = GLib.spawn_command_line_async(f"python3 {system_dir}/synchronization.py") - - # Start saving the configuration using Ctrl+S keyboard shortcut - def call_saving_config(self, action, param): - self.win.select_folder(w="") - - # Start importing the configuration using Ctrl+I keyboard shortcut - def call_importing_config(self, action, param): - self.win.select_file_to_import(w="") - - # Open the More options dialog using Ctrl+Shift+M keyboard shortcut - def call_ms_dialog(self, action, param): - self.win.more_options_dialog(w="") - self.win.msDialog.present() - - # Open the "Items to include in the configuration archive" dialog using Ctrl+Shift+I keyboard shortcut - def call_items_dialog(self, action, param): - self.win.items_dialog(w="") - - # Open the "Set up the sync file" dialog using Ctrl+Shift+S keyboard shortcut - def call_setDialog(self, action, param): - if not snap: - self.win.open_setDialog(w="set-button") if not settings["first-synchronization-setup"] else self.win.open_initsetupDialog(w="set-button") - - # Open the "Connect to the cloud drive" dialog using Ctrl+Shift+C keyboard shortcut - def call_cloudDialog(self, action, param): - if not snap: - self.win.open_cloudDialog(w="get-button") if not settings["first-synchronization-setup"] else self.win.open_initsetupDialog(w="get-button") - - # Open the application wiki using F1 keyboard shortcut - def open_wiki(self, action, param): - os.system("xdg-open https://vikdevelop.github.io/SaveDesktop/wiki") - - # Action after closing the application using Ctrl+Q keyboard shortcut - def app_quit(self, action, param): - self.win.on_close(w="") - self.quit() - - # Show Keyboard Shortcuts window - def shortcuts(self, action, param): - ShortcutsWindow(transient_for=self.get_active_window()).present() - - # log out of the system after clicking on the "Log Out" button - def logout(self, action, param): - if snap: - os.system("dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.TerminateSession string:$(dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.ListSessions | awk -F 'string \"' '/string \"/ {print $2; exit}' | awk -F '\"' '{print $1}')") - else: - if self.win.environment == 'Xfce': - os.system("dbus-send --print-reply --session --dest=org.xfce.SessionManager /org/xfce/SessionManager org.xfce.Session.Manager.Logout boolean:true boolean:false") - elif self.win.environment == 'KDE Plasma': - os.system("dbus-send --print-reply --session --dest=org.kde.LogoutPrompt /LogoutPrompt org.kde.LogoutPrompt.promptLogout") - elif self.win.environment == 'COSMIC (New)': - os.system("dbus-send --print-reply --session --dest=com.system76.CosmicSession --type=method_call /com/system76/CosmicSession com.system76.CosmicSession.Exit") - elif self.win.environment == 'Hyprland': - os.system("hyprctl dispatch exit") - else: - os.system("gdbus call --session --dest org.gnome.SessionManager --object-path /org/gnome/SessionManager --method org.gnome.SessionManager.Logout 1") - - # open a directory with created configuration archive after clicking on the "Open the folder" button - def open_dir(self, action, param): - if settings["save-without-archive"]: - path = f"{self.win.folder}/{self.win.filename_text}" - else: - path = f"{self.win.folder}/{self.win.filename_text}.sd.zip" - - Gtk.FileLauncher.new(Gio.File.new_for_path(path)).open_containing_folder() - - # "About app" dialog - def on_about_action(self, action, param): - dialog = Adw.AboutDialog() - dialog.set_application_name("Save Desktop") - dialog.set_developer_name("vikdevelop") - dialog.set_comments(_["summary"]) - r_lang != "en" and dialog.set_translator_credits(_["translator_credits"]) # add the translator credits section if the system language is not English - dialog.add_link("Save Desktop Github Wiki (Weblate)", "https://hosted.weblate.org/projects/vikdevelop/savedesktop-github-wiki/") # add a link to translate the SaveDesktop Github wiki on Weblate - dialog.set_license_type(Gtk.License(Gtk.License.GPL_3_0)) - dialog.set_website("https://vikdevelop.github.io/SaveDesktop") - dialog.set_issue_url("https://github.com/vikdevelop/SaveDesktop/issues") - dialog.add_link("Flathub Beta", "https://github.com/vikdevelop/savedesktop?tab=readme-ov-file#1-flathub-beta") if flatpak else dialog.add_link("Snap Beta", "https://github.com/vikdevelop/savedesktop?tab=readme-ov-file#2-snap") if snap else None # add a link to download the beta version of SaveDesktop - dialog.set_copyright("© 2023-2025 vikdevelop") - dialog.set_developers(["vikdevelop https://github.com/vikdevelop"]) - dialog.set_artists(["Brage Fuglseth"]) - dialog.set_version(version) - dialog.set_application_icon(icon) - dialog.set_release_notes(rel_notes) - dialog.present(app.get_active_window()) - - # create Gio actions for opening the folder, logging out of the system, etc. - def create_action(self, name, callback, shortcuts=None): - action = Gio.SimpleAction.new(name, None) - action.connect('activate', callback) - self.add_action(action) - if shortcuts: - self.set_accels_for_action(f'app.{name}', shortcuts) - - # Show the main window of the application - def on_activate(self, app): - self.win = MainWindow(application=app) - self.win.present() - -app = MyApp() -app.run(sys.argv) diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 00000000..46a5e60c --- /dev/null +++ b/src/meson.build @@ -0,0 +1,43 @@ +pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() +moduledir = pkgdatadir / 'savedesktop' +localedir = join_paths(get_option('prefix'), get_option('localedir')) + +gnome = import('gnome') +python = import('python') + +# === GResource === +gnome.compile_resources( + 'savedesktop', + 'savedesktop.gresource.xml', + gresource_bundle: true, + install: true, + install_dir: pkgdatadir, +) + +# === Configure wrapper (savedesktop.in -> savedesktop) === +conf = configuration_data() +conf.set('PYTHON', python.find_installation('python3').full_path()) +conf.set('VERSION', meson.project_version()) +conf.set('pkgdatadir', pkgdatadir) +conf.set('localedir', localedir) + +configure_file( + input: 'savedesktop.in', + output: 'savedesktop', + configuration: conf, + install: true, + install_dir: get_option('bindir'), + install_mode: 'r-xr-xr-x', +) + +# === Install Python sources === +savedesktop_sources = [ + '__init__.py', + 'main.py', + 'globals.py', +] + +install_data(savedesktop_sources, install_dir: moduledir) + +subdir('core') +subdir('gui') diff --git a/src/savedesktop.gresource.xml b/src/savedesktop.gresource.xml new file mode 100644 index 00000000..e7ad3e57 --- /dev/null +++ b/src/savedesktop.gresource.xml @@ -0,0 +1,6 @@ + + + + gui/templates/shortcuts_window.ui + + diff --git a/savedesktop b/src/savedesktop.in old mode 100644 new mode 100755 similarity index 57% rename from savedesktop rename to src/savedesktop.in index 69182f3e..8aa9c4ed --- a/savedesktop +++ b/src/savedesktop.in @@ -1,17 +1,45 @@ #!/usr/bin/python3 -import os, sys, shutil, argparse -from pathlib import Path -from datetime import date -flatpak = os.path.exists("/.flatpak-info") -snap = os.environ.get('SNAP_NAME', '') == 'savedesktop' +# savedesktop.in +# +# Copyright 2025 vikdevelop +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later -# Cache directory -CACHE = f"{Path.home()}/.var/app/io.github.vikdevelop.SaveDesktop/cache/tmp" if flatpak else f"{os.getenv('SNAP_USER_COMMON')}/.cache/tmp" if snap else f"{Path.home()}/.cache/io.github.vikdevelop.SaveDesktop" +import os +import sys +import subprocess +import argparse +import signal +import locale +import gettext -# Init dir for loading the Python scripts -init_dir = "/app" if flatpak else f"{os.getenv('SNAP')}/usr" if snap else f"{Path.home()}/.local/share/savedesktop/src" -sys.path.append(init_dir) +VERSION = '@VERSION@' +pkgdatadir = '@pkgdatadir@' +localedir = '@localedir@' + +os.environ["SAVEDESKTOP_VERSION"] = VERSION +os.environ["SAVEDESKTOP_DIR"] = pkgdatadir +os.environ["SAVEDESKTOP_LOCALE"] = localedir + +sys.path.insert(1, pkgdatadir) +signal.signal(signal.SIGINT, signal.SIG_DFL) +locale.bindtextdomain('savedesktop', localedir) +locale.textdomain('savedesktop') +gettext.install('savedesktop', localedir) # Command-line arguments parser = argparse.ArgumentParser() @@ -24,18 +52,15 @@ cmd = parser.parse_args() # Run Python scripts from the listed command-line arguments if cmd.background: # start periodic saving - from periodic_saving import PeriodicBackups + from savedesktop.core.periodic_saving import PeriodicBackups pb = PeriodicBackups() pb.run(None) - exit() elif cmd.sync: # sync a desktop configuration - from synchronization import Syncing - exit() + from savedesktop.core.synchronization import Syncing elif cmd.save_now: # save a configuration using UI parameters - from periodic_saving import PeriodicBackups + from savedesktop.core.periodic_saving import PeriodicBackups pb = PeriodicBackups() pb.run(now=True) - exit() elif cmd.FOLDER_PATH: # save a configuration without an archive folder_path = cmd.FOLDER_PATH os.makedirs(f"{CACHE}/save_config", exist_ok=True) @@ -48,11 +73,11 @@ elif cmd.CFG_ARCHIVE_PATH: # import a configuration from a file, or folder if not os.path.exists(file_path): print(f"File not found: {file_path}") exit(1) - + shutil.rmtree(os.path.join(CACHE, "import_config"), ignore_errors=True) os.makedirs(os.path.join(CACHE, "import_config"), exist_ok=True) os.chdir(os.path.join(CACHE, "import_config")) - + if file_path.endswith('.sd.zip'): os.system(f"unzip {file_path}") elif file_path.endswith('.sd.tar.gz'): @@ -62,8 +87,13 @@ elif cmd.CFG_ARCHIVE_PATH: # import a configuration from a file, or folder else: print("Unsupported file type. Use *.sd.zip, *.sd.tar.gz or folder which contains the \".folder.sd\" file.") exit(1) - - os.system(f"python3 {init_dir}/config.py --import_") - exit() + + subprocess.run([sys.executable, "-m", "savedesktop.core.config", "--import_"], check=True, env={**os.environ, "PYTHONPATH": "/app/share/savedesktop"}) else: # show the app window - import main_window + import gi + + from gi.repository import Gio + resource = Gio.Resource.load(os.path.join(pkgdatadir, 'savedesktop.gresource')) + resource._register() + + from savedesktop import main diff --git a/src/shortcuts_window.py b/src/shortcuts_window.py deleted file mode 100644 index 1990fe42..00000000 --- a/src/shortcuts_window.py +++ /dev/null @@ -1,101 +0,0 @@ -import gi -gi.require_version('Gtk', '4.0') -from gi.repository import Gtk -from localization import * - -SHORTCUTS_WINDOW = '\ -\ - \ - \ -' % (_["open_wiki"], _["save_config"], _["import_from_file"], _["keyboard_shortcuts"], _["quit"], _["sync_manually"], _["more_options"], _["items_for_archive"], _["set_up_sync_file"], _["connect_cloud_storage"]) - -# Load the shortcuts window -@Gtk.Template(string=SHORTCUTS_WINDOW) -class ShortcutsWindow(Gtk.ShortcutsWindow): - __gtype_name__ = 'ShortcutsWindow' - - def __init__(self, **kwargs): - super().__init__(**kwargs) diff --git a/translations/ar.json b/translations/ar.json deleted file mode 100644 index 02168c60..00000000 --- a/translations/ar.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "حول التطبيق", - "unsuppurted_env_desc": "بيئة سطح المكتب التي لديك غير مدعومة.\nالرجاء استخدام هذه البيئات: {}.", - "save_config": "حفظ التخصيصات الحالية", - "import_config": "استيراد تخصيصات محفوظة", - "set_filename": "قم بتعيين اسم الملف (بدون مسافات)", - "config_saved": "تم حفظ التخصيصات!", - "open_folder": "افتح المجلد", - "cancel": "إلغاء", - "savedesktop_f": "Save Desktop ملفات", - "config_imported": "تم تطبيق التخصيصات!", - "logout": "تسجيل الخروج", - "please_wait": "انتظر من فضلك …", - "summary": "احفظ التخصيصات الحالية لبيئة سطح المكتب الخاص بك", - "description": "هل ترغب في حفظ التخصيصات الحالي الخاص بك بما في ذلك السمات والرموز والخلفيات وجميع إعدادات بيئة سطح المكتب والإضافات وما إلى ذلك؟ يمكن أن يساعدك Save Desktop في ذلك. بنقرة واحدة فقط ويتم حفظ التخصيصات الخاص بك.", - "translator_credits": "Translator github-link", - "periodic_saving": "Periodic saving", - "periodic_saving_desc": "Changes will only take effect after the next login", - "never": "Never", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "import_from_file": "Import from file", - "save": "Save", - "apply": "Apply", - "learn_more": "Learn more", - "save_installed_flatpaks": "Save installed Flatpak apps", - "pb_folder": "Folder for periodic saving", - "set_pb_folder_tooltip": "Choose custom folder for periodic saving", - "set_another": "Choose another folder", - "import_title": "Import", - "filename_format": "File name format", - "reset_button": "Reset to default", - "items_for_archive": "Items to include in the configuration archive", - "items_desc": "These settings also apply to periodic saving", - "icons": "Icons", - "themes": "Themes", - "fonts": "Fonts", - "backgrounds": "Backgrounds", - "sync": "Sync", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "set_up_sync_file": "Set up the sync file", - "periodic_sync": "Periodic synchronization", - "manually": "Manually", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "periodic_saving_file": "Periodic saving file", - "user_data_flatpak": "User data of installed Flatpak apps", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "sync_manually": "Synchronise manually", - "extensions": "Extensions", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "flatpaks_data_tittle": "Flatpak apps data selection", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "archive_encryption": "Archive encryption", - "pb_interval": "Interval", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "Password", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Create new password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "initial_setup": "Initial synchronization setup", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_section": "2. Go to the Online Accounts section", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/ca.json b/translations/ca.json deleted file mode 100644 index f77ec7f5..00000000 --- a/translations/ca.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Quant a...", - "unsuppurted_env_desc": "Teniu un entorn d'escriptori no suportat. \nEl programa funciona amb: {}.", - "save_config": "Desa la configuració actual", - "import_config": "Importa una configuració", - "set_filename": "Nom del fitxer", - "config_saved": "S'ha desat la configuració!", - "open_folder": "Obre la carpeta", - "cancel": "Cancel·la", - "savedesktop_f": "Fitxers del Save Desktop", - "config_imported": "S'ha aplicat la configuració!", - "logout": "Tanca la sessió", - "please_wait": "Un moment…", - "save": "Desa", - "import_title": "Importa", - "apply": "Aplica", - "import_from_file": "Des d'un fitxer", - "periodic_saving": "Còpia automàtica", - "periodic_saving_desc": "Els canvis seran efectius al proper inici de sessió", - "never": "Mai", - "daily": "Diàriament", - "weekly": "Setmanalment", - "monthly": "Mensualment", - "manually": "Manual", - "learn_more": "Més informació", - "pb_folder": "Carpeta de destinació", - "set_pb_folder_tooltip": "Trieu una carpeta on desar la còpia automàtica", - "set_another": "Trieu altra carpeta", - "filename_format": "Format del nom de fitxer", - "reset_button": "Restaura als valors per defecte", - "items_for_archive": "Elements que voleu incloure al fitxer de configuració", - "items_desc": "Aquestes opcions afecten també a la còpia automàtica", - "icons": "Icones", - "themes": "Temes", - "fonts": "Fonts", - "backgrounds": "Fons d'escriptori", - "save_installed_flatpaks": "Programari Flatpak", - "sync": "Sincronitza", - "sync_desc": "Sincronitzeu el vostre entorn d'escriptori amb altres equips de la xarxa.", - "set_up_sync_file": "Configura el fitxer de sincronització", - "periodic_sync": "Sincronització periòdica", - "m_sync_desc": "Ja podeu sincronitzar la configuració des del menú de la barra superior", - "summary": "Desa la configuració actual del vostre entorn d'escriptori", - "description": "El Save Desktop us permet desar la configuració actual (temes, icones, fons de pantalla, totes les opcions de configuració de l'entorn d'escriptori, complements, etc.) amb un sol clic.", - "translator_credits": "BennyBeat https://github.com/BennyBeat", - "periodic_saving_file": "Fitxer de desat periòdic", - "user_data_flatpak": "Dades d'usuari del programari Flatpak instal·lat", - "extensions": "Extensions", - "keyboard_shortcuts": "Dreceres de teclat", - "quit": "Surt", - "sync_manually": "Sincronitza manualment", - "list": "Llistat del programari Flatpak instal·lat", - "desktop_folder": "Escriptori", - "importing_config_status": "Important la configuració ...\nS'està important la configuració des de:\n{}\n", - "saving_config_status": "Desant la configuració ...\nLa configuració del vostre escriptori es desarà a:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nPodeu tancar la sessió ara perquè els canvis siguin aplicats, o podeu tornar a la pàgina anterior i tancar la sessió més tard.\n", - "back_to_page": "Torna a la pàgina anterior", - "flatpaks_data_tittle": "Selecció de dades d'aplicacions Flatpak", - "config_saved_desc": "{}\nAra podeu revisar el fitxer amb la configuració del vostre escriptori, o tornar a la pàgina anterior.\n", - "password_entry": "Contrasenya", - "pb_interval": "Interval", - "archive_encryption": "Xifrat de ftxer", - "archive_encryption_desc": "En desar la configuració de forma manual, si us demanarà crear una contrasenya. Això és útil quan deseu la configuració en mitjans extraïbles per mantenir segures les vostres dades.", - "create_pwd_desc": "Creeu una contrasenya nova per al vostre fitxer. Es recomana emprar almenys 12 caràcters, incloent-hi majúscules, minúscules i caràcters especials.", - "more_options": "Més opcions", - "check_pwd_desc": "Inseriu més avall una contrasenya per a desblocar el fitxer de configuració. Si l'oblideu, no podreu descomprimir el fitxer i aplicar la importació de la configuració.", - "check_pwd_title": "Desbloca el fitxer amb una contrasenya", - "create_pwd_title": "Crea una contrasenya nova", - "select_cloud_folder_btn": "Selecciona la carpeta del núvol", - "cloud_folder_err": "No heu seleccionat cap carpeta del núvol!", - "gen_password": "Crea una contrasenya", - "bidirectional_sync": "Sincronització bidireccional", - "err_occured": "S'ha produït un error", - "create": "Crea", - "change": "Canvia", - "periodic_saving_file_err": "No existeix el fitxer de desat periòdic.", - "bidirectional_sync_desc": "En habilitar-ho i seleccionar l'interval de la sincronització i la carpeta de la unitat al núvol, tota la informació del desament automàtic (interval, carpeta i nom de fitxer) de l'altre ordinador es copia en aquest mitjançant la sincronització indicada.", - "connect_cloud_storage_desc": "Obriu aquesta pàgina del Save Desktop a l'altre ordinador i feu clic al botó «Configura el fitxer de sincronització» per a realitzar els canvis necessaris. En aquest ordinador, seleccioneu la carpeta que heu sincronitzat amb l'emmagatzematge al núvol i on heu desat el fitxer de desament automàtic.", - "connect_cloud_storage": "Connecta a l'emmagatzematge al núvol", - "next": "Next", - "open_wiki": "Open the application wiki", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "pwd_for_encryption": "Password for encryption", - "import_from_folder": "Import from folder", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/cs.json b/translations/cs.json deleted file mode 100644 index ced78324..00000000 --- a/translations/cs.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "O aplikaci", - "unsuppurted_env_desc": "Máte nainstalované nepodporované prostředí. \nPoužijte jedno z těchto prostředí: {}.", - "save_config": "Uložit aktuální konfiguraci", - "import_config": "Importovat již uloženou konfiguraci", - "set_filename": "Nastavit název souboru", - "config_saved": "Konfigurace byla uložena!", - "open_folder": "Otevřít složku", - "cancel": "Zrušit", - "savedesktop_f": "Soubory Save Desktop", - "config_imported": "Konfigurace byla provedena!", - "logout": "Odhlásit se", - "please_wait": "Počkejte prosím …", - "summary": "Uložte konfiguraci plochy", - "description": "Save Desktop umožňuje uložit aktuální konfiguraci (motivy, ikony, tapety, všechna nastavení prostředí, rozšíření atd.) jedním kliknutím.", - "translator_credits": "vikdevelop https://github.com/vikdevelop", - "periodic_saving": "Pravidelné ukládání", - "periodic_saving_desc": "Změny se projeví až po dalším přihlášení", - "never": "Nikdy", - "daily": "Denně", - "weekly": "Týdně", - "monthly": "Měsíčně", - "apply": "Použít", - "import_from_file": "Importovat ze souboru", - "save": "Uložit", - "learn_more": "Zjistit více", - "save_installed_flatpaks": "Aplikace Flatpak", - "pb_folder": "Složka pro pravidelné ukládání", - "set_pb_folder_tooltip": "Vybrat vlastní složku pro pravidelné ukládání", - "set_another": "Vybrat jinou složku", - "icons": "Ikony", - "import_title": "Import", - "filename_format": "Formát názvu souboru", - "reset_button": "Resetovat na výchozí", - "items_for_archive": "Položky, které mají být zahrnuty do archivu konfigurace", - "items_desc": "Tato nastavení platí i pro pravidelné ukládání", - "themes": "Motivy", - "fonts": "Fonty", - "backgrounds": "Pozadí", - "sync": "Synchronizovat", - "sync_desc": "Synchronizujte konfiguraci vašeho desktopového prostředí s ostatními počítači v síti.", - "set_up_sync_file": "Nastavit synchronizační soubor", - "periodic_saving_file": "Soubor pravidelného ukládání", - "periodic_sync": "Pravidelná synchronizace", - "manually": "Ručně", - "m_sync_desc": "Od teď můžete synchronizovat konfiguraci z nabídky v záhlaví", - "user_data_flatpak": "Uživatelská data nainstalovaných aplikací Flatpak", - "keyboard_shortcuts": "Klávesové zkratky", - "quit": "Ukončit", - "extensions": "Rozšíření", - "sync_manually": "Synchronizovat ručně", - "list": "Seznam nainstalovaných aplikací Flatpak", - "desktop_folder": "Plocha", - "flatpaks_data_tittle": "Výběr dat aplikací Flatpak", - "importing_config_status": "Importování konfigurace …\nImportování konfigurace z: \n{}\n", - "saving_config_status": "Ukládání konfigurace … \nKonfigurace vašeho desktopového prostředí bude uložena v:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nAby se změny projevily, můžete se ze systému odhlásit, nebo se vrátit na předchozí stránku a odhlásit se později.\n", - "back_to_page": "Vrátit se na předchozí stránku", - "config_saved_desc": "{}\nNyní si můžete prohlédnout archiv s konfigurací svého desktopového prostředí nebo se vrátit na předchozí stránku.\n", - "pb_interval": "Interval", - "more_options": "Více možností", - "create_pwd_title": "Vytvořit nové heslo", - "archive_encryption": "Šifrování archivu", - "archive_encryption_desc": "Při ručním ukládání konfigurace budete vyzváni k vytvoření hesla. To je užitečné při ukládání konfigurace na přenosné médium pro lepší zabezpečení dat.", - "create_pwd_desc": "Vytvořte si prosím nové heslo pro svůj archiv. Kritéria zahrnují délku alespoň 12 znaků, jedno velké písmeno, jedno malé písmeno a jeden speciální znak.", - "password_entry": "Heslo", - "check_pwd_desc": "Zadáním níže uvedeného hesla odemknete archiv s vaší konfigurací. Pokud jste ho zapomněli, nebudete moci archiv rozbalit a začít importovat konfiguraci.", - "check_pwd_title": "Odemknout archiv pomocí hesla", - "select_cloud_folder_btn": "Vybrat cloudovou složku", - "create": "Vytvořit", - "err_occured": "Došlo k chybě", - "change": "Změnit", - "periodic_saving_file_err": "Soubor pravidelného ukládání neexistuje.", - "cloud_folder_err": "Nevybrali jste složku cloudové jednotky!", - "gen_password": "Vygenerovat heslo", - "bidirectional_sync_desc": "Pokud je tato funkce povolena a je vybrán interval synchronizace a složka cloudové jednotky, informace o pravidelném ukládání (interval, složka a název souboru) z druhého počítače s nastavenou synchronizací se zkopírují do tohoto počítače.", - "bidirectional_sync": "Obousměrná synchronizace", - "connect_cloud_storage": "Připojit se ke cloudovému úložišti", - "connect_cloud_storage_desc": "Na jiném počítači otevřete aplikaci Save Desktop a na této stránce klikněte na tlačítko „Nastavit synchronizační soubor“ a proveďte potřebná nastavení. Na tomto počítači vyberte složku, kterou jste synchronizovali s cloudovým úložištěm a do které jste také uložili stejný soubor pro pravidelné ukládání.", - "almost_done_title": "Téměř hotovo!", - "gnome_oa_section": "2. Přejděte do sekce Online účty", - "rclone_copy_cmd": "Nyní zkopírujte příkaz pro nastavení Rclone pomocí postranního tlačítka a otevřete aplikaci Terminál pomocí klávesové zkratky Ctrl+Alt+T nebo ji najděte v nabídce aplikací.", - "rclone_cmd_copied_msg": "Po dokončení nastavení Rclone pomocí uvedeného příkazu klikněte na tlačítko \"Apply\"", - "gnome_oa_chooser_desc": "Vytvořenou složku cloudové jednotky je možné nalézt na postranním panelu dialogu pro výběr souborů v tomto tvaru: uzivatelskejmeno@sluzba.com.", - "next": "Další", - "rclone_intro_desc": "Aby synchronizace fungovala správně, potřebujete mít složku, která je synchronizována s vaší cloudovou službou pomocí Rclone.\nZačněte výběrem používané cloudové služby.", - "almost_done_desc": "Nyní máte vytvořenou složku cloudové jednotky! Klikněte na tlačítko Další pro dokončení nastavení.", - "initial_setup": "Počáteční nastavení synchronizace", - "select": "Vybrat", - "gnome_oa_section_desc": "V této sekci vyberte požadovanou cloudovou službu, jako je Google, Microsoft 365 nebo Nextcloud.", - "open_wiki": "Otevřít wiki aplikace", - "gnome_oa_settings": "1. Otevřete nastavení systému", - "gnome_oa_chooser": "3. Klikněte na tlačítko Další a vyberte vytvořenou složku cloudové jednotky", - "pwd_for_encryption": "Heslo pro šifrování", - "remember_password": "Zapamatovat heslo", - "syncthing_folder": "Použít místo toho složku Syncthing", - "password_store_err": "Heslo nebylo zadáno, nebo je nesprávné. Nelze pokračovat.", - "save_without_archive": "Uložit konfiguraci bez vytváření archivu", - "import_from_folder": "Importovat ze složky", - "manual_saving": "Ruční ukládání", - "enter_password_title": "Zadejte prosím heslo k odemknutí archivu pro synchronizaci konfigurace", - "enter_password_desc": "Pro synchronizaci pomocí aplikace Save Desktop byl vybrán šifrovaný archiv. Pro jeho odemčení a spuštění synchronizace zadejte níže uvedené heslo." -} diff --git a/translations/de.json b/translations/de.json deleted file mode 100644 index 718a673e..00000000 --- a/translations/de.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Über", - "unsuppurted_env_desc": "Sie haben eine nicht unterstützte Umgebung installiert.\nBitte verwenden Sie eine der folgenden Umgebungen: {}.", - "save_config": "Die aktuelle Konfiguration speichern", - "import_config": "Die gespeicherte Konfiguration importieren", - "set_filename": "Den Dateinamen festlegen", - "config_saved": "Die Konfiguration wurde gespeichert!", - "open_folder": "Den Ordner öffnen", - "cancel": "Abbrechen", - "savedesktop_f": "Save Desktop Dateien", - "config_imported": "Die Konfiguration wurde angewendet!", - "logout": "Ausloggen", - "please_wait": "Bitte warten …", - "summary": "Speichern Sie die aktuelle Konfiguration Ihrer Desktop-Umgebung", - "description": "Mit Save Desktop können Sie Ihre aktuelle Konfiguration (Designs, Symbole, Hintergrundbilder, alle Einstellungen der Desktop-Umgebung, Erweiterungen usw.) mit einem Klick speichern.", - "translator_credits": "Github Link des Übersetzers", - "periodic_saving": "Regelmäßiges Speichern", - "periodic_saving_desc": "Die Änderungen werden erst nach der nächsten Anmeldung wirksam.", - "never": "Nie", - "daily": "Täglich", - "weekly": "Wöchentlich", - "monthly": "Monatlich", - "import_from_file": "Aus Datei importieren", - "save": "Speichern", - "apply": "Anwenden", - "learn_more": "Mehr erfahren", - "save_installed_flatpaks": "Flatpak-Apps", - "pb_folder": "Ordner für das periodische Speichern", - "set_pb_folder_tooltip": "Benutzerdefinierten Ordner für das periodische Speichern auswählen", - "set_another": "Anderen Ordner auswählen", - "import_title": "Importieren", - "filename_format": "Dateinamensformat", - "reset_button": "Auf Standardeinstellungen zurücksetzen", - "items_for_archive": "Elemente, die in das Konfigurationsarchiv aufzunehmen sind", - "items_desc": "Diese Einstellungen gelten auch für das periodische Speichern", - "icons": "Symbole", - "themes": "Themen", - "fonts": "Schriftarten", - "backgrounds": "Hintergründe", - "sync": "Sync", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "set_up_sync_file": "Set up the sync file", - "periodic_sync": "Periodic synchronization", - "manually": "Manually", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "periodic_saving_file": "Periodic saving file", - "user_data_flatpak": "User data of installed Flatpak apps", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "extensions": "Extensions", - "sync_manually": "Synchronise manually", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "flatpaks_data_tittle": "Flatpak apps data selection", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "saving_config_status": "Speichert die Konfiguration ...\nDie Konfiguration ihrer Desktop Umgebung wird gespeichert in:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Zurück zur vorherigen Seite", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "pb_interval": "Interval", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "Password", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Create new password", - "err_occured": "Ein Fehler ist aufgetreten", - "select_cloud_folder_btn": "Select the cloud drive folder", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "connect_cloud_storage": "Connect to the cloud storage", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "gnome_oa_section": "2. Go to the Online Accounts section", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "almost_done_title": "Almost done!", - "open_wiki": "Open the application wiki", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "pwd_for_encryption": "Password for encryption", - "import_from_folder": "Import from folder", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/en.json b/translations/en.json deleted file mode 100644 index 9eb7af33..00000000 --- a/translations/en.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "save": "Save", - "save_config": "Save the current configuration", - "set_filename": "Set the file name", - "items_for_archive": "Items to include in the configuration archive", - "items_desc": "These settings also apply to periodic saving", - "icons": "Icons", - "themes": "Themes", - "fonts": "Fonts", - "backgrounds": "Backgrounds", - "extensions": "Extensions", - "desktop_folder": "Desktop", - "save_installed_flatpaks": "Flatpak apps", - "list": "List of installed Flatpak apps", - "user_data_flatpak": "User data of installed Flatpak apps", - "flatpaks_data_tittle": "Flatpak apps data selection", - "more_options": "More options", - "periodic_saving": "Periodic saving", - "periodic_saving_desc": "Changes will only take effect after the next login", - "pb_interval": "Interval", - "never": "Never", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "manually": "Manually", - "learn_more": "Learn more", - "pb_folder": "Folder for periodic saving", - "set_pb_folder_tooltip": "Choose custom folder for periodic saving", - "set_another": "Choose another folder", - "filename_format": "File name format", - "reset_button": "Reset to default", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "save_without_archive": "Save the configuration without creating an archive", - "create_pwd_title": "Create new password", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "gen_password": "Generate Password", - "password_entry": "Password", - "check_pwd_title": "Unlock the archive with a password", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization.", - "remember_password": "Remember Password", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "saving_config_status": "Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "config_saved": "Configuration has been saved!", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "open_folder": "Open the folder", - "import_title": "Import", - "import_config": "Import saved configuration", - "import_from_file": "Import from file", - "import_from_folder": "Import from folder", - "cancel": "Cancel", - "savedesktop_f": "Save Desktop files", - "importing_config_status": "Importing configuration …\nImporting configuration from:\n{}\n", - "config_imported": "The configuration has been applied!", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "logout": "Log Out", - "err_occured": "An error occurred", - "apply": "Apply", - "sync": "Sync", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "initial_setup": "Initial synchronization setup", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_section": "2. Go to the Online Accounts section", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "syncthing_folder": "Use Syncthing folder instead", - "almost_done_title": "Almost done!", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "select": "Select", - "next": "Next", - "set_up_sync_file": "Set up the sync file", - "periodic_saving_file": "Periodic saving file", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "create": "Create", - "please_wait": "Please wait …", - "change": "Change", - "connect_cloud_storage": "Connect to the cloud storage", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "select_cloud_folder_btn": "Select the cloud drive folder", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "periodic_sync": "Periodic synchronization", - "bidirectional_sync": "Bidirectional synchronization", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "sync_manually": "Synchronise manually", - "keyboard_shortcuts": "Keyboard shortcuts", - "open_wiki": "Open the application wiki", - "quit": "Quit", - "about_app": "About app", - "unsuppurted_env_desc": "You have an unsupported environment installed. \nPlease use one of these environments: {}.", - "summary": "Save your desktop configuration", - "description": "Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click.", - "translator_credits": " " -} diff --git a/translations/es.json b/translations/es.json deleted file mode 100644 index 58395088..00000000 --- a/translations/es.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Acerca de la aplicación", - "unsuppurted_env_desc": "Tiene instalado un entorno no compatible. \nPor favor, utilice uno de estos entornos: {}.", - "save_config": "Guardar la configuración actual", - "import_config": "Importar la configuración guardada", - "set_filename": "Establecer el nombre del archivo", - "config_saved": "¡Se ha guardado la configuración!", - "open_folder": "Abrir la carpeta", - "cancel": "Cancelar", - "savedesktop_f": "Archivos de Save Desktop", - "config_imported": "¡La configuración se ha aplicado!", - "logout": "Cerrar sesión", - "please_wait": "Espera, por favor…", - "summary": "Guardar la configuración del escritorio", - "description": "Save Desktop le permite guardar su configuración actual (temas, iconos, fondos de pantalla, todos los ajustes del entorno del escritorio, extensiones, etc.) con un solo clic.", - "translator_credits": "gallegonovato fran-carro@hotmail.es", - "periodic_saving": "Copia de seguridad periódica", - "periodic_saving_desc": "Los cambios sólo surtirán efecto tras el siguiente inicio de sesión", - "never": "Nunca", - "daily": "Diariamente", - "weekly": "Semanalmente", - "monthly": "Mensualmente", - "import_from_file": "Importar desde archivo", - "save": "Guardar", - "apply": "Aplicar", - "learn_more": "Más información", - "save_installed_flatpaks": "Aplicaciones de Flatpak", - "pb_folder": "Carpeta de almacenamiento periódico", - "set_pb_folder_tooltip": "Elegir una carpeta personalizada para el almacenamiento periódico", - "set_another": "Elegir otra carpeta", - "filename_format": "Formato del nombre del archivo", - "reset_button": "Restablecer los valores por defecto", - "items_for_archive": "Elementos que deben incluirse en el archivo de la configuración", - "items_desc": "Estos ajustes también se aplican al guardado periódico", - "icons": "Iconos", - "themes": "Temas", - "fonts": "Fuentes", - "backgrounds": "Fondos de pantalla", - "import_title": "Importar", - "sync": "Sincronizar", - "sync_desc": "Sincronizar la configuración de tu entorno de escritorio con otros ordenadores en la red.", - "set_up_sync_file": "Configurar el archivo de sincronización", - "periodic_sync": "Sincronización periódica", - "manually": "Manualmente", - "m_sync_desc": "A partir de ahora, puedes sincronizar la configuración desde el menú de la barra de cabecera", - "periodic_saving_file": "Archivo de almacenamiento periódico", - "user_data_flatpak": "Datos de usuario de las aplicaciones Flatpak instaladas", - "keyboard_shortcuts": "Atajos de teclado", - "quit": "Dejar", - "extensions": "Extensiones", - "sync_manually": "Sincronizar manualmente", - "list": "Lista de aplicaciones Flatpak instaladas", - "desktop_folder": "Escritorio", - "saving_config_status": "Guardar la configuración ...\nLa configuración de su entorno de escritorio se guardará en:\n {}/{}.sd.tar.gz\n", - "importing_config_status": "Importando la configuración ...\nImportando la configuración desde:\n{}\n", - "config_imported_desc": "{}\nPuede salir del sistema para que los cambios surtan efecto, o volver a la página anterior y salir más tarde.\n", - "back_to_page": "Volver a la página anterior", - "flatpaks_data_tittle": "Selección de datos de aplicaciones Flatpak", - "config_saved_desc": "{}\nAhora puede ver el archivo con la configuración de su entorno de escritorio o volver a la página anterior.\n", - "archive_encryption": "Cifrado de archivos", - "password_entry": "Contraseña", - "check_pwd_title": "Desbloquear el archivo con una contraseña", - "pb_interval": "Intervalo", - "archive_encryption_desc": "Al guardar manualmente la configuración, se le pedirá que cree una contraseña. Esto es útil cuando se guarda la configuración en medios portátiles para una mayor seguridad de sus datos.", - "create_pwd_desc": "Por favor, cree una nueva contraseña para su archivo. Los criterios incluyen al menos 12 caracteres, una letra mayúscula, una letra minúscula y un carácter especial.", - "more_options": "Más opiniones", - "check_pwd_desc": "Introduzca la contraseña a continuación para desbloquear el archivo con su configuración. Si la has olvidado, no podrás descomprimir el archivo y empezar a importar tu configuración.", - "create_pwd_title": "Crear una nueva contraseña", - "err_occured": "Se produjo un error", - "select_cloud_folder_btn": "Seleccione la carpeta de la nube", - "create": "Crear", - "change": "Cambiar", - "periodic_saving_file_err": "El archivo de guardado periódico no existe.", - "cloud_folder_err": "¡No has seleccionado la carpeta de la unidad en la nube!", - "gen_password": "Generar contraseña", - "bidirectional_sync_desc": "Si está activada y se seleccionan el intervalo de sincronización y la carpeta de la unidad en la nube, la información de guardado periódico (intervalo, carpeta y nombre de archivo) del otro ordenador con la sincronización establecida se copia en este ordenador.", - "connect_cloud_storage_desc": "En otro ordenador, abra la aplicación Save Desktop y, en esta página, haga clic en el botón \"Configurar el archivo de sincronización\" y realice los ajustes necesarios. En este ordenador, seleccione la carpeta que ha sincronizado con su almacenamiento en la nube y también ha guardado el mismo archivo de guardado periódico.", - "bidirectional_sync": "Sincronización bidireccional", - "connect_cloud_storage": "Conectarse al almacenamiento en la nube", - "almost_done_title": "¡Casi terminamos!", - "gnome_oa_section": "2. Ir a la sección Cuentas en línea", - "rclone_copy_cmd": "Ahora, copie el comando para configurar Rclone usando el botón lateral y abra la aplicación de terminal usando el atajo de teclado Ctrl+Alt+T o buscándolo en el menú de aplicaciones.", - "rclone_cmd_copied_msg": "Una vez que haya terminado de configurar Rclone usando el comando proporcionado, haga clic en el botón \"Aplicar\"", - "gnome_oa_chooser_desc": "La carpeta de la unidad en la nube creada se puede encontrar en el panel lateral del cuadro de diálogo del selector de archivos, con este formato: username@service.com.", - "next": "Siguiente", - "rclone_intro_desc": "Para que la sincronización funcione correctamente, debe tener la carpeta sincronizada con su servicio en la nube mediante Rclone.\nComience seleccionando el servicio de almacenamiento en la nube que utiliza.", - "initial_setup": "Configuración de sincronización inicial", - "almost_done_desc": "¡Ya has creado la carpeta de la unidad en la nube! Haz clic en el botón Siguiente para completar la configuración.", - "select": "Selecciona", - "gnome_oa_section_desc": "En esta sección selecciona el servicio de nube que deseas, como Google, Microsoft 365 o Nextcloud.", - "open_wiki": "Abrir la wiki de la aplicación", - "gnome_oa_settings": "1. Abrir los ajustes del sistema", - "gnome_oa_chooser": "3. Haz clic en el botón \"Siguiente\" y seleccione la carpeta de la unidad de la nube creada", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/et.json b/translations/et.json deleted file mode 100644 index baad7210..00000000 --- a/translations/et.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Rakenduse teave", - "unsuppurted_env_desc": "Sa kasutad mittetoetatud töölauakeskkonda. \nHetkel on toetatud: {}.", - "save_config": "Salvesta praegused seadistused", - "import_config": "Impordi salvestatud seadistused", - "set_filename": "Sisesta faili nimi", - "saving_config_status": "Salvestame seadistusi …\nSinu töölauakeskkonna seadistused salvestuvad faili:\n {}/{}.sd.tar.gz\n", - "config_saved": "Seadistused on salvestatud!", - "config_saved_desc": "{}\nSa võid nüüd vaadata oma töölauakeskkonna seadistuste archive või minna tagasi eelmise vaate juurde.\n", - "open_folder": "Ava kaust", - "cancel": "Katkesta", - "savedesktop_f": "Save Desktopi failid", - "importing_config_status": "Impordime seadistusi…\nImpordime seadistusi failist:\n{}\n", - "config_imported": "Seadistused on nüüd kasutusel!", - "config_imported_desc": "{}\nMuudatuste kasutuselevõtmiseks võid sa kohe välja logida või minna tagasi ja logida välja hiljem.\n", - "back_to_page": "Tagasi eelmisesse vaatesse", - "logout": "Logi välja", - "err_occured": "Tekkis viga", - "save": "Salvesta", - "import_title": "Impordi", - "import_from_file": "Impordi failist", - "apply": "Rakenda", - "periodic_saving": "Regulaarne salvestamine", - "periodic_saving_desc": "Muudatused jõustuvad järgmisel sisselogimisel", - "pb_interval": "Sagedus", - "never": "Mitte kunagi", - "daily": "Kord päevas", - "weekly": "Iga nädal", - "monthly": "Iga kuu", - "manually": "Valides aja käsitsi", - "learn_more": "Lisateave", - "pb_folder": "Kaust regulaarseks salvestamiseks", - "set_pb_folder_tooltip": "Vali kaust regulaarseks salvestamiseks sobilik kaust", - "set_another": "Vali muu kaust", - "filename_format": "Failinime vorming", - "reset_button": "Taasta algväärtused", - "items_for_archive": "Vali seadistuste arhiivifaili kaasatavad objektid", - "items_desc": "Need seadistused kehtivad ka regulaarsel varundamisel", - "icons": "Ikoonid", - "themes": "Kujundused", - "fonts": "Kirjatüübid", - "backgrounds": "Taustapildid", - "extensions": "Lisamoodulid", - "desktop_folder": "Töölaud", - "save_installed_flatpaks": "Flatpaki rakendused", - "list": "Paigaldatud Flatpaki rakenduste loend", - "user_data_flatpak": "Paigaldatud Flatpaki rakenduste kasutajaandmed", - "flatpaks_data_tittle": "Vali Flatpaki rakendused, mille andmed tahad kaasata", - "sync": "Sünkroniseerimine", - "sync_desc": "Sünkroniseeri oma töölauakeskkonna seadistusi teiste arvutitega võrgus.", - "initial_setup": "Sünkroniseerimise algne seadistus", - "gnome_oa_settings": "1. Ava süsteemi seadistused", - "gnome_oa_section": "2. Ava võrguteenuste valik", - "gnome_oa_section_desc": "Siin vali soovitud pilveteenus, nagu Google, Microsoft 365 või Nextcloud.", - "gnome_oa_chooser": "3. Klõpsi nuppu Edasi ja vali loodud pilveteenuse kaust", - "gnome_oa_chooser_desc": "Loodud pilvekaust leidub külgpaanis failivalija vaates ja tavaliselt näeb välja umbes nii: kasutajanimi@teenus.com.", - "rclone_intro_desc": "Et sünkroniseerimine toimiks korralikult vajad sa kausta, mis on rclone'i abil sünkroniseeritud sinu pilveteenusega.\nAlustamiseks vali soovitud pilveteenuse kaust.", - "rclone_copy_cmd": "Seejärel kasutades küljel asuvat nuppu kopeeri rclone'i ülesseadmiseks vajalik käsk, ava terminalirakendus kas Ctrl+Alt+T kiirklahviga või valides ta rakenduste käivitajast.", - "rclone_cmd_copied_msg": "Kui oled selle käsu abil rclone'i seadistanud, siis klõpsi „Rakenda“ nuppu", - "almost_done_title": "Peaaegu valmis!", - "almost_done_desc": "Pilveteenuse kausta oled sa nüüd loonud! Seadistamise lõpetamiseks vajuta nuppu „Edasi“.", - "select": "Vali", - "next": "Edasi", - "set_up_sync_file": "Seadista sünkroniseerimisfail", - "periodic_saving_file": "Fail regulaarseks salvestamiseks", - "periodic_saving_file_err": "Regulaarseks salvestamiseks mõeldud faili pole olemas.", - "create": "Loo", - "please_wait": "Palun oota…", - "change": "Muuda", - "connect_cloud_storage": "Ühenda pilvesalvestusteenusega", - "connect_cloud_storage_desc": "Ava teises arvutis Save Desktop rakendus ja sellel lehel klõpsi nuppu „Seadista sünkroniseerimisfail“ ja seadista vastavalt. Selles arvutis vali kaust, mille oled sünkroniseerinud oma pilveteenusega ja kuhu oled lisanud faili regulaarseks salvestamiseks.", - "select_cloud_folder_btn": "Vali pilveteenuse kaust", - "cloud_folder_err": "Sa pole pilveteenuse kausta valinud!", - "periodic_sync": "Regulaarne sünkroniseerimine", - "bidirectional_sync": "Mõlemasuunaline sünkroniseerimine", - "bidirectional_sync_desc": "Kui eelistus on kasutusel, sünkroniseerimisvälp ja pilveteenuse kaust valitud, siis regulaarse salvestamise teave (välp, kaust ja failinimi) teisest arvutist kopeeritakse siia arvutisse.", - "m_sync_desc": "Alates nüüdsest saad sa andmed sünkroniseerida menüüst päiseriba kohal", - "sync_manually": "Sünkroniseeri käsitsi", - "keyboard_shortcuts": "Klaviatuuri kiirklahvid", - "open_wiki": "Ava rakenduse viki", - "quit": "Välju", - "more_options": "Lisavalikud", - "archive_encryption": "Arhiivifaili krüptimine", - "archive_encryption_desc": "Seadistuste käsitsi salvestamisel palume, et lisaksid salasõna. See võimalus parandab turvalisust, kui kavatsed kasutada salvestamist teisaldatavale andmekandjale.", - "create_pwd_title": "Loo uus salasõna", - "create_pwd_desc": "Palun lisa oma arhiivifailile salasõna. Eeldame, et ta oleks vähemalt 12 tähemärki pikk, sisaldaks vähemalt ühte suurtähte, väiketähte ja erimärki.", - "gen_password": "Loo salasõna", - "password_entry": "Salasõna", - "check_pwd_title": "Kasutades salasõna eemalda arhiivifaili krüptimine", - "check_pwd_desc": "Alljärgnevalt sisesta arhiivifaili krüptimise eemaldamiseks vajalik salasõna. Kui oled salasõna unustanud, siis arhiivifaili lahtipakkimine ja järgnev importimine pole võimalik.", - "summary": "Salvesta oma töölaua seadistused", - "description": "Save Desktop võimaldab sul ühe klõpsuga salvestada (ja seega ka varundada) oma töölaua seadistused (kujundus, ikoonid, taustapildid, kõik töölauakeskkonna seadistused, lisamoodulid, jne).", - "translator_credits": "Priit Jõerüüt 2025", - "remember_password": "Jäta salasõna meelde", - "syncthing_folder": "Selle asemel kasuta Syncthingi kausta", - "save_without_archive": "Salvesta seadistused ilma arhiivi loomata", - "password_store_err": "Salasõna on kas sisestamata või vale. Jätkamine pole võimalik.", - "import_from_folder": "Impordi kaustast", - "pwd_for_encryption": "Krüptimise salasõna", - "manual_saving": "Käsitsi salvestamine", - "enter_password_title": "Seadistuste sünkroniseerimiseks palun sisesta salasõna", - "enter_password_desc": "Oled Save Desktopi abil sünkroniseerimiseks valinud krüptitud arhiivifaili. Lukustuse eemaldamiseks palun sisesta salasõna ja sünkroniseerimine saab alata." -} diff --git a/translations/fi.json b/translations/fi.json deleted file mode 100644 index 74921aa6..00000000 --- a/translations/fi.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Tietoja sovelluksesta", - "unsuppurted_env_desc": "Havaittu tuen ulkopuolella olevan ympäristön asennus. \nKäytä jotain näistä ympäristöistä: {}.", - "save_config": "Tallenna nykyiset määritykset", - "import_config": "Tuo tallennettu määritys", - "set_filename": "Aseta tiedostonimi", - "saving_config_status": "Tallennetaan määritystä …\nTyöpöytäympäristösi määritys tallennetaan seuraavaan tiedostoon:\n {}/{}.sd.tar.gz\n", - "config_saved": "Määritys on tallennettu!", - "config_saved_desc": "{}\nVoit nyt katselmoida arkiston, jossa työpöytäympäristösi määritys on, tai palata edelliselle sivulle.\n", - "open_folder": "Avaa kansio", - "cancel": "Peru", - "savedesktop_f": "Save Desktop-tiedostot", - "importing_config_status": "Tuodaan määritystä…\nMääritys tuodaan seuraavasta lähteestä:\n{}\n", - "config_imported": "Määritys on toteutettu!", - "config_imported_desc": "{}\nVoit kirjautua ulos järjestelmästä, jotta muutokset tulevat voimaan, tai palata edelliselle sivulle ja kirjautua ulos myöhemmin.\n", - "back_to_page": "Takaisin edelliselle sivulle", - "logout": "Kirjaudu ulos", - "please_wait": "Odota hetki…", - "save": "Tallenna", - "import_title": "Tuo", - "apply": "Toteuta", - "import_from_file": "Tuo tiedostosta", - "periodic_saving": "Jaksottainen tallennus", - "periodic_saving_desc": "Muutokset tulevat voimaan vasta seuraavalla kirjautumiskerralla", - "pb_interval": "Aikaväli", - "never": "Ei koskaan", - "daily": "Päivittäin", - "weekly": "Viikottain", - "monthly": "Kuukausittain", - "manually": "Manuaalisesti", - "learn_more": "Lue lisää", - "pb_folder": "Kansio jaksottaista tallennusta varten", - "set_pb_folder_tooltip": "Valitse mukautettu kansio jaksottaista tallennusta varten", - "set_another": "Valitse toinen kansio", - "filename_format": "Tiedostonimen muoto", - "reset_button": "Palauta oletusasetus", - "items_for_archive": "Määritysarkistoon sisällytettävät kohteet", - "items_desc": "Nämä asetukset pätevät myös jaksottaiseen tallennukseen", - "icons": "Kuvakkeet", - "themes": "Teemat", - "fonts": "Fontit", - "backgrounds": "Taustakuvat", - "extensions": "Laajennukset", - "desktop_folder": "Työpöytä", - "save_installed_flatpaks": "Flatpak-sovellukset", - "list": "Luettelo asennetuista Flatpak-sovelluksista", - "user_data_flatpak": "Asennettujen Flatpak-sovellusten käyttäjädata", - "flatpaks_data_tittle": "Flatpak-sovellusten datavalinta", - "sync": "Synkronoi", - "sync_desc": "Synkronoi työpöytämäärityksesi muiden verkossa olevien tietokoneiden kanssa.", - "set_up_sync_file": "Aseta synkronointitiedosto", - "periodic_saving_file": "Jaksottaisen tallennuksen tiedosto", - "periodic_sync": "Jaksottainen synkronointi", - "m_sync_desc": "Vastedes voit synkronoida määrityksen otsakepalkin valikosta", - "sync_manually": "Synkronoi manuaalisesti", - "quit": "Lopeta", - "keyboard_shortcuts": "Pikanäppäimet", - "more_options": "Lisää valintoja", - "archive_encryption": "Arkiston salaus", - "archive_encryption_desc": "Kun tallennat määrityksen manuaalisesti, sinua pyydetään luomaan salasana. Tämä on hyödyllinen ominaisuus datan turvaamiseksi, kun määritys on tarkoitus tallentaa esimerkiksi erilliselle muistitikulle.", - "create_pwd_title": "Luo uusi salasana", - "create_pwd_desc": "Luo uusi salasana arkistoon. Salasanan on sisällettävä vähintään 12 merkkiä, yksi iso kirjain, yksi pieni kirjain ja yksi erikoismerkki.", - "password_entry": "Salasana", - "check_pwd_title": "Avaa arkiston lukitus salasanalla", - "check_pwd_desc": "Kirjoita määritysarkiston salasana alapuolelle. Jos olet unohtanut salasanan, et pysty avata arkistoa ja tuoda määritystä.", - "summary": "Tallenna työpöytäsi määritys", - "description": "Save Desktopin avulla voit tallentaa työpöytäympäristösi määrityksen (teemat, kuvakkeet, taustakuvat, kaikki työpöytäympäristön asetukset, laajennukset jne.) yhdellä napsautuksella.", - "translator_credits": "Name jiri.gronroos+l10n@iki.fi", - "select_cloud_folder_btn": "Valitse pilviaseman kansio", - "err_occured": "Tapahtui virhe", - "create": "Luo", - "change": "Vaihda", - "periodic_saving_file_err": "Jaksottaisen tallennuksen tiedostoa ei ole olemassa.", - "cloud_folder_err": "Et valinnut pilviaseman kansiota!", - "gen_password": "Luo salasana", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Kaksisuuntainen synkronointi", - "connect_cloud_storage": "Yhdistä pilvitallennustilaan", - "gnome_oa_section": "2. Siirry verkkotileihin", - "almost_done_title": "Melkein valmista!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Seuraava", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Ensimmäisen synkronoinnin määritys", - "select": "Valitse", - "gnome_oa_section_desc": "Valitse haluamasi pilvipalvelu kuten Google, Microsoft 365 tai Nextcloud.", - "open_wiki": "Avaa sovelluksen wiki", - "gnome_oa_settings": "1. Avaa järjestelmän asetukset", - "gnome_oa_chooser": "3. Napsauta Seuraava-painiketta ja valitse luotu kansio pilvestä", - "save_without_archive": "Tallenna kokoonpano luomatta arkistoa", - "pwd_for_encryption": "Salasana salausta varten", - "manual_saving": "Manuaalinen tallennus", - "import_from_folder": "Tuo kansiosta", - "syncthing_folder": "Käytä Syncthing-kansiota sen sijaan", - "remember_password": "Muista salasana", - "password_store_err": "Salasanaa ei kirjoitettu, tai se oli väärin. Jatkaminen ei ole mahdollista.", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/fr.json b/translations/fr.json deleted file mode 100644 index 35f4ae5b..00000000 --- a/translations/fr.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "À propos", - "unsuppurted_env_desc": "Votre environnements de bureau n'est pas compatible \nVeuillez utiliser l'un de ces environnements : {}.", - "save_config": "Sauvegarder la configuration actuelle", - "import_config": "Importer la configuration sauvegardée", - "set_filename": "Définir le nom du fichier", - "config_saved": "La configuration a été enregistrée !", - "open_folder": "Ouvrir le dossier", - "cancel": "Annuler", - "savedesktop_f": "Fichiers Save Desktop", - "config_imported": "La configuration a été appliquée !", - "logout": "Fermer la session", - "please_wait": "Veuillez patienter …", - "summary": "Sauvegarder la configuration de votre bureau", - "description": "Save Desktop vous permet de sauvegarder votre configuration actuelle (thèmes, icônes, fonds d'écran, tous les paramètres de l'environnement de bureau, les extensions, en un seul clic.", - "translator_credits": "Lien github des traducteurs", - "periodic_saving": "Sauvegarde périodique", - "periodic_saving_desc": "Les modifications ne prendront effet qu'après la prochaine connexion", - "never": "Jamais", - "daily": "Journalier", - "weekly": "Hebdomadaire", - "monthly": "Mensuel", - "import_from_file": "Importer à partir d'un fichier", - "save": "Sauvegarder", - "apply": "Appliquer", - "learn_more": "En savoir plus", - "save_installed_flatpaks": "Applications Flatpak", - "pb_folder": "Répertoire de sauvegarde périodique", - "set_pb_folder_tooltip": "Sélectionner un répertoire personnalisé pour la sauvegarde périodique", - "set_another": "Sélectionner un autre dossier", - "icons": "Icônes", - "import_title": "Importation", - "filename_format": "Format du nom de fichier", - "reset_button": "Réinitialisation aux valeurs par défaut", - "items_desc": "Ces paramètres s'appliquent également à l'enregistrement périodique", - "themes": "Thèmes", - "items_for_archive": "Éléments à inclure dans l'archive de configuration", - "fonts": "Polices de caractères", - "backgrounds": "Fonds d'écran", - "sync": "Synchroniser", - "sync_desc": "Synchroniser la configuration de votre environnement de bureau avec les autres ordinateurs du réseau.", - "set_up_sync_file": "Configurer le fichier de synchronisation", - "periodic_sync": "Synchronisation périodique", - "manually": "Manuellement", - "m_sync_desc": "Désormais, vous pouvez synchroniser la configuration à partir du menu de la barre d'en-tête", - "periodic_saving_file": "Fichier pour l'enregistrement périodique", - "user_data_flatpak": "Données utilisateur des applications Flatpak installées", - "keyboard_shortcuts": "Raccourcis clavier", - "quit": "Quitter", - "extensions": "Extensions", - "sync_manually": "Synchroniser manuellement", - "list": "Liste des applications Flatpak installées", - "desktop_folder": "Bureau", - "flatpaks_data_tittle": "Sélection des données des applications Flatpak", - "importing_config_status": "Import de la configuration ...\nImport de la configuration à partir de : {}\n", - "saving_config_status": "Enregistrement de la configuration ...\nLa configuration de votre environnement de bureau sera enregistrée dans :\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nVous pouvez vous déconnecter du système pour que les changements prennent effet, ou revenir à la page précédente et vous déconnecter plus tard.\n", - "back_to_page": "Revenir à la page précédente", - "config_saved_desc": "{}\nVous pouvez maintenant consulter l'archive contenant la configuration de votre environnement de bureau, ou revenir à la page précédente.\n", - "pb_interval": "Intervalle", - "archive_encryption": "Chiffrement de l'archive", - "archive_encryption_desc": "Lors de la sauvegarde manuelle de la configuration, il vous sera demandé de créer un mot de passe. Cette option permet d'améliorer la sécurité de vos données lorsque la configuration est enregistrée sur un support de stockage amovible.", - "create_pwd_desc": "Veuillez créer un nouveau mot de passe. Le nouveau mot de passe doit contenir au moins 12 caractères avec au moins une majuscule, au moins une minuscule et au moins un caractère spécial.", - "password_entry": "Mot de passe", - "more_options": "Plus d'options", - "check_pwd_desc": "Veuillez saisir ci-dessous le mot de passe permettant de déverrouiller l'archive qui contient votre configuration. En cas d'oubli du mot de passe, vous ne serez pas en mesure d'ouvrir l'archive contenant votre configuration et votre configuration ne pourra donc pas être importée.", - "check_pwd_title": "Déverrouiller l'archive avec un mot de passe", - "create_pwd_title": "Créer un nouveau mot de passe", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "Une erreur est survenue", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "open_wiki": "Open the application wiki", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_settings": "1. Open the system settings", - "pwd_for_encryption": "Password for encryption", - "save_without_archive": "Save the configuration without creating an archive", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "import_from_folder": "Import from folder", - "manual_saving": "Manual saving", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/hi.json b/translations/hi.json deleted file mode 100644 index 44203d76..00000000 --- a/translations/hi.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "ऐप के बारे में", - "unsuppurted_env_desc": "आपके पास एक असमर्थित परिवेश स्थापित है। \nकृपया इनमें से किसी एक परिवेश का उपयोग करें: {}।", - "save_config": "वर्तमान विन्यास सहेजें", - "import_config": "सहेजा गया विन्यास आयात करें", - "set_filename": "फाइल नाम निर्धारित करें", - "saving_config_status": "विन्यास सहेजा जा रहा है …\nआपके डेस्कटॉप वातावरण का विन्यास इसमें सहेजा जाएगा:\n {}/{}.sd.tar.gz\n", - "config_saved": "विन्यास सहेजा गया है!", - "config_saved_desc": "{}\nअब आप अपने डेस्कटॉप वातावरण के विन्यास के साथ संग्रह देख सकते हैं, या पिछले पृष्ठ पर लौट सकते हैं।\n", - "open_folder": "फोल्डर खोलें", - "cancel": "रद्द करें", - "savedesktop_f": "Save Desktop फाइलें", - "importing_config_status": "विन्यास आयात किया जा रहा है...\nयहाँ से विन्यास आयात किया जा रहा है:\n{}\n", - "config_imported": "विन्यास लागू कर दिया गया है!", - "config_imported_desc": "{}\nपरिवर्तनों को प्रभावी करने के लिए आप सिस्टम से लॉग आउट कर सकते हैं, या पिछले पृष्ठ पर वापस जा सकते हैं और बाद में लॉग आउट कर सकते हैं।\n", - "back_to_page": "पिछले पृष्ठ पर जाएं", - "logout": "लॉग आउट", - "please_wait": "कृपया प्रतीक्षा करें …", - "save": "सहेजें", - "import_title": "आयात", - "apply": "लागू करें", - "import_from_file": "फाइल से आयात", - "periodic_saving": "आवधिक सहेजना", - "periodic_saving_desc": "परिवर्तन अगले लॉगिन के बाद ही प्रभावी होंगे", - "never": "कभी नहीं", - "daily": "दैनिक", - "weekly": "साप्ताहिक", - "monthly": "मासिक", - "manually": "हाथ से", - "learn_more": "और अधिक जानें", - "pb_folder": "आवधिक सहेजने के लिए फोल्डर", - "set_pb_folder_tooltip": "आवधिक सहेजने के लिए तदनुकूल फोल्डर चुनें", - "set_another": "कोई अन्य फोल्डर चुनें", - "filename_format": "फाइल नाम प्रारूप", - "reset_button": "तयशुदा पर रीसेट", - "items_for_archive": "विन्यास पुरालेख में शामिल करने योग्य आइटम", - "items_desc": "ये सेटिंग्स आवधिक सहेजने पर भी लागू होती हैं", - "icons": "आइकन", - "themes": "थीम", - "fonts": "फॉन्ट", - "backgrounds": "पृष्ठभूमि", - "extensions": "विस्तार", - "desktop_folder": "डेस्कटॉप", - "save_installed_flatpaks": "फ्लैटपैक ऐप्स", - "list": "स्थापित फ्लैटपैक ऐप्स की सूची", - "user_data_flatpak": "स्थापित फ्लैटपैक ऐप्स का उपयोक्ता डेटा", - "flatpaks_data_tittle": "फ्लैटपैक ऐप्स डेटा चयन", - "sync": "समन्वयन", - "sync_desc": "नेटवर्क में अन्य कंप्यूटरों के साथ अपने डेस्कटॉप वातावरण विन्यास को समन्वयित करें।", - "set_up_sync_file": "समन्वयन फाइल निर्धारित करें", - "periodic_saving_file": "आवधिक फाइल सहेजना", - "periodic_sync": "आवधिक समन्वयन", - "m_sync_desc": "अब से, आप शीर्षलेख पट्टी में मेनू से विन्यास को समन्वयित कर सकते हैं", - "sync_manually": "हस्तचालित रूप से समन्वयित करें", - "quit": "छोड़ें", - "keyboard_shortcuts": "कीबोर्ड शॉर्टकट", - "summary": "अपना डेस्कटॉप विन्यास सहेजें", - "description": "Save Desktop आपको एक क्लिक से अपने वर्तमान विन्यास (थीम, आइकन, वॉलपेपर, सभी डेस्कटॉप वातावरण सेटिंग्स, एक्सटेंशन इत्यादि) को सहेजने देता है।", - "translator_credits": "Scrambled777 ", - "archive_encryption": "पुरालेख कूटलेखन", - "archive_encryption_desc": "विन्यास को हस्तचालित रूप से सहेजते समय, आपको पासवर्ड बनाने के लिए कहा जाएगा। यह आपके डेटा की बेहतर सुरक्षा के लिए पोर्टेबल मीडिया में विन्यास को सहेजते समय उपयोगी है।", - "more_options": "अधिक विकल्प", - "pb_interval": "अंतराल", - "create_pwd_desc": "कृपया अपने पुरालेख के लिए नया पासवर्ड बनाएं। मानदंड में कम से कम 12 अक्षर, एक बड़ा अक्षर, एक छोटा अक्षर और एक विशेष वर्ण शामिल है।", - "password_entry": "पासवर्ड", - "check_pwd_desc": "अपने विन्यास के साथ पुरालेख को खोलने के लिए नीचे दिया गया पासवर्ड दर्ज करें। यदि आप इसे भूल गए हैं, तो आप पुरालेख को अनज़िप नहीं कर पाएंगे और अपना विन्यास आयात करना शुरू नहीं कर पाएंगे।", - "check_pwd_title": "पासवर्ड से पुरालेख को खोलें", - "create_pwd_title": "नया पासवर्ड बनाएं", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist।", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer।", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file।", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu।", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com।", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "select": "Select", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup।", - "initial_setup": "Initial synchronization setup", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud।", - "open_wiki": "Open the application wiki", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "save_without_archive": "Save the configuration without creating an archive", - "syncthing_folder": "Use Syncthing folder instead", - "remember_password": "Remember Password", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue।", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization।" -} diff --git a/translations/hu.json b/translations/hu.json deleted file mode 100644 index dbd365a6..00000000 --- a/translations/hu.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Névjegy", - "unsuppurted_env_desc": "Az általad használt környezet nem támogatott. \nKérlek használd a következők valamelyikét: {}.", - "save_config": "Jelenlegi konfiguráció mentése", - "import_config": "Mentett konfiguráció importálása", - "set_filename": "Fájlnév megadása", - "config_saved": "A konfiguráció elmentve!", - "open_folder": "A mappa megnyitása", - "cancel": "Mégsem", - "savedesktop_f": "Save Desktop fájlok", - "config_imported": "A konfigurációt alkalmaztuk!", - "logout": "Kijelentkezés", - "please_wait": "Kérlek várj …", - "summary": "Mentsd el az asztali környezeted jelenlegi konfigurációját", - "description": "Save Desktop lehetővé teszi, hogy egy gombnyomással elmentsd a jelenlegi konfigurációdat (témákat, ikonokat, háttereket, az összes asztali környezeti beállítást, kiegészítéseket, stb.).", - "translator_credits": "Daniel Uhrinyi https://github.com/danieluhrinyi", - "periodic_saving": "Időszakos mentés", - "periodic_saving_desc": "A változtatások csak a következő belépéskor lépnek érvénybe", - "never": "Soha", - "daily": "Naponta", - "weekly": "Hetente", - "monthly": "Havonta", - "import_from_file": "Importálás fájlból", - "save": "Mentés", - "apply": "Alkalmazás", - "learn_more": "Tudj meg többet", - "save_installed_flatpaks": "Flatpak alkalmazások", - "pb_folder": "Időszakos mentések mappája", - "set_pb_folder_tooltip": "Válassz egyéni mappát az időszakos mentéshez", - "set_another": "Válassz másik mappát", - "import_title": "Importálás", - "items_for_archive": "A konfigurációs archívumba felveendő elemek", - "filename_format": "Fájlnév formátum", - "reset_button": "Alaphelyzetbe állítás", - "items_desc": "Ezek a beállítások érvényesek az időszakos mentésekre is", - "icons": "Ikonok", - "themes": "Témák", - "fonts": "Betűtípusok", - "backgrounds": "Hátterek", - "sync": "Szinkronizálás", - "sync_desc": "Szinkronizálja az asztali környezet konfigurációját a hálózat többi számítógépével.", - "set_up_sync_file": "Szinkronizálási fájl beállítása", - "periodic_saving_file": "Szinkronizálási fájl", - "periodic_sync": "Időszakos szinkronizálás", - "manually": "Manuálisan", - "m_sync_desc": "Ezentúl szinkronizálhatod a konfigurációt a fejlécsáv menüjéből", - "user_data_flatpak": "Telepített Flatpak alkalmazások felhasználói adatai", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "extensions": "Extensions", - "sync_manually": "Synchronise manually", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "flatpaks_data_tittle": "Flatpak apps data selection", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "pb_interval": "Interval", - "archive_encryption": "Archive encryption", - "create_pwd_title": "Create new password", - "password_entry": "Password", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "more_options": "More options", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "gen_password": "Generate Password", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "open_wiki": "Open the application wiki", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "remember_password": "Remember Password", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/ia.json b/translations/ia.json deleted file mode 100644 index baf44907..00000000 --- a/translations/ia.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "save": "Save", - "save_config": "Save the current configuration", - "set_filename": "Set the file name", - "items_for_archive": "Items to include in the configuration archive", - "items_desc": "These settings also apply to periodic saving", - "icons": "Icons", - "themes": "Themes", - "fonts": "Fonts", - "backgrounds": "Backgrounds", - "extensions": "Extensions", - "desktop_folder": "Desktop", - "save_installed_flatpaks": "Flatpak apps", - "list": "List of installed Flatpak apps", - "user_data_flatpak": "User data of installed Flatpak apps", - "flatpaks_data_tittle": "Flatpak apps data selection", - "more_options": "More options", - "periodic_saving": "Periodic saving", - "periodic_saving_desc": "Changes will only take effect after the next login", - "pb_interval": "Interval", - "never": "Never", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "manually": "Manually", - "learn_more": "Learn more", - "pb_folder": "Folder for periodic saving", - "set_pb_folder_tooltip": "Choose custom folder for periodic saving", - "set_another": "Choose another folder", - "filename_format": "File name format", - "reset_button": "Reset to default", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "save_without_archive": "Save the configuration without creating an archive", - "create_pwd_title": "Create new password", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "gen_password": "Generate Password", - "password_entry": "Password", - "check_pwd_title": "Unlock the archive with a password", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization.", - "remember_password": "Remember Password", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "saving_config_status": "Saving configuration …\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "config_saved": "Configuration has been saved!", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "open_folder": "Open the folder", - "import_title": "Import", - "import_config": "Import saved configuration", - "import_from_file": "Import from file", - "import_from_folder": "Import from folder", - "cancel": "Cancel", - "savedesktop_f": "Save Desktop files", - "importing_config_status": "Importing configuration …\nImporting configuration from:\n{}\n", - "config_imported": "The configuration has been applied!", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "logout": "Log Out", - "err_occured": "An error occurred", - "apply": "Apply", - "sync": "Sync", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "initial_setup": "Initial synchronization setup", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_section": "2. Go to the Online Accounts section", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "syncthing_folder": "Use Syncthing folder instead", - "almost_done_title": "Almost done!", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "select": "Select", - "next": "Next", - "set_up_sync_file": "Set up the sync file", - "periodic_saving_file": "Periodic saving file", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "create": "Create", - "please_wait": "Please wait …", - "change": "Change", - "connect_cloud_storage": "Connect to the cloud storage", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "select_cloud_folder_btn": "Select the cloud drive folder", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "periodic_sync": "Periodic synchronization", - "bidirectional_sync": "Bidirectional synchronization", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "sync_manually": "Synchronise manually", - "keyboard_shortcuts": "Keyboard shortcuts", - "open_wiki": "Open the application wiki", - "quit": "Quit", - "about_app": "About app", - "unsuppurted_env_desc": "You have an unsupported environment installed. \nPlease use one of these environments: {}.", - "summary": "Save your desktop configuration", - "description": "Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click.", - "translator_credits": "Translator github-link" -} diff --git a/translations/id.json b/translations/id.json deleted file mode 100644 index c220fbfb..00000000 --- a/translations/id.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Tentang aplikasi", - "unsuppurted_env_desc": "Anda telah menginstal lingkungan yang tidak didukung. \nSilakan gunakan salah satu lingkungan berikut: {}.", - "save_config": "Menyimpan konfigurasi saat ini", - "import_config": "Mengimpor konfigurasi yang tersimpan", - "set_filename": "Tetapkan nama file", - "config_saved": "Konfigurasi telah tersimpan!", - "open_folder": "Membuka folder", - "cancel": "Batal", - "savedesktop_f": "SimpanFile desktop", - "config_imported": "Konfigurasi ini telah diterapkan!", - "logout": "Keluar Sesi", - "please_wait": "Harap tunggu…", - "summary": "Simpan konfigurasi lingkungan desktop Anda saat ini", - "description": "Save Desktop memungkinkan Anda menyimpan konfigurasi saat ini (tema, ikon, wallpaper, semua pengaturan lingkungan desktop, ekstensi, dll.) dengan satu klik.", - "translator_credits": "Penerjemah github-tautan", - "periodic_saving": "Simpan berkala", - "periodic_saving_desc": "Perubahan hanya akan berlaku setelah login berikutnya", - "never": "Tidak Pernah", - "daily": "Setiap hari", - "weekly": "Mingguan", - "monthly": "Bulanan", - "import_from_file": "Impor dari file", - "save": "Simpan", - "apply": "Terapkan", - "learn_more": "Pelajari lebih lanjut", - "save_installed_flatpaks": "Aplikasi flatpak", - "pb_folder": "Folder untuk penyimpanan berkala", - "set_pb_folder_tooltip": "Pilih folder khusus untuk penyimpanan berkala", - "set_another": "Pilih folder lain", - "filename_format": "Format nama file", - "import_title": "Impor", - "reset_button": "Setel ulang ke default", - "items_for_archive": "Item yang harus dimasukkan dalam arsip konfigurasi", - "items_desc": "Pengaturan ini juga berlaku untuk penyimpanan berkala", - "icons": "Ikon", - "themes": "Tema", - "fonts": "Font", - "backgrounds": "Latar Belakang", - "sync": "Sinkronisasi", - "sync_desc": "Menyinkronkan konfigurasi lingkungan desktop Anda dengan komputer lain dalam jaringan.", - "set_up_sync_file": "Atur file sinkronisasi", - "periodic_sync": "Sinkronisasi berkala", - "manually": "Manual", - "m_sync_desc": "Mulai sekarang, Anda dapat menyinkronkan konfigurasi dari menu di bilah header", - "periodic_saving_file": "Periodic saving file", - "user_data_flatpak": "User data of installed Flatpak apps", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "extensions": "Extensions", - "sync_manually": "Synchronise manually", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "back_to_page": "Back to previous page", - "flatpaks_data_tittle": "Flatpak apps data selection", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "archive_encryption": "Archive encryption", - "password_entry": "Password", - "pb_interval": "Interval", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Create new password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "save_without_archive": "Save the configuration without creating an archive", - "remember_password": "Remember Password", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "syncthing_folder": "Use Syncthing folder instead", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/it.json b/translations/it.json deleted file mode 100644 index 1f2ad1fb..00000000 --- a/translations/it.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Informazioni sull'app", - "unsuppurted_env_desc": "Hai installato un ambiente non supportato.\nSi prega di utilizzare uno di questi ambienti: {}.", - "save_config": "Salva la configurazione corrente", - "import_config": "Importa la configurazione salvata", - "set_filename": "Impostare il nome file", - "config_saved": "La configurazione è stata salvata!", - "open_folder": "Apri la cartella", - "cancel": "Cancella", - "savedesktop_f": "Salva i file del desktop", - "config_imported": "La configurazione è stata applicata!", - "logout": "Disconnettersi", - "please_wait": "Attendere prego …", - "summary": "Salva la configurazione del tuo desktop", - "description": "Desideri salvare la tua configurazione corrente inclusi temi, icone, sfondi, tutte le impostazioni dell'ambiente desktop, estensioni e così via? Save Desktop può aiutarti in questo. Basta un clic e hai la tua configurazione salvata.", - "translator_credits": "Albano Battistella https://github.com/albanobattistella", - "periodic_saving": "Salvataggio periodico", - "periodic_saving_desc": "Le modifiche avranno effetto solo dopo il prossimo login", - "never": "Mai", - "daily": "Giornaliero", - "weekly": "Settimanale", - "monthly": "Mensile", - "save": "Salva", - "import_from_file": "Importa da file", - "apply": "Applica", - "learn_more": "Ulteriori informazioni", - "save_installed_flatpaks": "App flatpak", - "pb_folder": "Cartella per il salvataggio periodico", - "set_pb_folder_tooltip": "Scegli la cartella personalizzata per il salvataggio periodico", - "set_another": "Scegli un'altra cartella", - "backgrounds": "Sfondi", - "themes": "Temi", - "fonts": "Font", - "import_title": "Importa", - "filename_format": "Formato del nome del file", - "reset_button": "Ripristina le impostazioni predefinite", - "items_for_archive": "Elementi da includere nell'archivio di configurazione", - "items_desc": "Queste impostazioni si applicano anche al salvataggio periodico", - "icons": "Icone", - "sync": "Sincronizzazione", - "sync_desc": "Sincronizza la configurazione del tuo ambiente desktop con altri computer nella rete.", - "set_up_sync_file": "Imposta il file di sincronizzazione", - "periodic_saving_file": "File di salvataggio periodico", - "periodic_sync": "Sincronizzazione periodica", - "manually": "Manualmente", - "m_sync_desc": "D'ora in poi, puoi sincronizzare la configurazione dal menu nella barra dell'intestazione", - "user_data_flatpak": "Dati utente delle app Flatpak installate", - "extensions": "Estensioni", - "keyboard_shortcuts": "Scorciatoie da tastiera", - "quit": "Esci", - "sync_manually": "Sincronizza manualmente", - "list": "Elenco delle app Flatpak installate", - "desktop_folder": "Desktop", - "flatpaks_data_tittle": "Selezione dei dati delle app Flatpak", - "importing_config_status": "Importazione della configurazione…\nImportazione configurazione da:\n{}\n", - "saving_config_status": "Salvataggio della configurazione…\nLa configurazione del tuo ambiente desktop verrà salvata in:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nÈ possibile disconnettersi dal sistema per rendere effettive le modifiche oppure tornare alla pagina precedente e disconnettersi in seguito.\n", - "back_to_page": "Ritorno alla pagina precedente", - "config_saved_desc": "{}\nOra puoi visualizzare l'archivio con la configurazione del tuo ambiente desktop oppure tornare alla pagina precedente.\n", - "archive_encryption": "Cifratura dell'archivio", - "password_entry": "Password", - "pb_interval": "Intervallo", - "archive_encryption_desc": "Quando salvi manualmente la configurazione, ti verrà richiesto di creare una password. Ciò è utile quando si salva la configurazione su un supporto portatile per una migliore sicurezza dei dati.", - "create_pwd_desc": "Crea una nuova password per il tuo archivio. I criteri includono una lunghezza di almeno 12 caratteri, una lettera maiuscola, una lettera minuscola e un carattere speciale.", - "more_options": "Ulteriori opzioni", - "check_pwd_desc": "Inserisci la password qui sotto per sbloccare l'archivio con la tua configurazione. Se l'hai dimenticata, non potrai decomprimere l'archivio e iniziare a importare la tua configurazione.", - "check_pwd_title": "Sblocca l'archivio con una password", - "create_pwd_title": "Crea una nuova password", - "select_cloud_folder_btn": "Seleziona la cartella dell'unità cloud", - "err_occured": "Si è verificato un errore", - "create": "Crea", - "connect_cloud_storage_desc": "Su un altro computer, apri l'app Save Desktop e, in questa pagina, clicca sul pulsante \"Imposta il file di sincronizzazione\" e fai le impostazioni necessarie. Su questo computer, seleziona la cartella che hai sincronizzato con il tuo archivio cloud ed hai anche salvato lo stesso file di salvataggio periodico.", - "bidirectional_sync": "Sincronizzazione bidirezionale", - "connect_cloud_storage": "Connettiti allo storage cloud", - "change": "Modifica", - "periodic_saving_file_err": "Il file di salvataggio periodico non esiste.", - "cloud_folder_err": "Non hai selezionato la cartella dell'unità cloud!", - "gen_password": "Genera Password", - "bidirectional_sync_desc": "Se abilitata e se sono selezionati l'intervallo di sincronizzazione e la cartella dell'unità cloud, le informazioni di salvataggio periodico (intervallo, cartella e nome file) dall'altro computer con sincronizzazione impostata su sincronizza, vengono copiate su questo computer.", - "gnome_oa_section": "2. Vai alla sezione Account online", - "almost_done_title": "Quasi finito!", - "open_wiki": "Apri il wiki dell'applicazione", - "rclone_copy_cmd": "Ora copia il comando per configurare Rclone utilizzando il pulsante laterale e apri l'app terminale utilizzando la scorciatoia da tastiera Ctrl+Alt+T o trovandola nel menu delle app.", - "rclone_cmd_copied_msg": "Una volta terminata la configurazione di Rclone utilizzando il comando fornito, fare clic sul pulsante \"Applica\"", - "gnome_oa_chooser_desc": "La cartella dell'unità cloud creata può essere trovata nel pannello laterale della finestra di dialogo di selezione file, nel seguente formato: nomeutente@servizio.com.", - "next": "Prossimo", - "rclone_intro_desc": "Per far funzionare correttamente la sincronizzazione, devi avere la cartella sincronizzata con il tuo servizio cloud tramite Rclone.\nInizia selezionando il servizio di unità cloud che utilizzi.", - "almost_done_desc": "Ora hai creato la cartella dell'unità cloud! Fai clic sul pulsante Avanti per completare la configurazione.", - "initial_setup": "Configurazione iniziale della sincronizzazione", - "select": "Seleziona", - "gnome_oa_section_desc": "In questa sezione seleziona il servizio cloud desiderato, ad esempio Google, Microsoft 365 o Nextcloud.", - "gnome_oa_settings": "1. Aprire le impostazioni di sistema", - "gnome_oa_chooser": "3. Fare clic sul pulsante Avanti e selezionare la cartella dell'unità cloud creata", - "save_without_archive": "Salvare la configurazione senza creare un archivio", - "pwd_for_encryption": "Password per la crittografia", - "remember_password": "Ricorda password", - "syncthing_folder": "Utilizzare invece la cartella Syncthing", - "password_store_err": "Password non inserita o errata. Impossibile continuare.", - "import_from_folder": "Importa dalla cartella", - "manual_saving": "Salvataggio manuale", - "enter_password_title": "Inserisci una password per sbloccare l'archivio e sincronizzare la configurazione", - "enter_password_desc": "È stato selezionato un archivio crittografato per la sincronizzazione tramite l'app Save Desktop. Inserisci la password qui sotto per sbloccarlo e avviare la sincronizzazione." -} diff --git a/translations/nb_NO.json b/translations/nb_NO.json deleted file mode 100644 index 39cbdf39..00000000 --- a/translations/nb_NO.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Om programmet", - "unsuppurted_env_desc": "Du har et ustøttet miljø installert. \nBruk ett av disse miljøene: {}.", - "save_config": "Lagre nåværende oppsett", - "import_config": "Importer lagret oppsett", - "set_filename": "Sett filnavn (uten mellomrom)", - "config_saved": "Oppsettet har blitt lagret.", - "open_folder": "Åpne mappen", - "cancel": "Avbryt", - "savedesktop_f": "Save Desktop-filer", - "config_imported": "Oppsettet har blitt anvendt.", - "logout": "Logg ut", - "please_wait": "Vent …", - "summary": "Lagre nåværende oppsett av skrivebordsmiljøet ditt", - "description": "Save Desktop lar deg lagre ditt nåværende oppsett (drakter, ikoner, bakgrunnsbilder, alle skrivebordsmiljøinnstillinger, utvidelser, osv.) med ett klikk.", - "translator_credits": "Allan Nordhøy https://github.com/comradekingu", - "periodic_saving": "Periodic saving", - "periodic_saving_desc": "Changes will only take effect after the next login", - "never": "Never", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "import_from_file": "Import from file", - "save": "Save", - "apply": "Apply", - "learn_more": "Learn more", - "save_installed_flatpaks": "Save installed Flatpak apps", - "pb_folder": "Folder for periodic saving", - "set_pb_folder_tooltip": "Choose custom folder for periodic saving", - "set_another": "Choose another folder", - "import_title": "Import", - "filename_format": "File name format", - "reset_button": "Reset to default", - "items_for_archive": "Items to include in the configuration archive", - "items_desc": "These settings also apply to periodic saving", - "icons": "Icons", - "themes": "Themes", - "fonts": "Fonts", - "backgrounds": "Backgrounds", - "sync": "Sync", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "set_up_sync_file": "Set up the sync file", - "periodic_sync": "Periodic synchronization", - "manually": "Manually", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "periodic_saving_file": "Periodic saving file", - "user_data_flatpak": "User data of installed Flatpak apps", - "extensions": "Extensions", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "sync_manually": "Synchronise manually", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "flatpaks_data_tittle": "Flatpak apps data selection", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "pb_interval": "Interval", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "Password", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Create new password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "gen_password": "Generate Password", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "import_from_folder": "Import from folder", - "remember_password": "Remember Password", - "pwd_for_encryption": "Password for encryption", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/nl.json b/translations/nl.json deleted file mode 100644 index 1f53a09c..00000000 --- a/translations/nl.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Over de toepassing", - "unsuppurted_env_desc": "U maakt gebruik van een niet-ondersteunde werkomgeving. \nDe volgende werkomgevingen worden ondersteund: {}.", - "save_config": "Huidige voorkeuren opslaan", - "import_config": "Voorkeuren importeren", - "set_filename": "Geef het bestand een naam", - "config_saved": "De voorkeuren zijn opgeslagen!", - "open_folder": "Map openen", - "cancel": "Annuleren", - "savedesktop_f": "Save Desktop-bestanden", - "config_imported": "De voorkeuren zijn ingesteld!", - "logout": "Afmelden", - "please_wait": "Even geduld…", - "summary": "Sla de huidige voorkeuren van uw werkomgeving op", - "description": "Wilt u uw huidige voorkeuren (thema's, pictogrammen, bureaubladachtergronden, systeemvoorkeuren, uitbreidingen, etc.) opslaan? Save Desktop kan u hierbij helpen. Met slechts één muisklik wordt alles opgeslagen.", - "translator_credits": "https://github.com/Vistaus", - "periodic_saving": "Periodiek opslaan", - "periodic_saving_desc": "Meld u opnieuw aan om de wijzigingen toe te passen", - "never": "Nooit", - "daily": "Iedere dag", - "weekly": "Iedere week", - "monthly": "Iedere maand", - "import_from_file": "Importeren uit bestand", - "save": "Opslaan", - "apply": "Toepassen", - "learn_more": "Meer informatie", - "save_installed_flatpaks": "Flatpaktoepassingen", - "pb_folder": "Periodieke-opslagmap", - "set_pb_folder_tooltip": "Kies een map waarin periodiek reservekopieën dienen te worden bewaard", - "set_another": "Kies een andere map", - "import_title": "Importeren", - "filename_format": "Bestandsnaamopmaak", - "reset_button": "Standaardwaarden", - "items_for_archive": "Items om op te nemen in het voorkeurenarchief", - "items_desc": "Deze voorkeuren zijn ook van toepassing op periodiek opslaan", - "icons": "Pictogrammen", - "themes": "Thema's", - "fonts": "Lettertypen", - "backgrounds": "Achtergronden", - "sync": "Synchronisatie", - "sync_desc": "Synchroniseer uw werkomgevingsvoorkeuren met andere computers op het netwerk.", - "set_up_sync_file": "Synchronisatiebestand instellen", - "periodic_sync": "Periodieke synchronisatie", - "manually": "Handmatig", - "m_sync_desc": "Voortaan kunt u de voorkeuren synchroniseren middels het menu op de kopbalk", - "periodic_saving_file": "Periodiek opgeslagen bestand", - "user_data_flatpak": "Gebruikersgegevens van geïnstalleerde Flatpaktoepassingen", - "keyboard_shortcuts": "Keyboard shortcuts", - "quit": "Quit", - "extensions": "Extensions", - "sync_manually": "Synchronise manually", - "list": "List of installed Flatpak apps", - "desktop_folder": "Desktop", - "flatpaks_data_tittle": "Flatpak apps data selection", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Back to previous page", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "pb_interval": "Interval", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "Password", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Create new password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "remember_password": "Remember Password", - "import_from_folder": "Import from folder", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/pl.json b/translations/pl.json deleted file mode 100644 index a91c82e3..00000000 --- a/translations/pl.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "O aplikacji", - "unsuppurted_env_desc": "You have an unsupported environment installed. \nPlease use one of these environments: {}.", - "save_config": "Zapisz obecną konfigurację", - "import_config": "Importuj zapisaną konfigurację", - "set_filename": "Ustaw nazwę pliku", - "config_saved": "Konfiguracja została zapisana!", - "open_folder": "Otwórz katalog", - "cancel": "Anuluj", - "savedesktop_f": "Pliki Save Desktop", - "config_imported": "The configuration has been applied!", - "logout": "Wyloguj się", - "please_wait": "Proszę czekać…", - "save": "Zapisz", - "import_title": "Importuj", - "apply": "Zastosuj", - "import_from_file": "Importuj z pliku", - "periodic_saving": "Periodic saving", - "periodic_saving_desc": "Changes will only take effect after the next login", - "never": "Nigdy", - "daily": "Codziennie", - "weekly": "Co tydzień", - "monthly": "Co miesiąc", - "manually": "Ręcznie", - "learn_more": "Dowiedz się więcej", - "pb_folder": "Folder for periodic saving", - "set_pb_folder_tooltip": "Choose custom folder for periodic saving", - "set_another": "Wybierz inny katalog", - "filename_format": "Format nazwy pliku", - "reset_button": "Przywróć ustawienia domyślne", - "items_for_archive": "Items to include in the configuration archive", - "items_desc": "These settings also apply to periodic saving", - "icons": "Ikony", - "themes": "Motywy", - "fonts": "Czcionki", - "backgrounds": "Tapety", - "extensions": "Rozszerzenia", - "desktop_folder": "Pulpit", - "save_installed_flatpaks": "Aplikacje Flatpak", - "list": "List of installed Flatpak apps", - "user_data_flatpak": "User data of installed Flatpak apps", - "sync": "Synchronizacja", - "sync_desc": "Sync your desktop environment configuration with other computers in the network.", - "set_up_sync_file": "Set up the sync file", - "periodic_saving_file": "Periodic saving file", - "periodic_sync": "Periodic synchronization", - "m_sync_desc": "From now on, you can sync the config from the menu in the header bar", - "sync_manually": "Synchronizuj ręcznie", - "quit": "Wyjdź", - "keyboard_shortcuts": "Skróty klawiszowe", - "summary": "Zapisz konfigurację swojego pulpitu", - "description": "Save Desktop lets you save your current configuration (themes, icons, wallpapers, all desktop environment settings, extensions, etc.) with one click.", - "translator_credits": "Eryk Michalak gnu.ewm@protonmail.com", - "importing_config_status": "Importing configuration ...\nImporting configuration from: {}\n", - "saving_config_status": "Saving configuration ...\nThe configuration of your desktop environment will be saved in:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nYou can log out of the system for the changes to take effect, or go back to the previous page and log out later.\n", - "back_to_page": "Wróć do poprzedniej strony", - "flatpaks_data_tittle": "Flatpak apps data selection", - "config_saved_desc": "{}\nYou can now view the archive with the configuration of your desktop environment, or return to the previous page.\n", - "pb_interval": "Interval", - "archive_encryption": "Archive encryption", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "Hasło", - "more_options": "Więcej opcji", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "create_pwd_title": "Utwórz nowe hasło", - "create": "Utwórz", - "select_cloud_folder_btn": "Select the cloud drive folder", - "change": "Zmień", - "err_occured": "Wystąpił błąd", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generuj hasło", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "almost_done_title": "Almost done!", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_section": "2. Go to the Online Accounts section", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Dalej", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Wybierz", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "remember_password": "Zapamiętaj hasło", - "import_from_folder": "Importuj z katalogu", - "syncthing_folder": "Use Syncthing folder instead", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "pwd_for_encryption": "Hasło szyfrowania", - "manual_saving": "Ręczne zapisywanie", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/pt.json b/translations/pt.json deleted file mode 100644 index a28917b7..00000000 --- a/translations/pt.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Sobre o app", - "unsuppurted_env_desc": "Tem instalado um ambiente sem suporte. \nPor favor, use um desses ambientes: {}.", - "save_config": "Gravar configuração atual", - "import_config": "Importar configuração gravada", - "set_filename": "Definir o nome do ficheiro", - "saving_config_status": "A gravar a configuração …\nA configuração do seu ambiente de desktop será gravada em:\n{}/{}.sd.tar.gz\n", - "config_saved": "A configuração foi gravada!", - "config_saved_desc": "{}\nAgora pode visualizar o arquivo com a configuração do seu ambiente de desktop, ou retornar à página anterior.\n", - "open_folder": "Abrir a pasta", - "cancel": "Cancelar", - "savedesktop_f": "Ficheiros Save Desktop", - "importing_config_status": "Importando configuração ...\nImportando configuração de:\n{}\n", - "config_imported": "A configuração foi aplicada!", - "config_imported_desc": "{}\nPode encerrar a sessão para que as alterações tenham efeito, ou voltar para a página anterior e encerrar mais tarde.\n", - "back_to_page": "Voltar para a página anterior", - "logout": "Sair", - "please_wait": "Por favor, aguarde…", - "save": "Gravar", - "import_title": "Importar", - "apply": "Aplicar", - "import_from_file": "Importar do ficheiro", - "periodic_saving": "Gravação periódica", - "periodic_saving_desc": "As alterações só terão efeito após o próximo login", - "never": "Nunca", - "daily": "Diariamente", - "weekly": "Semanalmente", - "monthly": "Mensalmente", - "manually": "Manualmente", - "learn_more": "Aprender mais", - "pb_folder": "Pasta para gravação periódica", - "set_pb_folder_tooltip": "Escolha uma pasta para gravar periódicamente", - "set_another": "Escolha outra pasta", - "filename_format": "Formato do nome do ficheiro", - "reset_button": "Restaurar para o padrão", - "items_for_archive": "Itens à serem incluídos no arquivo de configuração", - "items_desc": "Estas configurações também aplicam-se à gravação periódica", - "icons": "Ícones", - "themes": "Temas", - "fonts": "Fontes", - "backgrounds": "Papéis de parede", - "extensions": "Extensões", - "desktop_folder": "Área de Trabalho", - "save_installed_flatpaks": "Apps Flatpak", - "list": "Lista de apps Flatpak instalados", - "user_data_flatpak": "Dados do utilizador de apps Flatpak instalados", - "flatpaks_data_tittle": "Seleção de dados de apps Flatpak", - "sync": "Sincronizar", - "sync_desc": "Sincronize a configuração do seu ambiente de desktop com outros computadores na rede.", - "set_up_sync_file": "Configure o ficheiro de sincronização", - "periodic_saving_file": "Ficheiro de gravação periódica", - "periodic_sync": "Sincronização periódica", - "m_sync_desc": "De agora em diante, pode sincronizar a configuração no menu da barra de cabeçalho", - "sync_manually": "Sincronizar manualmente", - "quit": "Encerrar", - "keyboard_shortcuts": "Atalhos do teclado", - "summary": "Grave a sua configuração da área de trabalho", - "description": "Save Desktop permite gravar a sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um clique.", - "translator_credits": "Trandutor github-link", - "archive_encryption": "Archive encryption", - "password_entry": "Password", - "create_pwd_title": "Create new password", - "pb_interval": "Interval", - "archive_encryption_desc": "When manually saving the configuration, you will be prompted to create a password. This is useful when saving the configuration to portable media for better security of your data.", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "more_options": "More options", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "Unlock the archive with a password", - "select_cloud_folder_btn": "Select the cloud drive folder", - "err_occured": "An error occurred", - "create": "Create", - "change": "Change", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "Connect to the cloud storage", - "cloud_folder_err": "You didn't select the cloud drive folder!", - "gen_password": "Generate Password", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "gnome_oa_section": "2. Go to the Online Accounts section", - "almost_done_title": "Almost done!", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "next": "Next", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "almost_done_desc": "You've now created the cloud drive folder! Click on the Next button to complete the setup.", - "initial_setup": "Initial synchronization setup", - "select": "Select", - "gnome_oa_section_desc": "In this section select the cloud service you want, such as Google, Microsoft 365 or Nextcloud.", - "open_wiki": "Open the application wiki", - "gnome_oa_settings": "1. Open the system settings", - "gnome_oa_chooser": "3. Click on the Next button and select the created cloud drive folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "save_without_archive": "Save the configuration without creating an archive", - "remember_password": "Remember Password", - "syncthing_folder": "Use Syncthing folder instead", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "import_from_folder": "Import from folder", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/pt_BR.json b/translations/pt_BR.json deleted file mode 100644 index 066ee108..00000000 --- a/translations/pt_BR.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Sobre o aplicativo", - "unsuppurted_env_desc": "Você tem instalado um ambiente sem suporte. \nPor favor, use um destes ambientes: {}.", - "save_config": "Salvar configuração atual", - "import_config": "Importar configuração salva", - "set_filename": "Defina o nome do arquivo", - "config_saved": "A configuração foi salva!", - "open_folder": "Abrir a pasta", - "cancel": "Cancelar", - "savedesktop_f": "Arquivos Save Desktop", - "config_imported": "A configuração foi aplicada!", - "logout": "Sair", - "please_wait": "Por favor, aguarde…", - "summary": "Salvar a configuração da sua área de trabalho", - "description": "Save Desktop permite que você salve sua configuração atual (temas, ícones, papéis de parede, todas as configurações da área de trabalho, extensões, etc.) com um único clique.", - "translator_credits": "Felipe Nogueira https://github.com/fnogcps\nIsaac Dias https://hosted.weblate.org/user/IsaacDias/\nFilipe Motta \nEzilei Correia ", - "periodic_saving": "Salvamento periódico", - "periodic_saving_desc": "As alterações só terão efeito após o próximo login", - "never": "Nunca", - "daily": "Diariamente", - "weekly": "Semanalmente", - "monthly": "Mensalmente", - "import_from_file": "Importar do arquivo", - "save": "Salvar", - "apply": "Aplicar", - "learn_more": "Saiba mais", - "save_installed_flatpaks": "Aplicativos Flatpak", - "pb_folder": "Pasta para salvamento periódico", - "set_pb_folder_tooltip": "Escolha uma pasta para salvar periodicamente", - "set_another": "Escolha outra pasta", - "reset_button": "Restaurar para o padrão", - "items_for_archive": "Itens a serem incluídos no arquivo de configuração", - "icons": "Ícones", - "import_title": "Importar", - "filename_format": "Formato do nome do arquivo", - "items_desc": "Estas configurações também se aplicam ao salvamento periódico", - "themes": "Temas", - "fonts": "Fontes", - "backgrounds": "Papéis de parede", - "sync": "Sincronizar", - "sync_desc": "Sincronize a configuração do seu ambiente de desktop com outros computadores na rede.", - "set_up_sync_file": "Configurar o arquivo de sincronização", - "periodic_sync": "Sincronização periódica", - "manually": "Manualmente", - "m_sync_desc": "De agora em diante, você pode sincronizar a configuração no menu da barra de cabeçalho", - "periodic_saving_file": "Arquivo de salvamento periódico", - "user_data_flatpak": "Dados do usuário de aplicativos Flatpak instalados", - "quit": "Encerrar", - "extensions": "Extensões", - "sync_manually": "Sincronizar manualmente", - "list": "Lista de aplicativos Flatpak instalados", - "desktop_folder": "Área de trabalho", - "keyboard_shortcuts": "Atalhos de teclado", - "back_to_page": "Voltar para a página anterior", - "flatpaks_data_tittle": "Seleção de dados de aplicativos Flatpak", - "importing_config_status": "Importando configuração...\nImportando a configuração de:\n{}\n", - "saving_config_status": "Salvando configuração…\nA configuração do seu ambiente de desktop será salva em:\n{}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nVocê pode encerrar a sessão para que as alterações tenham efeito, ou voltar para a página anterior e encerrar mais tarde.\n", - "config_saved_desc": "{}\nAgora você pode visualizar o arquivo com a configuração do seu desktop, ou retornar à página anterior.\n", - "archive_encryption": "Encriptação de arquivo", - "password_entry": "Senha", - "pb_interval": "Intervalo", - "archive_encryption_desc": "Ao salvar manualmente a configuração, o aplicativo solicitará que você crie uma senha. Isso é útil ao salvar a configuração em uma mídia portátil para aumentar a segurança de seus dados.", - "create_pwd_desc": "Por favor, crie uma nova senha para o seu arquivo. Os critérios incluem, pelo menos, 12 caracteres de tamanho, uma letra maiúscula, uma letra minúscula e um caractere especial.", - "more_options": "Mais opções", - "check_pwd_desc": "Insira a senha abaixo para desbloquear o arquivo com a sua configuração. Caso você tenha esquecido, não poderá descompactar o arquivo e começar a importar sua configuração.", - "check_pwd_title": "Desbloqueie o arquivo com uma senha", - "create_pwd_title": "Criar nova senha", - "select_cloud_folder_btn": "Selecionar a pasta da unidade em nuvem", - "cloud_folder_err": "Você não selecionou a pasta da unidade em nuvem!", - "bidirectional_sync_desc": "Se ativado e o intervalo de sincronização e a pasta da unidade na nuvem estiverem selecionados, as informações de salvamento periódico (intervalo, pasta e nome do arquivo) do outro computador, com sincronização definida, serão copiadas para este computador.", - "bidirectional_sync": "Sincronização bidirecional", - "gen_password": "Gerar Senha", - "connect_cloud_storage": "Conectar ao armazenamento em nuvem", - "err_occured": "Ocorreu um erro", - "create": "Criar", - "change": "Alterar", - "periodic_saving_file_err": "O arquivo de salvamento periódico não existe.", - "connect_cloud_storage_desc": "Em outro computador, abra o aplicativo Save Desktop e, nesta página, clique no botão “Configurar o arquivo de sincronização” e faça as configurações necessárias. Neste computador, selecione a pasta que você sincronizou com seu armazenamento em nuvem e também salvou o mesmo arquivo de salvamento periódico.", - "open_wiki": "Abrir o wiki do aplicativo", - "gnome_oa_section": "2. Vá para a seção Contas Online", - "almost_done_title": "Quase pronto!", - "rclone_copy_cmd": "Agora, copie o comando para configurar o Rclone usando o botão lateral e abra o aplicativo do terminal usando o atalho de teclado Ctrl+Alt+T ou encontrando-o no menu de aplicativos.", - "rclone_cmd_copied_msg": "Depois de terminar de configurar o Rclone usando o comando fornecido, clique no botão \"Aplicar\"", - "gnome_oa_chooser_desc": "A pasta da unidade criada na nuvem pode ser encontrada no painel lateral da caixa de diálogo do seletor de arquivos, neste formato: nomedeusuario@service.com.", - "next": "Avançar", - "rclone_intro_desc": "Para que a sincronização funcione corretamente, você precisa ter a pasta que está sincronizada com seu serviço de nuvem usando Rclone.\nComece selecionando o serviço de unidade em nuvem que você usa.", - "almost_done_desc": "Agora você criou a pasta da unidade em nuvem! Clique no botão Avançar para concluir a configuração.", - "initial_setup": "Configuração inicial de sincronização", - "select": "Selecionar", - "gnome_oa_section_desc": "Nesta seção, selecione o serviço de nuvem desejado, como Google, Microsoft 365 ou Nextcloud.", - "gnome_oa_settings": "1. Abra as configurações do sistema", - "gnome_oa_chooser": "3. Clique no botão Avançar e selecione a pasta da unidade criada na nuvem", - "syncthing_folder": "Use Syncthing folder instead", - "remember_password": "Remember Password", - "save_without_archive": "Save the configuration without creating an archive", - "password_store_err": "Password not entered, or it's incorrect. Unable to continue.", - "import_from_folder": "Import from folder", - "pwd_for_encryption": "Password for encryption", - "manual_saving": "Manual saving", - "enter_password_title": "Please enter a password to unlock the archive for sync the configuration", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -} diff --git a/translations/ru.json b/translations/ru.json deleted file mode 100644 index 8a8994e4..00000000 --- a/translations/ru.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "О приложении", - "unsuppurted_env_desc": "У вас установлено неподдерживаемое окружение. \nПожалуйста, используйте одно из этих окружений: {}.", - "save_config": "Сохранить текущую конфигурацию", - "import_config": "Импорт сохраненной конфигурации", - "set_filename": "Задайте имя файла", - "config_saved": "Конфигурация сохранена!", - "open_folder": "Открыть папку", - "cancel": "Отменить", - "savedesktop_f": "Файлы Save Desktop", - "config_imported": "Конфигурация применена!", - "logout": "Выйти", - "please_wait": "Пожалуйста, подождите…", - "summary": "Сохраните конфигурацию вашего окружения рабочего стола", - "description": "Вы хотите сохранить текущую конфигурацию, включая темы, значки, обои, все настройки окружения рабочего стола, расширения и т.д.? Save Desktop поможет вам в этом. Всего один клик - и ваша конфигурация сохранена.", - "translator_credits": "voron \nvolkov ", - "periodic_saving": "Периодическое сохранение", - "periodic_saving_desc": "Изменения вступят в силу после следующего входа в систему", - "never": "Никогда", - "daily": "Ежедневно", - "weekly": "Еженедельно", - "monthly": "Ежемесячно", - "save": "Сохранить", - "apply": "Применить", - "import_from_file": "Импорт из файла", - "learn_more": "Подробнее", - "save_installed_flatpaks": "Приложения Flatpak", - "pb_folder": "Папка для периодических сохранений", - "set_pb_folder_tooltip": "Выберите папку для периодического сохранения", - "set_another": "Выбрать другую папку", - "import_title": "Импорт", - "filename_format": "Формат имени файла", - "reset_button": "Восстановить по умолчанию", - "items_for_archive": "Элементы для включения в архив конфигурации", - "items_desc": "Эти настройки также применяются для периодического сохранения", - "icons": "Иконки", - "themes": "Темы", - "fonts": "Шрифты", - "backgrounds": "Фоны", - "sync": "Синхронизация", - "sync_desc": "Синхронизируйте конфигурацию среды рабочего стола с другими компьютерами в сети.", - "set_up_sync_file": "Настройка файла синхронизации", - "periodic_sync": "Периодическая синхронизация", - "manually": "Вручную", - "m_sync_desc": "Теперь вы можете синхронизировать конфиг из меню в панели заголовка", - "periodic_saving_file": "Файл периодического сохранения", - "user_data_flatpak": "Пользовательские данные установленных приложений Flatpak", - "keyboard_shortcuts": "Комбинации клавиш", - "quit": "Выйти", - "extensions": "Расширения", - "sync_manually": "Синхронизовать вручную", - "list": "Список установленных Flatpak приложений", - "desktop_folder": "Рабочий стол", - "importing_config_status": "Импорт конфигурации ...\nИмпорт конфигурации из: \n{}\n", - "saving_config_status": "Сохранение конфигурации ...\nКонфигурация среды рабочего стола будет сохранена в:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nВы можете выйти из системы, чтобы изменения вступили в силу, или вернуться на предыдущую страницу и выйти из системы позже.\n", - "back_to_page": "Вернуться на предыдущую страницу", - "flatpaks_data_tittle": "Выбор данных приложений Flatpak", - "config_saved_desc": "{}\nТеперь вы можете просмотреть архив с конфигурацией вашей среды рабочего стола или вернуться на предыдущую страницу.\n", - "pb_interval": "Интервал", - "archive_encryption": "Шифрование архива", - "more_options": "Больше опций", - "create_pwd_title": "Создать новый пароль", - "archive_encryption_desc": "При ручном сохранении конфигурации вам будет предложено создать пароль. Это полезно при сохранении конфигурации на переносном носителе для большей безопасности ваших данных.", - "create_pwd_desc": "Пожалуйста, создайте новый пароль для вашего архива. Критерии включают длину не менее 12 символов, одну заглавную букву, одну строчную букву и один специальный символ.", - "password_entry": "Пароль", - "check_pwd_desc": "Введите пароль ниже, чтобы разблокировать архив с вашей конфигурацией. Если вы его забыли, то не сможете распаковать архив и начать импорт вашей конфигурации.", - "check_pwd_title": "Разблокировать архив паролем", - "select_cloud_folder_btn": "Выбрать папку облачного диска", - "err_occured": "Произошла ошибка", - "create": "Создать", - "change": "Изменить", - "bidirectional_sync": "Двунаправленная синхронизация", - "cloud_folder_err": "Вы не выбрали папку облачного диска!", - "gen_password": "Сгенерировать пароль", - "periodic_saving_file_err": "Файл периодического сохранения не существует.", - "bidirectional_sync_desc": "Если этот параметр включен, а интервал синхронизации и папка облачного диска выбраны, информация о периодическом сохранении (интервал, папка и имя файла) с другого компьютера, на котором настроена синхронизация, копируется на этот компьютер.", - "connect_cloud_storage_desc": "На другом компьютере откройте приложение Save Desktop и на этой странице нажмите кнопку «Настроить файл синхронизации» и выполните необходимые настройки. На этом компьютере выберите папку, которую вы синхронизировали с вашим облачным хранилищем, а также сохранили тот же файл периодического сохранения.", - "connect_cloud_storage": "Подключить облачное хранилище", - "next": "Далее", - "gnome_oa_section": "2. Перейдите в раздел «Сетевые учётные записи»", - "almost_done_title": "Почти готово!", - "rclone_copy_cmd": "Теперь скопируйте команду для настройки Rclone с помощью боковой кнопки и откройте приложение терминала, используя комбинацию клавиш Ctrl+Alt+T или найдя его в меню приложений.", - "rclone_cmd_copied_msg": "Завершив настройку Rclone с помощью данной команды, нажмите кнопку «Применить»", - "rclone_intro_desc": "Для правильного функционирования синхронизации необходимо иметь папку, которая синхронизируется с облачным сервисом с помощью Rclone.\nНачните с выбора облачного сервиса, который вы используете.", - "gnome_oa_chooser_desc": "Создаваемую папку облачного диска можно найти в боковой панели диалога выбора файлов в виде username@service.com.", - "almost_done_desc": "Теперь вы создали папку на облачном диске! Чтобы завершить настройку, нажмите кнопку «Далее».", - "select": "Выбрать", - "initial_setup": "Первоначальная настройка синхронизации", - "gnome_oa_section_desc": "В этом разделе выберите нужный облачный сервис, например Google, Microsoft 365 или Nextcloud.", - "open_wiki": "Открыть Wiki-страницу приложения", - "gnome_oa_settings": "1. Откройте системные настройки", - "gnome_oa_chooser": "3. Нажмите кнопку «Далее» и выберите имеющуюся папку облачного диска", - "remember_password": "Запомнить Пароль", - "syncthing_folder": "Вместо этого использовать папку Syncthing", - "save_without_archive": "Сохранить конфигурацию без создания архива", - "password_store_err": "Пароль не введен или указан неверно. Невозможно продолжить", - "import_from_folder": "Импорт из папки", - "pwd_for_encryption": "Пароль для шифрования", - "manual_saving": "Ручное сохранение", - "enter_password_title": "Пожалуйста, введите пароль, чтобы разблокировать архив для синхронизации конфигурации", - "enter_password_desc": "Для синхронизации с помощью приложения Save Desktop выбран зашифрованный архив. Введите пароль ниже, чтобы разблокировать его и начать синхронизацию." -} diff --git a/translations/sv.json b/translations/sv.json deleted file mode 100644 index be0906bf..00000000 --- a/translations/sv.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Om programmet", - "unsuppurted_env_desc": "Du har en miljö som inte stöds installerad. \nVänligen använd någon av dessa miljöer: {}.", - "save_config": "Spara nuvarande konfiguration", - "import_config": "Importera sparad konfiguration", - "set_filename": "Ange filnamn", - "saving_config_status": "Sparar konfiguration …\nKonfigurationen av din skrivbordsmiljö kommer att sparas i:\n {}/{}.sd.tar.gz\n", - "config_saved": "Konfigurationen har sparats!", - "config_saved_desc": "{}\nDu kan nu se arkivet med konfigurationen av din skrivbordsmiljö, eller gå tillbaka till föregående sida.\n", - "open_folder": "Öppna mappen", - "cancel": "Avbryt", - "savedesktop_f": "Save Desktop filer", - "importing_config_status": "Importerar konfiguration …\nImporterar konfiguration från:\n{}\n", - "config_imported": "Konfigurationen har tillämpats!", - "config_imported_desc": "{}\nDu kan logga ut från systemet för att ändringarna ska träda i kraft, eller gå tillbaka till föregående sida och logga ut senare.\n", - "back_to_page": "Tillbaka till föregående sida", - "logout": "Logga ut", - "err_occured": "Ett fel har uppstått", - "save": "Spara", - "import_title": "Importera", - "import_from_file": "Importera från fil", - "apply": "Tillämpa", - "periodic_saving": "Periodiskt sparande", - "periodic_saving_desc": "Ändringar träder i kraft först efter nästa inloggning", - "pb_interval": "Intervall", - "never": "Aldrig", - "daily": "Dagligen", - "weekly": "Veckovis", - "monthly": "Månadsvis", - "manually": "Manuellt", - "learn_more": "Läs mer", - "pb_folder": "Mapp för periodiskt sparande", - "set_pb_folder_tooltip": "Välj anpassad mapp för periodiskt sparande", - "set_another": "Välj en annan mapp", - "filename_format": "Filnamnsformat", - "reset_button": "Återställ till standard", - "items_for_archive": "Objekt som ska inkluderas i konfigurationsarkivet", - "items_desc": "Dessa inställningar gäller även för periodiskt sparande", - "icons": "Ikoner", - "themes": "Teman", - "fonts": "Teckensnitt", - "backgrounds": "Bakgrunder", - "extensions": "Tillägg", - "desktop_folder": "Skrivbord", - "save_installed_flatpaks": "Flatpak program", - "list": "Lista av installerade Flatpak program", - "user_data_flatpak": "Användardata av installerade Flatpak program", - "flatpaks_data_tittle": "Dataval för Flatpak program", - "sync": "Synkronisera", - "sync_desc": "Synkronisera konfigurationen av din skrivbordsmiljö med andra datorer i nätverket.", - "initial_setup": "Inledande synkroniseringsinställningar", - "gnome_oa_settings": "1. Öppna systeminställningarna", - "gnome_oa_section": "2. Gå till avsnittet Onlinekonton", - "gnome_oa_section_desc": "I det här avsnittet väljer du den molntjänst du vill ha, till exempel Google, Microsoft 365 eller Nextcloud.", - "gnome_oa_chooser": "3. Klicka på knappen Nästa och välj den skapade molnlagringsmappen", - "gnome_oa_chooser_desc": "Den skapade molnlagringsmappen finns i sidopanelen i filväljardialogrutan, i denna form: användarnamn@service.com.", - "rclone_intro_desc": "För att synkroniseringen ska fungera korrekt måste du ha mappen som är synkroniserad med din molntjänst med hjälp av Rclone.\nBörja med att välja den molnlagringstjänst du använder.", - "rclone_copy_cmd": "Kopiera nu kommandot för att ställa in Rclone med hjälp av sidoknappen och öppna terminalappen med kortkommandot Ctrl+Alt+T eller leta reda på det i programmenyn.", - "rclone_cmd_copied_msg": "När du har slutfört konfigureringen av Rclone med det angivna kommandot klickar du på \"Verkställ\" knappen", - "almost_done_title": "Nästan klart!", - "almost_done_desc": "Du har nu skapatmolnenhet mappen! Klicka på nästa för att slutföra installationen.", - "select": "Välj", - "next": "Nästa", - "set_up_sync_file": "Ställ in synkfil", - "periodic_saving_file": "Periodisk sparfil", - "periodic_saving_file_err": "Periodisk sparfil existerar inte.", - "create": "Skapa", - "please_wait": "Vänligen vänta …", - "change": "Ändra", - "connect_cloud_storage": "Anslut till molnlagring", - "connect_cloud_storage_desc": "På den andra datorn öppnar du Save Desktop programmet och på den här sidan klickar du på knappen \"Konfigurera synkroniseringsfil\" och gör nödvändiga inställningar. På den här datorn väljer du mappen som du har synkroniserat med din molnlagring och som även har sparat samma periodiska sparfil.", - "select_cloud_folder_btn": "Välj mappen i molnlagring", - "cloud_folder_err": "Du valde inte mappen för molnlagring!", - "periodic_sync": "Periodisk synkronisering", - "bidirectional_sync": "Dubbelriktad synkronisering", - "bidirectional_sync_desc": "Om det är aktiverat och synkroniseringsintervallet och mappen för molnlagring är vald, kopieras den periodiska sparinformationen (intervall, mapp och filnamn) från den andra datorn med synkronisering inställd på att synkronisera till den här datorn.", - "m_sync_desc": "Från och med nu kan du synkronisera konfigurationen från menyn i huvudfältet", - "sync_manually": "Synkronisera manuellt", - "keyboard_shortcuts": "Tangentbordsgenvägar", - "open_wiki": "Öppna programmets wiki", - "quit": "Avsluta", - "more_options": "Mer alternativ", - "archive_encryption": "Arkivkryptering", - "archive_encryption_desc": "När du sparar konfigurationen manuellt blir du ombedd att skapa ett lösenord. Detta är användbart när du sparar konfigurationen på flyttbart media för bättre säkerhet för din data.", - "create_pwd_title": "Skapa nytt lösenord", - "create_pwd_desc": "Skapa ett nytt lösenord för ditt arkiv. Kriterier inkluderar en längd på minst 12 tecken, en stor bokstav, en liten bokstav och ett specialtecken.", - "gen_password": "Generera lösenord", - "password_entry": "Lösenord", - "check_pwd_title": "Lås upp arkivet med ett lösenord", - "check_pwd_desc": "Ange lösenordet nedan för att låsa upp arkivet med din konfiguration. Om du har glömt det kommer du inte att kunna packa upp arkivet och börja importera din konfiguration.", - "summary": "Spara din skrivbordskonfiguration", - "description": "Save Desktop låter dig spara din nuvarande konfiguration (teman, ikoner, bakgrundsbilder, alla skrivbordsmiljöinställningar, tillägg, etc.) med ett klick.", - "translator_credits": "Luna Jernberg https://github.com/bittin/", - "save_without_archive": "Spara konfigurationen utan att skapa ett arkiv", - "syncthing_folder": "Använd Syncthing mapp istället", - "remember_password": "Kom ihåg lösenord", - "password_store_err": "Lösenordet är inte inmatat, eller så är det felaktigt. Det går inte att fortsätta.", - "import_from_folder": "Importera från mapp", - "pwd_for_encryption": "Lösenord för kryptering", - "manual_saving": "Manuell sparning", - "enter_password_title": "Ange ett lösenord för att låsa upp arkivet för att synkronisera konfigurationen.", - "enter_password_desc": "Ett krypterat arkiv har valts ut för synkronisering med Save Desktop programmet. Ange lösenordet nedan för att låsa upp det och starta synkroniseringen." -} diff --git a/translations/ta.json b/translations/ta.json deleted file mode 100644 index c8eed993..00000000 --- a/translations/ta.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "பயன்பாடுபற்றி", - "unsuppurted_env_desc": " உங்களிடம் ஆதரிக்கப்படாத சூழல் நிறுவப்பட்டுள்ளது. \nஇந்தச் சூழல்களில் ஒன்றைப் பயன்படுத்தவும்: {}.", - "save_config": "தற்போதைய உள்ளமைவைச் சேமி", - "import_config": "இறக்குமதி சேமிக்கப்பட்ட உள்ளமைவு", - "set_filename": "கோப்புப் பெயரை அமை", - "saving_config_status": " உள்ளமைவைச் சேமித்தல்… \n உங்கள் பணிமேடை சூழலின் உள்ளமைவு சேமிக்கப்படும்:\n {}/{}. Sd.tar.gz \n", - "config_saved": "உள்ளமைவு சேமிக்கப்பட்டது!", - "config_saved_desc": " {} \n உங்கள் பணிமேடை சூழலின் உள்ளமைவுடன் காப்பகத்தை இப்போது காணலாம் அல்லது முந்தைய பக்கத்திற்குத் திரும்பலாம்.\n", - "open_folder": "கோப்புறையைத் திற", - "cancel": "கைவிடு", - "savedesktop_f": "சேமிபணிமேடை கோப்புகள்", - "importing_config_status": " உள்ளமைவை இறக்குமதி செய்தல்… \n இதிலிருந்து உள்ளமைவை இறக்குமதி செய்தல்:\n {} \n", - "config_imported": "உள்ளமைவு பயன்படுத்தப்பட்டது!", - "config_imported_desc": " {} \n மாற்றங்கள் நடைமுறைக்கு வர நீங்கள் கணினியிலிருந்து வெளியேறலாம், அல்லது முந்தைய பக்கத்திற்குச் சென்று பின்னர் வெளியேறலாம்.\n", - "back_to_page": "முந்தைய பக்கத்திற்குத் திரும்பு", - "logout": "விடுபதிகை", - "err_occured": "பிழை ஏற்பட்டது", - "save": "சேமி", - "import_title": "இறக்குமதி", - "import_from_file": "கோப்பிலிருந்து இறக்குமதி", - "apply": "இடு", - "periodic_saving": "அவ்வப்போது சேமி", - "periodic_saving_desc": "அடுத்த உள்நுழைவுக்குப் பிறகுதான் மாற்றங்கள் நடைமுறைக்கு வரும்", - "pb_interval": "இடைவேளை", - "never": "ஒருபோதும்", - "daily": "நாள்தோறும்", - "weekly": "வாராந்தோறும்", - "monthly": "திங்கள்தோறும்", - "manually": "கைமுறையாக", - "learn_more": "மேலும் அறிக", - "pb_folder": "அவ்வப்போது சேமிப்பதற்கான கோப்புறை", - "set_pb_folder_tooltip": "அவ்வப்போது சேமிக்க தனிப்பயன் கோப்புறையைத் தேர்வுசெய்க", - "set_another": "மற்றொரு கோப்புறையைத் தேர்வுசெய்க", - "filename_format": "கோப்புப் பெயர் வடிவம்", - "reset_button": "இயல்புநிலைக்கு மீட்டமை", - "items_for_archive": "உள்ளமைவு காப்பகத்தில் சேர்க்க வேண்டிய உருப்படிகள்", - "items_desc": "இந்த அமைப்புகள் அவ்வப்போது சேமிப்பதற்கும் பொருந்தும்", - "icons": "சின்னங்கள்", - "themes": "கருப்பொருள்கள்", - "fonts": "எழுத்துருக்கள்", - "backgrounds": "பின்னணிகள்", - "extensions": "நீட்டிப்புகள்", - "desktop_folder": "பணிமேடை", - "save_installed_flatpaks": "தட்டைகட்டு பயன்பாடுகள்", - "list": "நிறுவப்பட்ட தட்டைகட்டு பயன்பாடுகளின் பட்டியல்", - "user_data_flatpak": "நிறுவப்பட்ட தட்டைகட்டு பயன்பாடுகளின் பயனர் தரவு", - "flatpaks_data_tittle": "தட்டைகட்டு பயன்பாடுகள் தரவுத் தேர்வு", - "sync": "ஒத்திசைவு", - "sync_desc": "இணைப்பில் உள்ள பிற கணினிகளுடன் உங்கள் பணிமேடை சூழல் உள்ளமைவை ஒத்திசை.", - "initial_setup": "ஆரம்ப ஒத்திசைவு அமைப்பு", - "gnome_oa_settings": "1. கணினி அமைப்புகளைத் திற", - "gnome_oa_section": "2. நிகழ்நிலை கணக்குகள் பகுதிக்குச் செல்", - "gnome_oa_section_desc": "இந்தப் பிரிவில் கூகிள், நுண்மென் 365 அல்லது அடுத்தமுகில் போன்ற நீங்கள் விரும்பும் முகில் சேவையைத் தேர்ந்தெடு.", - "gnome_oa_chooser": "3. அடுத்த பொத்தானைக் சொடுக்கு செய்து உருவாக்கிய முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடு", - "gnome_oa_chooser_desc": "உருவாக்கப்பட்ட முகில் இயக்கிக் கோப்புறையை கோப்புத் தேர்வு உரையாடலின் பக்க பலைகையில் இந்தப் படிவத்தில் காணலாம்: USERNAME@SERVICE.com.", - "rclone_intro_desc": "சரியாக வேலை செய்ய ஒத்திசைவு, நீங்கள் கோப்புறையை வைத்திருக்க வேண்டும், அது ஆர்நகலியைப் பயன்படுத்தி உங்கள் முகில் சேவையுடன் ஒத்திசைக்கப்படுகிறது.\n நீங்கள் பயன்படுத்தும் முகில் இயக்கிச் சேவையைத் தேர்ந்தெடுப்பதன் மூலம் தொடங்கு. ", - "rclone_copy_cmd": "இப்போது, பக்க பொத்தானைப் பயன்படுத்தி ஆர்நகலியை அமைக்கக் கட்டளையை நகலெடுத்து, கட்டு+மாற்று+ஏ விசைப்பலகை குறுக்குவழியைப் பயன்படுத்தி முனையப் பயன்பாட்டைத் திற அல்லது பயன்பாடுகளின் பட்டியலில் கண்டுபிடி.", - "rclone_cmd_copied_msg": "வழங்கப்பட்ட கட்டளையைப் பயன்படுத்தி ஆர்நகலியை அமைத்ததும், \"இடு\" பொத்தானைக் சொடுக்கு", - "almost_done_title": "கிட்டத்தட்ட முடிந்தது!", - "almost_done_desc": "நீங்கள் இப்போது முகில் இயக்கிக் கோப்புறையை உருவாக்கியுள்ளீர்கள்! அமைப்பை முடிக்க அடுத்த பொத்தானைக் சொடுக்கு.", - "select": "தேர்ந்தெடு", - "next": "அடுத்தது", - "set_up_sync_file": "ஒத்திசைவு கோப்பை அமை", - "periodic_saving_file": "அவ்வப்போது சேமிக்கும் கோப்பு", - "periodic_saving_file_err": "அவ்வப்போது சேமிக்கும் கோப்பு இல்லை.", - "create": "உருவாக்கு", - "please_wait": "தயவுசெய்து காத்திரு…", - "change": "மாற்றம்", - "connect_cloud_storage": "முகில் சேமிப்பகத்துடன் இணை", - "connect_cloud_storage_desc": "மற்றொரு கணினியில், சேமிபணிமேடை பயன்பாட்டைத் திறந்து, இந்தப் பக்கத்தில், \"ஒத்திசைவு கோப்பை அமைக்கவும்\" பொத்தானைக் சொடுக்கு செய்து தேவையான அமைப்புகளை உருவாக்கவும். இந்தக் கணினியில், உங்கள் மேகக்கணி சேமிப்பகத்துடன் நீங்கள் ஒத்திசைத்த கோப்புறையைத் தேர்ந்தெடுக்கவும், அதே கால சேமிப்பு கோப்பையும் சேமித்துள்ளீர்கள்.", - "select_cloud_folder_btn": "முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடு", - "cloud_folder_err": "நீங்கள் முகில் இயக்கிக் கோப்புறையைத் தேர்ந்தெடுக்கவில்லை!", - "periodic_sync": "அவ்வப்போது ஒத்திசைவு", - "bidirectional_sync": "இருதரப்பு ஒத்திசைவு", - "bidirectional_sync_desc": "இயக்கப்பட்டிருந்தால், மற்றும் ஒத்திசைவு இடைவெளி மற்றும் முகில் இயக்கிக் கோப்புறை தேர்ந்தெடுக்கப்பட்டால், ஒத்திசைவதற்கு அமைக்கப்பட்ட பிற கணினியிலிருந்து அவ்வப்போது சேமிக்கும் செய்தி (இடைவெளி, கோப்புறை மற்றும் கோப்புப் பெயர்) இந்தக் கணினியில் நகலெடுக்கப்படுகிறது.", - "m_sync_desc": "இனிமேல், தலைப்பு பட்டியில் உள்ள பட்டியலிருந்து உள்ளமைவை ஒத்திசைக்கலாம்", - "sync_manually": "கைமுறையாக ஒத்திசை", - "keyboard_shortcuts": "விசைப்பலகை குறுக்குவழிகள்", - "open_wiki": "பயன்பாட்டு விக்கியைத் திற", - "quit": "வெளியேறு", - "more_options": "மேலும் விருப்பங்கள்", - "archive_encryption": "காப்பக குறியாக்கம்", - "archive_encryption_desc": "உள்ளமைவை கைமுறையாகச் சேமிக்கும்போது, கடவுச்சொல்லை உருவாக்கும்படி கேட்கப்படுவீர்கள். உங்கள் தரவின் சிறந்த பாதுகாப்பிற்காக உள்ளமைவை எடுத்துசெல்லதக்க ஊடகத்தில் சேமிக்கும்போது இது பயனுள்ளதாக இருக்கும்.", - "create_pwd_title": "புதிய கடவுச்சொல்லை உருவாக்கு", - "create_pwd_desc": "உங்கள் காப்பகத்திற்கு புதிய கடவுச்சொல்லை உருவாக்கு. அளவுகோல்கள் குறைந்தது 12 எழுத்து நீளம், ஒரு பெரிய எழுத்து, ஒரு சிறிய எழுத்து மற்றும் ஒரு சிறப்பு எழுத்து ஆகியவை அடங்கும்.", - "gen_password": "கடவுச்சொல்லை உருவாக்கு", - "password_entry": "கடவுச்சொல்", - "check_pwd_title": "கடவுச்சொல் மூலம் காப்பகத்தைத் திற", - "check_pwd_desc": "உங்கள் உள்ளமைவுடன் காப்பகத்தைத் திறக்கக் கீழே உள்ள கடவுச்சொல்லை உள்ளிடவும். நீங்கள் அதை மறந்துவிட்டால், நீங்கள் காப்பகத்தை அவிழ்த்து உங்கள் உள்ளமைவை இறக்குமதி செய்யத் தொடங்க முடியாது.", - "summary": "உங்கள் பணிமேடை உள்ளமைவைச் சேமி", - "description": "உங்கள் தற்போதைய உள்ளமைவை (கருப்பொருள்கள், சின்னங்கள், பின்ணணிகள், அனைத்து பணிமேடை சுற்றுச்சூழல் அமைப்புகள், நீட்டிப்புகள் போன்றவை) ஒரே சொடுக்கில் சேமிக்க சேமிபணிமேடை உங்களை அனுமதிக்கிறது.", - "translator_credits": "தமிழ்நேரம் ", - "pwd_for_encryption": "குறியாக்கத்திற்கான கடவுச்சொல்", - "manual_saving": "கையேடு சேமிப்பு", - "remember_password": "கடவுச்சொல்லை நினைவில் கொள்", - "import_from_folder": "கோப்புறையிலிருந்து இறக்குமதி", - "syncthing_folder": "அதற்குப் பதிலாக ஒத்திசைவு கோப்புறையைப் பயன்படுத்தவும்", - "save_without_archive": "காப்பகத்தை உருவாக்காமல் உள்ளமைவைச் சேமி", - "password_store_err": "கடவுச்சொல் உள்ளிடப்படவில்லை, அல்லது அது தவறானது. தொடர முடியவில்லை.", - "enter_password_title": "உள்ளமைவை ஒத்திசைக்க காப்பகத்தைத் திறக்கக் கடவுச்சொல்லை உள்ளிடவும்", - "enter_password_desc": "Savedesktop பயன்பாட்டைப் பயன்படுத்தி ஒத்திசைவுக்கு மறைகுறியாக்கப்பட்ட காப்பகம் தேர்ந்தெடுக்கப்பட்டுள்ளது. அதைத் திறக்கக் கீழே உள்ள கடவுச்சொல்லை உள்ளிடவும் மற்றும் ஒத்திசைவைத் தொடங்கவும்." -} diff --git a/translations/tr.json b/translations/tr.json deleted file mode 100644 index 2b597a07..00000000 --- a/translations/tr.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Uygulama Hakkında", - "unsuppurted_env_desc": "Daha önceden yüklenmiş , desteklenmeyen ortama sahipsiniz. \nLütfen bu ortamlardan herhangi birini kullanın.: {}.", - "save_config": "Şuanki ayarları kaydet", - "import_config": "Kaydedilmiş ayarları yükle", - "set_filename": "Dosya adı", - "config_saved": "Ayarlar kayıt edildi!", - "open_folder": "Klasörü aç", - "cancel": "İptal et", - "savedesktop_f": "Save Desktop dosyaları", - "config_imported": "Ayarlar uygulandı !", - "logout": "Çıkış Yap", - "please_wait": "Lütfen bekleyin …", - "summary": "Masaüstü yapılandırmanızı kaydedin", - "description": "Save Desktop senin suanki ayarlarını(temalar,iconlar,duvar kağıtları, tüm masaüstü ortam ayları , eklentiler , vb.) tek tıkla kaydetmene izin verir.", - "translator_credits": "Batmanly https://github.com/batmanly\nSabri Ünal https://github.com/yakushabb", - "periodic_saving": "Düzenli kaydetme", - "periodic_saving_desc": "Değişiklikler yalnızca sonraki oturum açma işleminden sonra geçerli olacak", - "never": "Asla", - "daily": "Günlük", - "weekly": "Haftalık", - "monthly": "Aylık", - "import_from_file": "Dosyadan içe aktar", - "save": "Kaydet", - "apply": "Uygula", - "learn_more": "Daha çoğunu öğren", - "save_installed_flatpaks": "Flatpak uygulamaları", - "pb_folder": "Düzenli kayıt klasörü", - "set_pb_folder_tooltip": "Düzenli kayıt için özel klasör seçin", - "set_another": "Başka bir klasör seçin", - "import_title": "İçe Aktar", - "items_desc": "Bu ayarlar aynı zamanda düzenli kayıt için de uygulanır", - "themes": "Temalar", - "fonts": "Yazı Tipleri", - "backgrounds": "Arka Planlar", - "filename_format": "Dosya adı biçimi", - "reset_button": "Öntanımlılara sıfırla", - "items_for_archive": "Yapılandırma arşivine eklenecek ögeler", - "icons": "Simgeler", - "sync": "Eşzamanla", - "sync_desc": "Masaüstü ortamı yapılandırmanızı ağdaki diğer bilgisayarlarla eşzamanlayın.", - "set_up_sync_file": "Eşzamanlama dosyası ayarla", - "periodic_sync": "Düzenli eşzamanlama", - "manually": "Elle", - "m_sync_desc": "Artık yapılandırmayı başlık çubuğundaki menüden eşzamanlayabilirsiniz", - "periodic_saving_file": "Düzenli kayıt dosyası", - "user_data_flatpak": "Kurulu Flatpak uygulamalarının kullanıcı verileri", - "keyboard_shortcuts": "Klavye kısayolları", - "quit": "Çık", - "extensions": "Uzantılar", - "sync_manually": "Elle eşzamanla", - "list": "Kurulu Flatpak uygulamalarının listesi", - "desktop_folder": "Masaüstü", - "flatpaks_data_tittle": "Flatpak uygulamaları veri seçimi", - "importing_config_status": "Yapılandırma içe aktarılıyor...\nYapılandırma şuradan içe aktarılıyor:\n{}\n", - "saving_config_status": "Yapılandırma kaydediliyor…\nMasaüstü ortamınızın yapılandırması şuraya kaydedilecek:\n{}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nDeğişikliklerin geçerli olması için oturumu şimdi kapatabilir ya da önceki sayfaya geri dönüp daha sonra oturumu kapatabilirsiniz.\n", - "back_to_page": "Önceki sayfaya dön", - "config_saved_desc": "{}\nArtık arşivi masaüstü ortamınızın yapılandırmasıyla görüntüleyebilir ya da önceki sayfaya dönebilirsiniz.\n", - "create_pwd_title": "Yeni parola oluştur", - "password_entry": "Parola", - "check_pwd_desc": "Yapılandırmanızın bulunduğu arşivin kilidini açmak için aşağıya parolayı girin. Parolayı unuttuysanız, arşivi açamaz ve yapılandırmanızı içe aktarmaya başlayamazsınız.", - "pb_interval": "Aralık", - "archive_encryption": "Arşiv şifreleme", - "archive_encryption_desc": "Yapılandırmayı elle kaydederken parola oluşturmanız istenir. Bu, verilerinizin daha iyi güvenliği için yapılandırmayı taşınabilir ortama kaydederken kullanışlıdır.", - "create_pwd_desc": "Lütfen arşiviniz için yeni parola oluşturun. Parolanız en az 12 karakter uzunluğunda olmalı, bir büyük harf, bir küçük harf ve bir özel karakter içermelidir.", - "more_options": "Daha çok seçenek", - "check_pwd_title": "Arşiv kilidini parolayla aç", - "select_cloud_folder_btn": "Bulut sunucu klasörünü seç", - "err_occured": "Hata oluştu", - "create": "Oluştur", - "change": "Değiştir", - "periodic_saving_file_err": "Düzenli kayıt dosyası yok.", - "gen_password": "Parola Oluştur", - "cloud_folder_err": "Bulut sürücü klasörünü seçmediniz!", - "bidirectional_sync_desc": "Etkinse ve eşzamanlama aralığı ve bulut sürücü klasörü seçilirse, eşzamanlama ayarlı diğer bilgisayardaki düzenli kayıt bilgileri (aralık, klasör ve dosya adı) bu bilgisayara kopyalanır.", - "connect_cloud_storage_desc": "Başka bilgisayarda Save Desktop uygulamasını açıp bu sayfadaki “Eşzamanlama dosyasını ayarla” düğmesine tıklayın ve gerekli ayarları yapın. Bu bilgisayarda, bulut depolama alanınızla eşzamanlamak istediğiniz ve aynı düzenli kayıt dosyasına kaydettiğiniz klasörü seçin.", - "bidirectional_sync": "Çift yönlü eşzamanlama", - "connect_cloud_storage": "Bulut depolamaya bağlan", - "open_wiki": "Uygulama wiki'sini açın", - "gnome_oa_section": "2. Çevrimiçi Hesaplar bölümüne gidin", - "almost_done_title": "Az kaldı!", - "rclone_copy_cmd": "Şimdi, yan düğmeyi kullanarak Rclone'ı kurmak için komutu kopyalayın ve Ctrl+Alt+T klavye kısayolunu kullanarak veya uygulamalar menüsünden terminal uygulamasını açın.", - "rclone_cmd_copied_msg": "Verilen komutu kullanarak Rclone kurulumunu tamamladıktan sonra \"Uygula\" düğmesine tıklayın", - "gnome_oa_chooser_desc": "Oluşturulan bulut sürücü klasörü, dosya seçici iletişim kutusunun yan panelinde, şu biçimde bulunabilir: kullanıcıadı@sunucu.com.", - "next": "Sürdür", - "rclone_intro_desc": "Senkronizasyonun düzgün çalışması için, Rclone kullanarak bulut servisinizle senkronize edilmiş klasöre sahip olmanız gerekir.\nKullandığınız bulut sürücü servisini seçerek başlayın.", - "almost_done_desc": "Bulut sürücü klasörünü oluşturdunuz! Kurulumu tamamlamak için İleri düğmesine tıklayın.", - "initial_setup": "İlk senkronizasyon kurulumu", - "select": "Seç", - "gnome_oa_section_desc": "Bu bölümde Google, Microsoft 365 veya Nextcloud gibi istediğiniz bulut hizmetini seçin.", - "gnome_oa_settings": "1. Sistem ayarlarını açın.", - "gnome_oa_chooser": "3. İleri düğmesine tıklayın ve oluşturulan bulut sürücü klasörünü seçin", - "pwd_for_encryption": "Şifreleme için parola", - "save_without_archive": "Arşiv oluşturmadan yapılandırmayı kaydedin", - "enter_password_title": "Yapılandırmayı senkronize etmek için arşivin kilidini açmak üzere lütfen bir parola girin", - "syncthing_folder": "Bunun yerine Syncthing klasörünü kullanın", - "remember_password": "Parolayı hatırla", - "password_store_err": "Şifre girilmedi veya yanlış. Devam edilemiyor.", - "import_from_folder": "Klasörden aktar", - "manual_saving": "Manuel kaydet", - "enter_password_desc": "Save Desktop uygulaması kullanılarak senkronizasyon için şifrelenmiş bir arşiv seçildi. Lütfen kilidini açmak ve senkronizasyonu başlatmak için aşağıdaki şifreyi girin." -} diff --git a/translations/uk.json b/translations/uk.json deleted file mode 100644 index 91661d37..00000000 --- a/translations/uk.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "Про додаток", - "unsuppurted_env_desc": "Ви використовуєте не підтримуване середовище. \nБудь ласка, використовуйте одне з підтримуваних: {}.", - "save_config": "Зберегти поточну конфігурацію", - "import_config": "Імпорт збереженої конфігурації", - "set_filename": "Задайте ім'я файлу", - "config_saved": "Конфігурацію збережено!", - "open_folder": "Відкрити теку", - "cancel": "Скасувати", - "savedesktop_f": "Файли Save Desktop", - "config_imported": "Конфігурацію застосовано!", - "logout": "Вийти", - "please_wait": "Будь ласка, зачекайте…", - "summary": "Збережіть конфігурацію вашої стільниці", - "description": "Save Desktop дозволяє зберегти поточну конфігурацію (теми, значки, шпалери, всі налаштування середовища робочого столу, розширення тощо) в один клац.", - "translator_credits": "Kefir2105 https://github.com/Kefir2105\nvolkov ", - "periodic_saving": "Періодичне збереження", - "periodic_saving_desc": "Зміни набудуть чинності тільки після наступного входу в систему", - "never": "Ніколи", - "daily": "Щодня", - "weekly": "Щотижня", - "monthly": "Щомісяця", - "save": "Зберегти", - "import_from_file": "Імпорт з файлу", - "apply": "Застосувати", - "learn_more": "Дізнатися більше", - "save_installed_flatpaks": "Додатки Flatpak", - "pb_folder": "Тека для періодичного збереження", - "set_pb_folder_tooltip": "Виберіть власну теку для періодичного збереження", - "set_another": "Виберіть іншу теку", - "filename_format": "Формат назви файлу", - "import_title": "Імпорт", - "reset_button": "Скинути до замовчування", - "items_for_archive": "Елементи для включення в архів конфігурації", - "items_desc": "Ці налаштування також застосовуються до періодичного збереження", - "icons": "Піктограми", - "themes": "Теми", - "fonts": "Шрифти", - "backgrounds": "Шпалери", - "sync": "Синхронізувати", - "sync_desc": "Синхронізуйте конфігурацію середовище стільниці з іншими комп'ютерами в мережі.", - "set_up_sync_file": "Налаштування файлу синхронізації", - "periodic_sync": "Періодична синхронізація", - "manually": "Вручну", - "m_sync_desc": "Відтепер ви можете синхронізувати налаштування з меню на панелі заголовка", - "periodic_saving_file": "Періодичне збереження файлу", - "user_data_flatpak": "Дані користувача встановлених додатків Flatpak", - "keyboard_shortcuts": "Клавіатурні скорочення", - "quit": "Вийти", - "extensions": "Розширення", - "sync_manually": "Синхронізувати вручну", - "list": "Список встановлених додатків Flatpak", - "desktop_folder": "Робочий стіл", - "importing_config_status": "Імпортування конфігурації...\nІмпортування конфігурації з:\n{}\n", - "saving_config_status": "Збереження конфігурації...\nКонфігурація вашої стільниці буде збережена в:\n {}/{}.sd.tar.gz\n", - "config_imported_desc": "{}\nВи можете вийти із системи що зміни набули чинності, або повернутися до попередньої сторінки і вийти із системи пізніше.\n", - "back_to_page": "Повернутися до попередньої сторінки", - "flatpaks_data_tittle": "Обирання даних Flatpak додатків", - "config_saved_desc": "{}\nТепер ви можете переглянути архів з конфігурацією вашої стільниці або повернутися до попередньої сторінки.\n", - "pb_interval": "Інтервал", - "archive_encryption": "Шифрування архіву", - "more_options": "Додаткові опції", - "password_entry": "Пароль", - "create_pwd_desc": "Будь ласка, створіть новий пароль для вашого архіву. Критерії включають довжину не менше 12 символів, одну велику літеру, одну маленьку літеру та один спеціальний символ.", - "check_pwd_desc": "Введіть пароль нижче, щоб розблокувати архів з вашою конфігурацією. Якщо ви його забули, ви не зможете розпакувати архів і почати імпорт конфігурації.", - "archive_encryption_desc": "При ручному збереженні конфігурації вам буде запропоновано створити пароль. Це корисно, коли ви зберігаєте конфігурацію на портативних носіях для кращого захисту ваших даних.", - "check_pwd_title": "Розблокувати архів за допомогою пароля", - "create_pwd_title": "Створити новий пароль", - "create": "Створити", - "select_cloud_folder_btn": "Виберіть папку хмарного диска", - "err_occured": "Виникла помилка", - "change": "Змінити", - "periodic_saving_file_err": "Файл періодичного збереження не існує.", - "cloud_folder_err": "Ви не вибрали папку хмарного диска!", - "gen_password": "Згенерувати пароль", - "bidirectional_sync_desc": "Якщо увімкнено, і вибрані інтервал синхронізації та папка хмарного диска, інформація про періодичне збереження (інтервал, папка та ім'я файлу) з іншого комп'ютера, для якого налаштовано синхронізацію, буде скопійована на цей комп'ютер.", - "connect_cloud_storage_desc": "На іншому комп'ютері відкрийте додаток Save Desktop, а на цій сторінці натисніть кнопку \"Налаштувати файл синхронізації\" і зробіть необхідні налаштування. На цьому комп'ютері виберіть папку, яку ви синхронізували з вашим хмарним сховищем, і де також збережено той же файл періодичного збереження.", - "bidirectional_sync": "Двостороння синхронізація", - "connect_cloud_storage": "Підключитися до хмарного сховища", - "gnome_oa_section": "2. Перейдіть до розділу \"Онлайн-акаунти\"", - "open_wiki": "Відкрити вікі-документацію додатку", - "almost_done_title": "Майже готово!", - "rclone_copy_cmd": "Тепер скопіюйте команду для налаштування Rclone за допомогою бічної кнопки та відкрийте додаток термінала, використовуючи комбінацію клавіш Ctrl+Alt+T або знайшовши його в меню програм.", - "rclone_cmd_copied_msg": "Після того, як ви завершите налаштування Rclone за допомогою наданої команди, натисніть кнопку \"Застосувати\"", - "gnome_oa_chooser_desc": "Створену папку хмарного диска можна знайти в бічній панелі діалогу вибору файлів у вигляді: username@service.com.", - "next": "Далі", - "rclone_intro_desc": "Для правильного функціонування синхронізації, вам потрібно мати папку, яка синхронізується з вашим хмарним сервісом за допомогою Rclone.\nПочніть з вибору хмарного сервісу, який ви використовуєте.", - "almost_done_desc": "Ви щойно створили папку хмарного диска! Натисніть кнопку \"Далі\", щоб завершити налаштування.", - "initial_setup": "Налаштування початкової синхронізації", - "select": "Вибрати", - "gnome_oa_section_desc": "У цьому розділі виберіть хмарний сервіс, який вам потрібен, наприклад, Google, Microsoft 365 або Nextcloud.", - "gnome_oa_settings": "1. Відкрийте налаштування системи", - "gnome_oa_chooser": "3. Натисніть кнопку \"Далі\" та виберіть створену папку хмарного диска", - "password_store_err": "Введено не правильний пароль або нічого. Неможливо продовжити.", - "remember_password": "Запам'ятати пароль", - "syncthing_folder": "Використовувати замість теку Syncthing", - "save_without_archive": "Зберегти конфігурацію без створення архіву", - "import_from_folder": "Імпортувати з теки", - "pwd_for_encryption": "Пароль для шифрування", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization.", - "manual_saving": "Ручне збереження", - "enter_password_title": "Будь ласка, введіть пароль, щоб розблокувати архів для синхронізації конфігурації" -} diff --git a/translations/zh_Hans.json b/translations/zh_Hans.json deleted file mode 100644 index 846f24b0..00000000 --- a/translations/zh_Hans.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "about_app": "关于应用", - "unsuppurted_env_desc": "您安装了不受支持的环境。\n请使用以下环境之一:{}。", - "save_config": "保存当前配置", - "import_config": "导入保存的配置", - "set_filename": "设置文件名", - "config_saved": "配置已保存!", - "open_folder": "打开文件夹", - "cancel": "取消", - "savedesktop_f": "Save Desktop文件", - "config_imported": "配置已应用!", - "logout": "注销", - "please_wait": "请稍等 …", - "summary": "保存您的桌面环境配置", - "description": "Save Desktop 可让您一键保存当前配置(主题、图标、壁纸、所有桌面环境设置、扩展等)。", - "periodic_saving": "定期保存", - "periodic_saving_desc": "更改仅在下次登录后生效", - "never": "从不", - "daily": "每日", - "weekly": "每周", - "monthly": "每月", - "import_from_file": "从文件导入", - "save": "保存", - "apply": "应用", - "translator_credits": "译者github链接", - "learn_more": "学习更多", - "save_installed_flatpaks": "Flatpak 包", - "pb_folder": "定期保存目录", - "set_pb_folder_tooltip": "手动选择定期保存目录", - "set_another": "选择其他目录", - "import_title": "导入", - "filename_format": "文件名称格式", - "reset_button": "恢复默认", - "items_for_archive": "要包含在配置存档中的项目", - "items_desc": "这些设置也适用于定期保存", - "icons": "图标", - "themes": "主题", - "fonts": "字体", - "backgrounds": "背景", - "sync": "同步", - "sync_desc": "将您的桌面环境配置与网络中的其他计算机同步。", - "set_up_sync_file": "设置同步文件", - "periodic_sync": "周期性同步", - "manually": "手动", - "m_sync_desc": "从现在开始,您可以从标题栏中的菜单中同步配置╰(*°▽°*)╯", - "periodic_saving_file": "定期保存文件", - "user_data_flatpak": "使用已安装 Flatpak 程序的用户数据", - "keyboard_shortcuts": "快捷键", - "quit": "退出", - "extensions": "扩展", - "sync_manually": "手动同步", - "list": "已安装的Flatpak应用列表", - "desktop_folder": "桌面", - "saving_config_status": "保存配置……\n您的桌面环境配置将被保存至:\n {}/{}.sd.tar.gz\n", - "importing_config_status": "导入配置……\n从:{}导入配置\n", - "flatpaks_data_tittle": "Flatpak应用数据选项", - "config_imported_desc": "{}\n您可以注销以使更改生效,或返回上一页稍后再注销。\n", - "back_to_page": "返回上一页", - "config_saved_desc": "{}\n现在您可以查看桌面环境配置存档,或者返回上一页。\n", - "pb_interval": "Interval", - "archive_encryption": "存档加密", - "archive_encryption_desc": "在手动保存配置的时候,会有创建密码的提示信息。这在使用移动便携存储设备保存配置时能更好的保护您的数据。", - "create_pwd_desc": "Please create new password for your archive. Criteria include a length of at least 12 characters, one uppercase letter, one lowercase letter, and one special character.", - "password_entry": "密码", - "more_options": "更多选项", - "check_pwd_desc": "Enter the password below to unlock the archive with your configuration. If you have forgotten it, you will not be able to unzip the archive and start importing your configuration.", - "check_pwd_title": "解锁存档时不需要密码", - "create_pwd_title": "创建新密码", - "select_cloud_folder_btn": "选择云驱动文件夹", - "err_occured": "出现一个错误", - "create": "新建", - "change": "更改", - "periodic_saving_file_err": "Periodic saving file does not exist.", - "cloud_folder_err": "您没有选择云驱动文件夹!", - "gen_password": "生成密码", - "bidirectional_sync_desc": "If enabled, and the sync interval and cloud drive folder are selected, the periodic saving information (interval, folder, and file name) from the other computer with synchronization set to synchronize is copied to this computer.", - "connect_cloud_storage_desc": "On another computer, open the Save Desktop app, and on this page, click on the \"Set up the sync file\" button and make the necessary settings. On this computer, select the folder that you have synced with your cloud storage and also have saved the same periodic saving file.", - "bidirectional_sync": "Bidirectional synchronization", - "connect_cloud_storage": "连接到云存储", - "next": "下一步", - "gnome_oa_section": "2. 定位到在线账号(Online Accounts)部分", - "almost_done_title": "马上就好!", - "rclone_cmd_copied_msg": "Once you have finished setting up Rclone using the command provided, click the \"Apply\" button", - "rclone_copy_cmd": "Now, copy the command to set up Rclone using the side button and open the terminal app using the Ctrl+Alt+T keyboard shortcut or finding it in the apps' menu.", - "gnome_oa_chooser_desc": "The created cloud drive folder can be found in the side panel of the file chooser dialog, in this form: username@service.com.", - "almost_done_desc": "您已经创建好云驱动文件夹了!点击下一步以完成设置。", - "rclone_intro_desc": "For synchronization to works properly, you need to have the folder, that is synced with your cloud service using Rclone.\nStart by selecting the cloud drive service you use.", - "initial_setup": "初始化同步设置", - "select": "选择", - "gnome_oa_section_desc": "选择你想使用的任一云服务,比如 Google,Microsoft 365 或 Nextcloud.", - "open_wiki": "打开本应用使用说明(WIKI)", - "gnome_oa_settings": "1. 打开系统设置", - "gnome_oa_chooser": "3. 点击下一步,选择已创建的云同步文件夹", - "remember_password": "记住密码", - "syncthing_folder": "Use Syncthing folder instead", - "password_store_err": "密码为空或密码错误,无法进行下一步。", - "save_without_archive": "保存配置时不创建存档", - "import_from_folder": "从文件夹导入", - "pwd_for_encryption": "加密所需的密码", - "manual_saving": "手动保存", - "enter_password_title": "请输入密码解锁存档以同步配置", - "enter_password_desc": "An encrypted archive has been selected for synchronization using the Save Desktop app. Please enter the password below to unlock it and start synchronization." -}