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/*"])