From 79006a2f10b9c1d59ea2b3d42ed4ac139ae1c93b Mon Sep 17 00:00:00 2001 From: Noah <130611693+upupnoah@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:59:47 +0700 Subject: [PATCH] feat(i18n): add Italian language support (#407) * feat(i18n): add Italian language support Added Italian translations to the application, including localization for app content, common phrases, external resources, language settings, and shortcuts. * Update en.json * Update ja.json * Update zh-CN.json * fix: import format * feat: support lang/*.json * feat: Merge dev to i18n/add-it --------- Co-authored-by: Innei --- apps/renderer/src/@types/constants.ts | 1 + apps/renderer/src/@types/default-resource.ts | 3 + locales/app/it.json | 207 +++++++++++++++++++ locales/common/it.json | 28 +++ locales/external/it.json | 42 ++++ locales/lang/ar-dz.json | 15 ++ locales/lang/ar-ma.json | 15 ++ locales/lang/ar-sa.json | 15 ++ locales/lang/en.json | 1 + locales/lang/es.json | 1 + locales/lang/fr.json | 1 + locales/lang/it.json | 15 ++ locales/lang/ja.json | 1 + locales/lang/pt.json | 1 + locales/lang/zh-CN.json | 1 + locales/lang/zh-HK.json | 1 + locales/lang/zh-TW.json | 1 + locales/native/it.json | 53 +++++ locales/settings/it.json | 195 +++++++++++++++++ locales/shortcuts/it.json | 24 +++ vitest.workspace.ts | 2 - 21 files changed, 621 insertions(+), 2 deletions(-) create mode 100644 locales/app/it.json create mode 100644 locales/common/it.json create mode 100644 locales/external/it.json create mode 100644 locales/lang/ar-dz.json create mode 100644 locales/lang/ar-ma.json create mode 100644 locales/lang/ar-sa.json create mode 100644 locales/lang/it.json create mode 100644 locales/native/it.json create mode 100644 locales/settings/it.json create mode 100644 locales/shortcuts/it.json diff --git a/apps/renderer/src/@types/constants.ts b/apps/renderer/src/@types/constants.ts index 05b694255..2dc5d19c4 100644 --- a/apps/renderer/src/@types/constants.ts +++ b/apps/renderer/src/@types/constants.ts @@ -4,6 +4,7 @@ export const dayjsLocaleImportMap = { en: ["en", () => import("dayjs/locale/en")], ["zh-CN"]: ["zh-cn", () => import("dayjs/locale/zh-cn")], ["ja"]: ["ja", () => import("dayjs/locale/ja")], + ["it"]: ["it", () => import("dayjs/locale/it")], ["ar-DZ"]: ["ar-dz", () => import("dayjs/locale/ar-dz")], ["ar-SA"]: ["ar-sa", () => import("dayjs/locale/ar-sa")], ["ar-MA"]: ["ar-ma", () => import("dayjs/locale/ar-ma")], diff --git a/apps/renderer/src/@types/default-resource.ts b/apps/renderer/src/@types/default-resource.ts index 31dcb6de8..e65cf0110 100644 --- a/apps/renderer/src/@types/default-resource.ts +++ b/apps/renderer/src/@types/default-resource.ts @@ -5,6 +5,7 @@ import common_arsa from "../../../../locales/common/ar-SA.json" import common_en from "../../../../locales/common/en.json" import common_es from "../../../../locales/common/es.json" import common_fr from "../../../../locales/common/fr.json" +import common_it from "../../../../locales/common/it.json" import common_ja from "../../../../locales/common/ja.json" import common_pt from "../../../../locales/common/pt.json" import common_zhCN from "../../../../locales/common/zh-CN.json" @@ -17,6 +18,7 @@ import lang_arsa from "../../../../locales/lang/ar-SA.json" import lang_en from "../../../../locales/lang/en.json" import lang_es from "../../../../locales/lang/es.json" import lang_fr from "../../../../locales/lang/fr.json" +import lang_it from "../../../../locales/lang/it.json" import lang_ja from "../../../../locales/lang/ja.json" import lang_pt from "../../../../locales/lang/pt.json" import lang_zhCN from "../../../../locales/lang/zh-CN.json" @@ -48,6 +50,7 @@ export const defaultResources = { lang: lang_ja, common: common_ja, }, + it: { lang: lang_it, common: common_it }, "ar-DZ": { lang: lang_ardz, common: common_ardz }, "ar-SA": { lang: lang_arsa, common: common_arsa }, "ar-MA": { lang: lang_arma, common: common_arma }, diff --git a/locales/app/it.json b/locales/app/it.json new file mode 100644 index 000000000..0d550522b --- /dev/null +++ b/locales/app/it.json @@ -0,0 +1,207 @@ +{ + "ai_daily.title": "Top News - {{title}}", + "ai_daily.tooltip.content": "Qui ci sono notizie selezionate dall'IA dalla tua timeline ( - ) che potrebbero essere importanti per te.", + "ai_daily.tooltip.update_schedule": "Aggiornato ogni giorno alle 8 AM e alle 8 PM.", + "app.app_name": "NOME_APP", + "app.copy_logo_svg": "Copia Logo SVG", + "app.toggle_sidebar": "Mostra/Nascondi Sidebar", + "discover.any_url_or_keyword": "Qualsiasi URL o Parola Chiave", + "discover.default_option": " (predefinito)", + "discover.feed_description": "La descrizione di questo feed è la seguente, e puoi compilare il modulo dei parametri con le informazioni pertinenti.", + "discover.feed_maintainers": "Questo feed è fornito da RSSHub, con il credito a ", + "discover.import.click_to_upload": "Clicca per caricare il file OPML", + "discover.popular": "Popolare", + "discover.preview": "Anteprima", + "discover.rss_hub_route": "Percorso RSSHub", + "discover.rss_url": "URL RSS", + "discover.select_placeholder": "Seleziona", + "early_access": "Accesso Anticipato", + "entry_actions.copy_link": "Copia link", + "entry_actions.failed_to_save_to_eagle": "Salvataggio su Eagle non riuscito.", + "entry_actions.failed_to_save_to_instapaper": "Salvataggio su Instapaper non riuscito.", + "entry_actions.failed_to_save_to_readwise": "Salvataggio su Readwise non riuscito.", + "entry_actions.link_copied": "Link copiato negli appunti.", + "entry_actions.mark_as_read": "Segna come letto", + "entry_actions.mark_as_unread": "Segna come non letto", + "entry_actions.open_in_browser": "Apri nel browser", + "entry_actions.save_media_to_eagle": "Salva media su Eagle", + "entry_actions.save_to_instapaper": "Salva su Instapaper", + "entry_actions.save_to_readwise": "Salva su Readwise", + "entry_actions.saved_to_eagle": "Salvato su Eagle.", + "entry_actions.saved_to_instapaper": "Salvato su Instapaper.", + "entry_actions.saved_to_readwise": "Salvato su Readwise.", + "entry_actions.share": "Condividi", + "entry_actions.star": "Aggiungi ai preferiti", + "entry_actions.starred": "Aggiunto ai preferiti.", + "entry_actions.tip": "Dona", + "entry_actions.unstar": "Rimuovi dai preferiti", + "entry_actions.unstarred": "Rimosso dai preferiti.", + "entry_column.refreshing": "Aggiornamento nuove voci...", + "entry_content.ai_summary": "Riassunto IA", + "entry_content.fetching_content": "Recupero del contenuto originale e elaborazione...", + "entry_content.header.play_tts": "Riproduci TTS", + "entry_content.header.readability": "Leggibilità", + "entry_content.no_content": "Nessun contenuto", + "entry_content.readability_notice": "Questo contenuto è fornito da Readability. Se trovi anomalie tipografiche, vai al sito sorgente per visualizzare il contenuto originale.", + "entry_content.render_error": "Errore di rendering:", + "entry_content.report_issue": "Segnala problema", + "entry_content.web_app_notice": "Forse l'app web non supporta questo tipo di contenuto. Puoi comunque scaricare l'app desktop.", + "entry_list.zero_unread": "Zero Non Letti", + "entry_list_header.daily_report": "Rapporto Giornaliero", + "entry_list_header.hide_no_image_items": "Nascondi voci senza immagini", + "entry_list_header.items": "elementi", + "entry_list_header.new_entries_available": "Nuove voci disponibili", + "entry_list_header.refetch": "Ricarica", + "entry_list_header.refresh": "Aggiorna", + "entry_list_header.show_all": "Mostra tutto", + "entry_list_header.show_all_items": "Mostra tutte le voci", + "entry_list_header.show_unread_only": "Mostra solo non letti", + "entry_list_header.switch_to_grid": "Passa alla griglia", + "entry_list_header.switch_to_masonry": "Passa a Masonry", + "entry_list_header.unread": "non letto", + "feed_claim_modal.choose_verification_method": "Ci sono tre modi tra cui scegliere, puoi sceglierne uno per verificare.", + "feed_claim_modal.claim_button": "Reclama", + "feed_claim_modal.content_instructions": "Copia il contenuto qui sotto e postalo nel tuo ultimo feed RSS.", + "feed_claim_modal.description_current": "Descrizione attuale:", + "feed_claim_modal.description_instructions": "Copia il seguente contenuto e incollalo nel campo del tuo feed RSS.", + "feed_claim_modal.failed_to_load": "Caricamento del messaggio di reclamo non riuscito", + "feed_claim_modal.rss_format_choice": "I generatori RSS generalmente hanno due formati tra cui scegliere. Copia i formati XML e JSON qui sotto come necessario.", + "feed_claim_modal.rss_instructions": "Copia il codice qui sotto e incollalo nel tuo generatore di feed RSS.", + "feed_claim_modal.rss_json_format": "Formato JSON", + "feed_claim_modal.rss_xml_format": "Formato XML", + "feed_claim_modal.rsshub_notice": "Questo feed è fornito da RSSHub con una cache di 1 ora. Permetti fino a un'ora affinché le modifiche siano visibili dopo la pubblicazione del contenuto.", + "feed_claim_modal.tab_content": "Contenuto", + "feed_claim_modal.tab_description": "Descrizione", + "feed_claim_modal.tab_rss": "Tag RSS", + "feed_claim_modal.verify_ownership": "Per reclamare questo feed come tuo, devi verificare la proprietà.", + "feed_form.add_follow": "Aggiungi ai seguiti", + "feed_form.category": "Categoria", + "feed_form.category_description": "Per impostazione predefinita, i tuoi seguiti verranno raggruppati per sito web.", + "feed_form.error_fetching_feed": "Errore nel recupero del feed.", + "feed_form.feed_not_found": "Feed non trovato.", + "feed_form.feedback": "Feedback", + "feed_form.follow": "Segui", + "feed_form.followed": "🎉 Seguito.", + "feed_form.private_follow": "Seguito Privato", + "feed_form.private_follow_description": "Questo seguito è visibile pubblicamente sulla tua pagina profilo?", + "feed_form.retry": "Riprova", + "feed_form.title": "Titolo", + "feed_form.title_description": "Titolo personalizzato per questo Feed. Lascia vuoto per usare quello predefinito.", + "feed_form.unfollow": "Smetti di seguire", + "feed_form.update": "Aggiorna", + "feed_form.update_follow": "Aggiorna seguiti", + "feed_form.updated": "🎉 Aggiornato.", + "feed_form.view": "Visualizza", + "feed_item.claimed_by_owner": "Questo feed è rivendicato da", + "feed_item.claimed_by_unknown": "il suo proprietario.", + "feed_item.claimed_by_you": "Reclamato da te", + "feed_item.claimed_feed": "Feed Reclamato", + "feed_item.error_since": "Errore da", + "feed_item.not_publicly_visible": "Non visibile pubblicamente sulla tua pagina profilo", + "feed_view_type.articles": "Articoli", + "feed_view_type.audios": "Audio", + "feed_view_type.notifications": "Notifiche", + "feed_view_type.pictures": "Immagini", + "feed_view_type.social_media": "Social Media", + "feed_view_type.videos": "Video", + "mark_all_read_button.auto_confirm_info": "Sarà confermato automaticamente dopo 3s.", + "mark_all_read_button.confirm": "Conferma", + "mark_all_read_button.confirm_mark_all": "Segna {{which}} come letto?", + "mark_all_read_button.confirm_mark_all_info": "Confermi di segnare tutto come letto?", + "mark_all_read_button.mark_all_as_read": "Segna tutto come letto", + "mark_all_read_button.mark_as_read": "Segna {{which}} come letto", + "mark_all_read_button.undo": "Annulla", + "player.back_10s": "Indietro di 10s", + "player.close": "Chiudi", + "player.download": "Scarica", + "player.exit_full_screen": "Esci da schermo intero", + "player.forward_10s": "Avanti di 10s", + "player.full_screen": "Schermo intero", + "player.mute": "Muto", + "player.open_entry": "Apri Voce", + "player.pause": "Pausa", + "player.play": "Riproduci", + "player.playback_rate": "Velocità di riproduzione", + "player.unmute": "Riattiva audio", + "player.volume": "Volume", + "search.empty.no_results": "Nessun risultato trovato.", + "search.group.entries": "Voci", + "search.group.feeds": "Feed", + "search.options.all": "Tutto", + "search.options.entries": "Voci", + "search.options.feeds": "Feed", + "search.options.search_type": "Tipo di ricerca", + "search.placeholder": "Cerca...", + "search.result_count_local_mode": "(Modalità locale)", + "search.tooltip.local_search": "Questa ricerca copre i dati disponibili localmente. Prova a Ricaricare per includere i dati più recenti.", + "shortcuts.guide.title": "Guida ai tasti rapidi", + "sidebar.category_remove_dialog.cancel": "Annulla", + "sidebar.category_remove_dialog.continue": "Continua", + "sidebar.category_remove_dialog.description": "Questa operazione eliminerà la tua categoria, ma i feed che contiene saranno mantenuti e raggruppati per sito web.", + "sidebar.category_remove_dialog.title": "Rimuovi categoria", + "sidebar.feed_actions.claim": "Reclama", + "sidebar.feed_actions.claim_feed": "Reclama feed", + "sidebar.feed_actions.copy_feed_id": "Copia ID feed", + "sidebar.feed_actions.copy_feed_url": "Copia URL feed", + "sidebar.feed_actions.edit": "Modifica", + "sidebar.feed_actions.edit_feed": "Modifica feed", + "sidebar.feed_actions.feed_owned_by_you": "Questo feed è di tua proprietà", + "sidebar.feed_actions.mark_all_as_read": "Segna tutto come letto", + "sidebar.feed_actions.navigate_to_feed": "Vai al feed", + "sidebar.feed_actions.open_feed_in_browser": "Apri feed nel browser", + "sidebar.feed_actions.open_site_in_browser": "Apri sito nel browser", + "sidebar.feed_actions.unfollow": "Smetti di seguire", + "sidebar.feed_actions.unfollow_feed": "Smetti di seguire feed", + "sidebar.feed_column.context_menu.change_to_other_view": "Cambia ad altra visualizzazione", + "sidebar.feed_column.context_menu.delete_category": "Elimina categoria", + "sidebar.feed_column.context_menu.delete_category_confirmation": "Eliminare la categoria {{folderName}}?", + "sidebar.feed_column.context_menu.mark_as_read": "Segna come letto", + "sidebar.feed_column.context_menu.rename_category": "Rinomina categoria", + "sidebar.select_sort_method": "Seleziona un metodo di ordinamento", + "signin.continue_with_github": "Continua con GitHub", + "signin.continue_with_google": "Continua con Google", + "signin.sign_in_to": "Accedi a", + "sync_indicator.disabled": "Per ragioni di sicurezza, la sincronizzazione è disabilitata.", + "sync_indicator.offline": "Offline", + "sync_indicator.synced": "Sincronizzato con il server", + "tip_modal.amount": "Quantità", + "tip_modal.claim_feed": "Reclama questo feed", + "tip_modal.create_wallet": "Crea gratuitamente", + "tip_modal.feed_owner": "Proprietario del feed", + "tip_modal.low_balance": "Il tuo saldo non è sufficiente per coprire questa mancia. Per favore, regola l'importo.", + "tip_modal.no_wallet": "Non hai ancora un portafoglio. Creane uno per dare mance.", + "tip_modal.tip_amount_sent": "è stato inviato all'autore.", + "tip_modal.tip_now": "Dai una mancia ora", + "tip_modal.tip_sent": "Mancia inviata con successo! Grazie per il tuo supporto.", + "tip_modal.tip_support": "⭐ Dai una mancia per mostrare il tuo supporto!", + "tip_modal.unclaimed_feed": "Nessuno ha ancora reclamato questo feed. Il Power ricevuto sarà conservato in modo sicuro nel contratto blockchain fino a quando non verrà reclamato.", + "user_button.account": "Account", + "user_button.download_desktop_app": "Scarica l'app desktop", + "user_button.log_out": "Esci", + "user_button.power": "Power", + "user_button.preferences": "Preferenze", + "user_button.profile": "Profilo", + "user_profile.close": "Chiudi", + "user_profile.edit": "Modifica", + "user_profile.loading": "Caricamento in corso", + "user_profile.share": "Condividi", + "user_profile.toggle_item_style": "Cambia stile dell'elemento", + "words.add": "Aggiungi", + "words.confirm": "Conferma", + "words.discover": "Scopri", + "words.email": "Email", + "words.import": "Importa", + "words.items": "Elementi", + "words.language": "Lingua", + "words.load_archived_entries": "Carica voci archiviate", + "words.login": "Accedi", + "words.rss": "RSS", + "words.rss3": "RSS3", + "words.rsshub": "RSSHub", + "words.search": "Cerca", + "words.starred": "Preferiti", + "words.unread": "Non letti", + "words.user": "Utente", + "words.which.all": "tutti", + "words.zero_items": "Zero elementi" +} diff --git a/locales/common/it.json b/locales/common/it.json new file mode 100644 index 000000000..3e46cb39d --- /dev/null +++ b/locales/common/it.json @@ -0,0 +1,28 @@ +{ + "app.copied_to_clipboard": "Copiato negli appunti", + "cancel": "Annulla", + "confirm": "Conferma", + "ok": "OK", + "quantifier.piece": "", + "time.last_night": "Ieri sera", + "time.the_night_before_last": "L'altra sera", + "time.today": "Oggi", + "time.yesterday": "Ieri", + "tips.load-lng-error": "Errore nel caricamento del pacchetto linguistico", + "words.back": "Indietro", + "words.copy": "Copia", + "words.edit": "Modifica", + "words.entry": "Voce", + "words.id": "ID", + "words.items_one": "Elemento", + "words.items_other": "Elementi", + "words.local": "locale", + "words.record": "record", + "words.record_one": "record", + "words.record_other": "record", + "words.result": "risultato", + "words.result_one": "risultato", + "words.result_other": "risultati", + "words.space": " ", + "words.which.all": "Tutti" +} diff --git a/locales/external/it.json b/locales/external/it.json new file mode 100644 index 000000000..b57e20a50 --- /dev/null +++ b/locales/external/it.json @@ -0,0 +1,42 @@ +{ + "feed": { + "follow_one": "segui", + "follow_other": "seguono", + "followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} con {{readCount}} {{readNoun}} su {{appName}}", + "read_one": "letto", + "read_other": "letti" + }, + "header": { + "app": "App", + "download": "Scarica" + }, + "invitation": { + "activate": "Attiva", + "codeOptions": { + "1": "Cerca qualsiasi utente alpha test per invitarti.", + "2": "Unisciti al nostro server Discord per partecipare a estrazioni occasionali.", + "3": "Segui il nostro account X per partecipare a estrazioni occasionali." + }, + "earlyAccess": "Follow è attualmente in accesso anticipato e richiede un codice di invito per essere utilizzato.", + "earlyAccessMessage": "😰 Ci dispiace, Follow è attualmente in accesso anticipato e richiede un codice di invito per essere utilizzato.", + "generateButton": "Genera nuovo codice", + "generateCost": "Puoi spendere {{INVITATION_PRICE}} Power per generare un codice di invito per i tuoi amici.", + "getCodeMessage": "Puoi ottenere un codice di invito nei seguenti modi:", + "title": "Codice di Invito" + }, + "login": { + "backToWebApp": "Torna all'App Web", + "continueWithGitHub": "Continua con GitHub", + "continueWithGoogle": "Continua con Google", + "logInTo": "Accedi a", + "openApp": "Apri App", + "redirecting": "Reindirizzamento in corso", + "welcomeTo": "Benvenuto su" + }, + "redirect": { + "continueInBrowser": "Continua nel Browser", + "instruction": "Ora è il momento di aprire {{APP_NAME}} e chiudere in sicurezza questa pagina.", + "openApp": "Apri {{APP_NAME}}", + "successMessage": "Ti sei connesso con successo all'account {{APP_NAME}}." + } +} diff --git a/locales/lang/ar-dz.json b/locales/lang/ar-dz.json new file mode 100644 index 000000000..a9acc1b03 --- /dev/null +++ b/locales/lang/ar-dz.json @@ -0,0 +1,15 @@ +{ + "langs.ar-DZ": "العربية (الجزائر)", + "langs.ar-MA": "العربية (المغرب)", + "langs.ar-SA": "العربية (السعودية)", + "langs.en": "English", + "langs.es": "Español", + "langs.fr": "Français", + "langs.it": "Italiano", + "langs.ja": "日本語", + "langs.pt": "Português", + "langs.zh-CN": "简体中文", + "langs.zh-HK": "繁體中文(香港)", + "langs.zh-TW": "繁體中文(台灣)", + "name": "العربية (الجزائر)" +} diff --git a/locales/lang/ar-ma.json b/locales/lang/ar-ma.json new file mode 100644 index 000000000..29e2ba9f1 --- /dev/null +++ b/locales/lang/ar-ma.json @@ -0,0 +1,15 @@ +{ + "langs.ar-DZ": "العربية (الجزائر)", + "langs.ar-MA": "العربية (المغرب)", + "langs.ar-SA": "العربية (السعودية)", + "langs.en": "English", + "langs.es": "Español", + "langs.fr": "Français", + "langs.it": "Italiano", + "langs.ja": "日本語", + "langs.pt": "Português", + "langs.zh-CN": "简体中文", + "langs.zh-HK": "繁體中文(香港)", + "langs.zh-TW": "繁體中文(台灣)", + "name": "العربية (المغرب)" +} diff --git a/locales/lang/ar-sa.json b/locales/lang/ar-sa.json new file mode 100644 index 000000000..1d3945305 --- /dev/null +++ b/locales/lang/ar-sa.json @@ -0,0 +1,15 @@ +{ + "langs.ar-DZ": "العربية (الجزائر)", + "langs.ar-MA": "العربية (المغرب)", + "langs.ar-SA": "العربية (السعودية)", + "langs.en": "English", + "langs.es": "Español", + "langs.fr": "Français", + "langs.it": "Italiano", + "langs.ja": "日本語", + "langs.pt": "Português", + "langs.zh-CN": "简体中文", + "langs.zh-HK": "繁體中文(香港)", + "langs.zh-TW": "繁體中文(台灣)", + "name": "العربية (السعودية)" +} diff --git a/locales/lang/en.json b/locales/lang/en.json index 57ecd610c..5f3543e77 100644 --- a/locales/lang/en.json +++ b/locales/lang/en.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/es.json b/locales/lang/es.json index 4fb74e760..e047abf07 100644 --- a/locales/lang/es.json +++ b/locales/lang/es.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/fr.json b/locales/lang/fr.json index 4550974c1..d9afb444d 100644 --- a/locales/lang/fr.json +++ b/locales/lang/fr.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/it.json b/locales/lang/it.json new file mode 100644 index 000000000..ca4848b8e --- /dev/null +++ b/locales/lang/it.json @@ -0,0 +1,15 @@ +{ + "langs.ar-DZ": "العربية (الجزائر)", + "langs.ar-MA": "العربية (المغرب)", + "langs.ar-SA": "العربية (السعودية)", + "langs.en": "English", + "langs.es": "Español", + "langs.fr": "Français", + "langs.it": "Italiano", + "langs.ja": "日本語", + "langs.pt": "Português", + "langs.zh-CN": "简体中文", + "langs.zh-HK": "繁體中文(香港)", + "langs.zh-TW": "繁體中文(台灣)", + "name": "Italiano" +} diff --git a/locales/lang/ja.json b/locales/lang/ja.json index 36f8e43f0..84bc61408 100644 --- a/locales/lang/ja.json +++ b/locales/lang/ja.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/pt.json b/locales/lang/pt.json index e57652309..e73e59365 100644 --- a/locales/lang/pt.json +++ b/locales/lang/pt.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/zh-CN.json b/locales/lang/zh-CN.json index 1be773187..a647fd08b 100644 --- a/locales/lang/zh-CN.json +++ b/locales/lang/zh-CN.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/zh-HK.json b/locales/lang/zh-HK.json index b893e3c4b..d195ca4ab 100644 --- a/locales/lang/zh-HK.json +++ b/locales/lang/zh-HK.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/lang/zh-TW.json b/locales/lang/zh-TW.json index 19d4b6a63..842347a65 100644 --- a/locales/lang/zh-TW.json +++ b/locales/lang/zh-TW.json @@ -5,6 +5,7 @@ "langs.en": "English", "langs.es": "Español", "langs.fr": "Français", + "langs.it": "Italiano", "langs.ja": "日本語", "langs.pt": "Português", "langs.zh-CN": "简体中文", diff --git a/locales/native/it.json b/locales/native/it.json new file mode 100644 index 000000000..9c69796f0 --- /dev/null +++ b/locales/native/it.json @@ -0,0 +1,53 @@ +{ + "contextMenu.copyImage": "Copia immagine", + "contextMenu.copyImageAddress": "Copia indirizzo immagine", + "contextMenu.copyLink": "Copia link", + "contextMenu.copyVideoAddress": "Copia indirizzo video", + "contextMenu.inspect": "Ispeziona elemento", + "contextMenu.openImageInBrowser": "Apri immagine nel browser", + "contextMenu.openLinkInBrowser": "Apri link nel browser", + "contextMenu.saveImageAs": "Salva immagine come...", + "contextMenu.saveVideoAs": "Salva video come...", + "menu.about": "Informazioni su {{name}}", + "menu.actualSize": "Dimensione effettiva", + "menu.bringAllToFront": "Porta tutto in primo piano", + "menu.checkForUpdates": "Controlla aggiornamenti", + "menu.close": "Chiudi", + "menu.copy": "Copia", + "menu.cut": "Taglia", + "menu.debug": "Debug", + "menu.delete": "Elimina", + "menu.discover": "Scopri", + "menu.edit": "Modifica", + "menu.file": "File", + "menu.followReleases": "Segui aggiornamenti", + "menu.forceReload": "Ricarica forzatamente", + "menu.front": "Porta in primo piano", + "menu.help": "Aiuto", + "menu.hide": "Nascondi {{name}}", + "menu.hideOthers": "Nascondi altri", + "menu.minimize": "Minimizza", + "menu.openLogFile": "Apri file di log", + "menu.paste": "Incolla", + "menu.pasteAndMatchStyle": "Incolla e adatta stile", + "menu.quickAdd": "Aggiunta rapida", + "menu.quit": "Esci da {{name}}", + "menu.quitAndInstallUpdate": "Debug: Esci e installa aggiornamento", + "menu.redo": "Ripristina", + "menu.reload": "Ricarica", + "menu.search": "Cerca", + "menu.selectAll": "Seleziona tutto", + "menu.services": "Servizi", + "menu.settings": "Impostazioni...", + "menu.speech": "Voce", + "menu.startSpeaking": "Inizia a parlare", + "menu.stopSpeaking": "Interrompi parlato", + "menu.toggleDevTools": "Attiva strumenti di sviluppo", + "menu.toggleFullScreen": "Attiva/disattiva schermo intero", + "menu.undo": "Annulla", + "menu.view": "Visualizza", + "menu.window": "Finestra", + "menu.zoom": "Zoom", + "menu.zoomIn": "Ingrandisci", + "menu.zoomOut": "Riduci" +} diff --git a/locales/settings/it.json b/locales/settings/it.json new file mode 100644 index 000000000..e91f5018b --- /dev/null +++ b/locales/settings/it.json @@ -0,0 +1,195 @@ +{ + "about.changelog": "Registro modifiche", + "about.feedbackInfo": "{{appName}} ({{commitSha}}) è nelle prime fasi di sviluppo. Se hai feedback o suggerimenti, sentiti libero di aprire un problema sul nostro GitHub.", + "about.iconLibrary": "La libreria di icone utilizzata è protetta da copyright da e non può essere ridistribuita.", + "about.licenseInfo": "{{appName}} è e sarà sempre un progetto gratuito e open-source. È rilasciato sotto licenza {{license}}.", + "about.sidebar_title": "Informazioni", + "about.socialMedia": "Social Media", + "actions.actionName": "Azione {{number}}", + "actions.action_card.add": "Aggiungi", + "actions.action_card.all": "Tutti", + "actions.action_card.block_rules": "Regole di blocco", + "actions.action_card.custom_filters": "Filtri personalizzati", + "actions.action_card.enable_readability": "Abilita leggibilità", + "actions.action_card.entry_options.all": "Tutti", + "actions.action_card.entry_options.author": "Autore", + "actions.action_card.entry_options.content": "Contenuto", + "actions.action_card.entry_options.order": "Ordine", + "actions.action_card.entry_options.title": "Titolo", + "actions.action_card.entry_options.url": "Url", + "actions.action_card.feed_options.category": "Categoria", + "actions.action_card.feed_options.feed_url": "URL del Feed", + "actions.action_card.feed_options.site_url": "URL del Sito", + "actions.action_card.feed_options.title": "Titolo", + "actions.action_card.feed_options.view": "Visualizza", + "actions.action_card.field": "Campo", + "actions.action_card.from": "Da", + "actions.action_card.generate_summary": "Genera riassunto con l'AI", + "actions.action_card.name": "Nome", + "actions.action_card.operation_options.contains": "contiene", + "actions.action_card.operation_options.does_not_contain": "non contiene", + "actions.action_card.operation_options.is_equal_to": "è uguale a", + "actions.action_card.operation_options.is_greater_than": "è maggiore di", + "actions.action_card.operation_options.is_less_than": "è minore di", + "actions.action_card.operation_options.is_not_equal_to": "non è uguale a", + "actions.action_card.operation_options.matches_regex": "corrisponde a regex", + "actions.action_card.operator": "Operatore", + "actions.action_card.rewrite_rules": "Riscrivi regole", + "actions.action_card.then_do": "Allora fai…", + "actions.action_card.to": "A", + "actions.action_card.translate_into": "Traduci in", + "actions.action_card.value": "Valore", + "actions.action_card.when_feeds_match": "Quando i feed corrispondono…", + "actions.newRule": "Nuova Regola", + "actions.save": "Salva", + "actions.saveSuccess": "🎉 Azioni salvate.", + "actions.sidebar_title": "Azioni", + "actions.title": "Azioni", + "appearance.code_highlight_theme": "Tema evidenziazione codice", + "appearance.content": "Contenuto", + "appearance.content_font": "Font del Contenuto", + "appearance.custom_font": "Font Personalizzato", + "appearance.fonts": "Font", + "appearance.general": "Generale", + "appearance.guess_code_language.description": "Principali linguaggi di programmazione che utilizzano modelli per dedurre blocchi di codice non etichettati", + "appearance.guess_code_language.label": "Indovina il linguaggio del codice", + "appearance.misc": "Varie", + "appearance.modal_overlay.description": "Mostra sovrapposizione modale", + "appearance.modal_overlay.label": "Mostra sovrapposizione modale", + "appearance.opaque_sidebars.label": "Sidebar opache", + "appearance.reader_render_inline_style.description": "Consente la visualizzazione dello stile inline dell'HTML originale.", + "appearance.reader_render_inline_style.label": "Visualizza stile inline", + "appearance.reduce_motion.description": "Riduzione del movimento degli elementi per migliorare le prestazioni e ridurre il consumo energetico", + "appearance.reduce_motion.label": "Riduci movimento", + "appearance.save": "Salva", + "appearance.show_dock_badge.label": "Mostra come badge Dock", + "appearance.sidebar_show_unread_count.label": "Mostra nella sidebar", + "appearance.sidebar_title": "Aspetto", + "appearance.text_size": "Dimensione del testo", + "appearance.theme.dark": "Scuro", + "appearance.theme.label": "Tema", + "appearance.theme.light": "Chiaro", + "appearance.theme.system": "Sistema", + "appearance.title": "Aspetto", + "appearance.ui_font": "Font dell'interfaccia", + "appearance.unread_count": "Conteggio non letti", + "general.app": "App", + "general.data_persist.description": "Mantieni i dati localmente per abilitare l'accesso offline e la ricerca locale.", + "general.data_persist.label": "Mantieni i dati per l'uso offline", + "general.group_by_date.description": "Raggruppa le voci per data.", + "general.group_by_date.label": "Raggruppa per data", + "general.language": "Lingua", + "general.launch_at_login": "Avvia all'accesso", + "general.mark_as_read.hover.description": "Segna automaticamente le voci come lette quando ci si passa sopra.", + "general.mark_as_read.hover.label": "Segna come letto al passaggio del mouse", + "general.mark_as_read.render.description": "Segna automaticamente come lette le voci a livello singolo (es. post sui social media, immagini, video) quando entrano nella visualizzazione.", + "general.mark_as_read.render.label": "Segna come letto quando è in visualizzazione", + "general.mark_as_read.scroll.description": "Segna automaticamente le voci come lette quando scorri fuori dalla visualizzazione.", + "general.mark_as_read.scroll.label": "Segna come letto durante lo scorrimento", + "general.privacy_data": "Privacy e Dati", + "general.rebuild_database.button": "Ricostruisci", + "general.rebuild_database.description": "Se riscontri problemi di visualizzazione, la ricostruzione del database potrebbe risolverli.", + "general.rebuild_database.label": "Ricostruisci Database", + "general.rebuild_database.title": "Ricostruisci Database", + "general.rebuild_database.warning.line1": "La ricostruzione del database cancellerà tutti i tuoi dati locali.", + "general.rebuild_database.warning.line2": "Sei sicuro di voler continuare?", + "general.send_anonymous_data.description": "Optando per inviare dati di telemetria anonimi, contribuisci a migliorare l'esperienza utente generale di Follow.", + "general.send_anonymous_data.label": "Invia dati anonimi", + "general.show_unread_on_launch.description": "Mostra contenuti non letti all'avvio", + "general.show_unread_on_launch.label": "Mostra contenuti non letti all'avvio", + "general.sidebar_title": "Generale", + "general.timeline": "Cronologia", + "general.unread": "Non letti", + "general.voices": "Voci", + "integration.eagle.enable.description": "Mostra il pulsante 'Salva media su Eagle' quando disponibile.", + "integration.eagle.enable.label": "Abilita", + "integration.eagle.title": "Eagle", + "integration.instapaper.enable.description": "Mostra il pulsante 'Salva su Instapaper' quando disponibile.", + "integration.instapaper.enable.label": "Abilita", + "integration.instapaper.password.label": "Password Instapaper", + "integration.instapaper.title": "Instapaper", + "integration.instapaper.username.label": "Nome utente Instapaper", + "integration.readwise.enable.description": "Mostra il pulsante 'Salva su Readwise' quando disponibile.", + "integration.readwise.enable.label": "Abilita", + "integration.readwise.title": "Readwise", + "integration.readwise.token.description": "Puoi ottenerlo qui: readwise.io/access_token.", + "integration.readwise.token.label": "Token di accesso Readwise", + "integration.sidebar_title": "Integrazione", + "integration.tip": "Suggerimento: I tuoi dati sensibili sono memorizzati localmente e non vengono caricati sul server.", + "integration.title": "Integrazione", + "invitation.activate": "Attiva", + "invitation.codeOptions.betaUser": "1. Trova un utente beta che ti inviti.", + "invitation.codeOptions.discord": "2. Unisciti al nostro server Discord e partecipa a regali occasionali.", + "invitation.codeOptions.xAccount": "3. Segui il nostro account X e partecipa a regali occasionali.", + "invitation.confirmModal.cancel": "Annulla", + "invitation.confirmModal.confirm": "Vuoi continuare?", + "invitation.confirmModal.continue": "Continua", + "invitation.confirmModal.message": "Generare un codice di invito ti costerà {{INVITATION_PRICE}} Power.", + "invitation.confirmModal.title": "Conferma", + "invitation.earlyAccess": "Follow è attualmente in accesso anticipato e richiede un codice di invito per essere utilizzato.", + "invitation.earlyAccessMessage": "😰 Ci dispiace, Follow è attualmente in accesso anticipato e richiede un codice di invito per essere utilizzato.", + "invitation.generateButton": "Genera nuovo codice", + "invitation.generateCost": "Puoi spendere {{INVITATION_PRICE}} Power per generare un codice di invito per i tuoi amici.", + "invitation.getCodeMessage": "Puoi ottenere un codice di invito nei seguenti modi:", + "invitation.newInvitationSuccess": "🎉 Nuovo codice di invito generato, il codice è stato copiato", + "invitation.noInvitations": "Nessun invito", + "invitation.notUsed": "Non utilizzato", + "invitation.sidebar_title": "Inviti", + "invitation.tableHeaders.code": "Codice", + "invitation.tableHeaders.creationTime": "Data di creazione", + "invitation.tableHeaders.usedBy": "Utilizzato da", + "invitation.title": "Codice di Invito", + "profile.avatar.label": "Avatar", + "profile.handle.description": "Il tuo identificativo univoco.", + "profile.handle.label": "Handle", + "profile.name.description": "Il tuo nome pubblico.", + "profile.name.label": "Nome visualizzato", + "profile.sidebar_title": "Profilo", + "profile.submit": "Invia", + "profile.title": "Impostazioni Profilo", + "profile.updateSuccess": "Profilo aggiornato.", + "titles.about": "Informazioni", + "titles.actions": "Azioni", + "titles.appearance": "Aspetto", + "titles.general": "Generale", + "titles.integration": "Integrazione", + "titles.invitations": "Inviti", + "titles.power": "Power", + "titles.profile": "Profilo", + "titles.shortcuts": "Scorciatoie", + "wallet.address.title": "Il tuo Indirizzo", + "wallet.balance.title": "Il tuo Saldo", + "wallet.balance.withdrawable": "Prelevabile", + "wallet.balance.withdrawableTooltip": "Il Power prelevabile include sia le mance che hai ricevuto sia il Power che hai ricaricato.", + "wallet.claim.button.claim": "Richiedi Power Giornaliero", + "wallet.claim.button.claimed": "Richiesto oggi", + "wallet.claim.tooltip.alreadyClaimed": "Hai già richiesto il Power oggi.", + "wallet.claim.tooltip.canClaim": "Richiedi ora i tuoi {{amount}} Power giornalieri!", + "wallet.create.button": "Crea Wallet", + "wallet.create.description": "Crea un wallet gratuito per ricevere Power, che può essere utilizzato per ricompensare i creatori e ottenere ricompense per i tuoi contributi di contenuti.", + "wallet.power.dailyClaim": "Puoi richiedere {{amount}} Power gratuiti ogni giorno, che possono essere usati per dare mance agli RSS su Follow.", + "wallet.power.description": "Power è un token ERC-20 sulla blockchain {{blockchainName}}.", + "wallet.sidebar_title": "Power", + "wallet.transactions.amount": "Importo", + "wallet.transactions.date": "Data", + "wallet.transactions.from": "Da", + "wallet.transactions.noTransactions": "Nessuna transazione", + "wallet.transactions.title": "Transazioni", + "wallet.transactions.to": "A", + "wallet.transactions.tx": "Tx", + "wallet.transactions.type": "Tipo", + "wallet.transactions.types.burn": "brucia", + "wallet.transactions.types.mint": "conia", + "wallet.transactions.types.purchase": "acquisto", + "wallet.transactions.types.tip": "mancia", + "wallet.transactions.types.withdraw": "prelievo", + "wallet.transactions.you": "Tu", + "wallet.withdraw.addressLabel": "Il tuo Indirizzo Ethereum", + "wallet.withdraw.amountLabel": "Importo", + "wallet.withdraw.availableBalance": "Hai Power prelevabile nel tuo wallet.", + "wallet.withdraw.button": "Preleva", + "wallet.withdraw.error": "Prelievo fallito: {{error}}", + "wallet.withdraw.modalTitle": "Preleva Power", + "wallet.withdraw.submitButton": "Invia", + "wallet.withdraw.success": "Prelievo riuscito!" +} diff --git a/locales/shortcuts/it.json b/locales/shortcuts/it.json new file mode 100644 index 000000000..e3b5f475d --- /dev/null +++ b/locales/shortcuts/it.json @@ -0,0 +1,24 @@ +{ + "keys.audio.playPause": "Riproduci/Pausa (Quando il lettore audio è aperto)", + "keys.entries.markAllAsRead": "Segna tutti come letti", + "keys.entries.next": "Voce successiva", + "keys.entries.previous": "Voce precedente", + "keys.entries.refetch": "Ricarica", + "keys.entries.toggleUnreadOnly": "Visualizza solo non letti", + "keys.entry.copyLink": "Copia link", + "keys.entry.openInBrowser": "Apri nel browser", + "keys.entry.openInNewTab": "Apri in una nuova scheda", + "keys.entry.scrollDown": "Scorri verso il basso", + "keys.entry.scrollUp": "Scorri verso l'alto", + "keys.entry.share": "Condividi", + "keys.entry.tip": "Dai una mancia Power", + "keys.entry.toggleRead": "Alterna lettura", + "keys.entry.toggleStarred": "Alterna preferiti", + "keys.entry.tts": "Riproduci TTS", + "keys.feeds.add": "Aggiungi abbonamento", + "keys.feeds.switchBetweenViews": "Cambia tra le visualizzazioni", + "keys.feeds.switchToView": "Cambia visualizzazione", + "keys.layout.showShortcuts": "Mostra/Nascondi scorciatoie", + "keys.layout.toggleSidebar": "Mostra/Nascondi barra laterale", + "sidebar_title": "Scorciatoie" +} diff --git a/vitest.workspace.ts b/vitest.workspace.ts index f59cfdd06..871ba5023 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1,6 +1,4 @@ - import { defineWorkspace } from "vitest/config" - // NOT work export default defineWorkspace(["apps/*"])