Skip to content

Commit a6f0146

Browse files
committed
chore: i18n
1 parent c38056e commit a6f0146

26 files changed

+869
-118
lines changed

.trae/rules/project_rules.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Throughout the process, ensure the use of the latest Svelte and Web development
7373
| Tailwind CSS | 3.x | UI Styling System |
7474
| Vite | 4.x | Build Tool |
7575
| Lucide | Latest | Icon System |
76+
| ParaglideJS | Latest | Internationalization (i18n) |
7677
| Workbox | 6.x | PWA Support |
7778

7879
### PWA Implementation Specification
@@ -132,6 +133,99 @@ if ('serviceWorker' in navigator) {
132133
}
133134
```
134135

136+
### ParaglideJS Internationalization (i18n) Specification
137+
138+
ParaglideJS, in conjunction with the Inlang ecosystem, is utilized for managing internationalization within the UTags project. It offers type-safe message handling and seamless integration with Svelte and Vite.
139+
140+
1. **Configuration**:
141+
142+
- The core configuration resides in `project.inlang/settings.json`. This file defines source language, target languages, and necessary Inlang plugins.
143+
- The Vite plugin `@inlang/paraglide-js-adapter-vite` integrates ParaglideJS into the build process, enabling automatic compilation of messages and code generation.
144+
- Ensure `vite.config.ts` includes the Paraglide plugin, specifying the `project` path (to `project.inlang`) and `outdir` (e.g., `./src/lib/paraglide`).
145+
146+
2. **Message Files**:
147+
148+
- Translations are stored in JSON files located at `messages/{languageTag}.json` (e.g., `messages/en.json`, `messages/zh-CN.json`).
149+
- Messages should use the ICU Message Format to support complex translations, including plurals, gender, and interpolations.
150+
- Example `messages/en.json`:
151+
```json
152+
{
153+
"APP_TITLE": "UTags Bookmarks",
154+
"GREETING": "Hello, {name}!",
155+
"BOOKMARK_COUNT": "{count, plural, =0 {No bookmarks} =1 {One bookmark} other {# bookmarks}}"
156+
}
157+
```
158+
159+
3. **Code Generation**:
160+
161+
- ParaglideJS compiles messages into type-safe JavaScript/TypeScript modules.
162+
- The generated files are typically placed in the `outdir` specified in `vite.config.ts` (e.g., `src/lib/paraglide`).
163+
- Key generated files include:
164+
- `messages.js` (or `.ts`): Contains functions for each message key (e.g., `m.APP_TITLE()`, `m.GREETING({ name: 'User' })`).
165+
- `runtime.js` (or `.ts`): Provides runtime utilities for managing language state (e.g., `languageTag()`, `setLanguageTag()`, `onSetLanguageTag()`).
166+
167+
4. **Usage in Svelte Components**:
168+
169+
- Import generated messages and runtime functions into your Svelte components.
170+
- Utilize Svelte 5 Runes for reactive language state management.
171+
172+
```svelte
173+
<script lang="ts">
174+
// Import ParaglideJS generated files
175+
import * as m from '$lib/paraglide/messages' // Adjust path based on your outdir
176+
import {
177+
languageTag,
178+
setLanguageTag,
179+
onSetLanguageTag,
180+
} from '$lib/paraglide/runtime' // Adjust path
181+
182+
// Reactive state for the current language
183+
let currentLanguage = $state(languageTag()) // Initialize with the current language
184+
185+
// Effect to update Paraglide's runtime and document lang attribute when currentLanguage changes
186+
$effect(() => {
187+
setLanguageTag(currentLanguage)
188+
document.documentElement.lang = currentLanguage
189+
// Optionally, persist the selected language to localStorage
190+
if (typeof localStorage !== 'undefined') {
191+
localStorage.setItem('app-locale', currentLanguage)
192+
}
193+
})
194+
195+
// Optional: Listen for external changes to languageTag if needed
196+
// onSetLanguageTag((newLang) => {
197+
// currentLanguage = newLang;
198+
// });
199+
200+
/**
201+
* Switches the application language.
202+
* @param lang The language tag to switch to (e.g., 'en', 'zh-CN').
203+
*/
204+
function switchLanguage(lang: 'en' | 'zh-CN'): void {
205+
// Add all supported language tags here
206+
currentLanguage = lang
207+
}
208+
</script>
209+
210+
<div>
211+
<h1>{m.APP_TITLE()}</h1>
212+
<p>{m.GREETING({ name: 'Developer' })}</p>
213+
<p>{m.BOOKMARK_COUNT({ count: 5 })}</p>
214+
215+
<button onclick={() => switchLanguage('en')}>English</button>
216+
<button onclick={() => switchLanguage('zh-CN')}>中文</button>
217+
218+
<p>Current Language: {currentLanguage}</p>
219+
</div>
220+
```
221+
222+
5. **Best Practices**:
223+
- **Descriptive Keys**: Use clear and descriptive keys for messages (e.g., `SETTINGS_SAVE_BUTTON` instead of just `SAVE`).
224+
- **ICU Format**: Leverage the full power of ICU Message Format for complex pluralization, gender selection, and other localization needs.
225+
- **Centralized Management**: Keep all message files within the `messages` directory and ensure `project.inlang/settings.json` is up-to-date.
226+
- **Version Control**: Commit `project.inlang/settings.json` and all `messages/*.json` files to your repository. The generated `src/lib/paraglide` directory can often be added to `.gitignore` as it's build output, but this depends on team preference and CI/CD setup.
227+
- **CLI Usage**: Familiarize yourself with Inlang CLI commands (`npx @inlang/cli <command>`) for tasks like linting messages or manually triggering compiles if needed outside of Vite's HMR.
228+
135229
## Code Development Standards
136230

137231
### General Rules

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!doctype html>
2-
<html lang="zh-CN">
2+
<html>
33
<head>
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

messages/de.json

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
{
22
"$schema": "https://inlang.com/schema/inlang-message-format",
3-
"example_message": "Guten Tag {username}",
4-
"all_bookmarks": "Alle Lesezeichen",
5-
"recently_added": "Zuletzt hinzugefügt"
6-
}
3+
"ALL_BOOKMARKS": "Alle Lesezeichen",
4+
"COLLECTIONS_CREATE_ARIA_LABEL": "Neue Sammlung erstellen",
5+
"COLLECTIONS_CREATE_MODAL_TITLE": "Neue Sammlung erstellen",
6+
"COLLECTIONS_DELETE_CONFIRM_MESSAGE": "Möchten Sie diese Sammlung wirklich löschen?",
7+
"COLLECTIONS_EDIT_MODAL_TITLE": "Sammlung bearbeiten",
8+
"COLLECTIONS_MORE_ACTIONS_ARIA_LABEL": "Weitere Aktionen",
9+
"COLLECTIONS_NAME_LABEL": "Sammlungsname:",
10+
"COLLECTIONS_NAME_PLACEHOLDER": "Sammlungsname eingeben",
11+
"COLLECTIONS_NAME_VALIDATION_ERROR": "Sammlungsname ist erforderlich",
12+
"COLLECTIONS_PATH_LABEL": "Pfad:",
13+
"COLLECTIONS_PATH_PLACEHOLDER": "Pfad eingeben (optional): work",
14+
"COLLECTIONS_SAVE_MODAL_DESCRIPTION": "Speichern Sie die aktuellen Filterbedingungen als Sammlung, um beim nächsten Mal schnell darauf zugreifen zu können.",
15+
"COLLECTIONS_TITLE": "Sammlungen",
16+
"COMPOSITE_FILTERS_CLEAR_SEARCH_ARIA_LABEL": "Suchbegriffe löschen",
17+
"COMPOSITE_FILTERS_DOMAIN_FILTER_TITLE": "Domain-Filter",
18+
"COMPOSITE_FILTERS_RESET_BUTTON": "Filter zurücksetzen",
19+
"COMPOSITE_FILTERS_TAG_FILTER_TITLE": "Tag-Filter",
20+
"COMPOSITE_FILTERS_TITLE_LEVEL": "Filter #{level}",
21+
"COMPOSITE_FILTERS_TOGGLE_MULTI_SELECT_TITLE": "Einzel-/Mehrfachauswahl umschalten",
22+
"DELETED_BOOKMARKS": "Gelöschte Lesezeichen",
23+
"DELETE_BUTTON_TEXT": "Löschen",
24+
"EDIT_BUTTON_TEXT": "Bearbeiten",
25+
"FAVORITES_TITLE": "Favoriten",
26+
"HIERARCHICAL_TAGS_TITLE": "Hierarchische Tags",
27+
"MODAL_CANCEL_BUTTON": "Abbrechen",
28+
"MODAL_CLOSE_ARIA_LABEL": "Schließen",
29+
"MODAL_SAVE_BUTTON": "Speichern",
30+
"MORE_COLLECTIONS_TITLE": "Weitere Sammlungen",
31+
"NOTES": "Notizen",
32+
"READ_LATER": "Später lesen",
33+
"RECENTLY_ADDED": "Zuletzt hinzugefügt",
34+
"RECENTLY_MODIFIED": "Zuletzt geändert",
35+
"RELEASE_NOTES": "Versionshinweise",
36+
"SAVED_FILTERS_CREATE_ARIA_LABEL": "Neuen Filter erstellen",
37+
"SAVED_FILTERS_CREATE_MODAL_TITLE": "Aktuellen Filter speichern",
38+
"SAVED_FILTERS_DELETE_CONFIRM_MESSAGE": "Möchten Sie diesen gespeicherten Filter wirklich löschen?",
39+
"SAVED_FILTERS_DESCRIPTION_LABEL": "Beschreibung:",
40+
"SAVED_FILTERS_DESCRIPTION_PLACEHOLDER": "Beschreibung eingeben (optional)",
41+
"SAVED_FILTERS_EDIT_MODAL_TITLE": "Gespeicherten Filter bearbeiten",
42+
"SAVED_FILTERS_NAME_LABEL": "Filtername:",
43+
"SAVED_FILTERS_NAME_PLACEHOLDER": "Filtername eingeben",
44+
"SAVED_FILTERS_NAME_VALIDATION_ERROR": "Filtername ist erforderlich",
45+
"SAVED_FILTERS_TITLE": "Gespeicherte Filter",
46+
"SAVE_BUTTON_TEXT": "Speichern"
47+
}

messages/en.json

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
{
22
"$schema": "https://inlang.com/schema/inlang-message-format",
3-
"all_bookmarks": "All bookmarks",
4-
"recently_added": "Recently added",
5-
"example_message": "Hello world {username}"
3+
"ALL_BOOKMARKS": "All bookmarks",
4+
"COLLECTIONS_CREATE_ARIA_LABEL": "Create new collection",
5+
"COLLECTIONS_CREATE_MODAL_TITLE": "Create New Collection",
6+
"COLLECTIONS_DELETE_CONFIRM_MESSAGE": "Are you sure you want to delete this collection?",
7+
"COLLECTIONS_EDIT_MODAL_TITLE": "Edit Collection",
8+
"COLLECTIONS_MORE_ACTIONS_ARIA_LABEL": "More actions",
9+
"COLLECTIONS_NAME_LABEL": "Collection Name:",
10+
"COLLECTIONS_NAME_PLACEHOLDER": "Enter collection name",
11+
"COLLECTIONS_NAME_VALIDATION_ERROR": "Collection name is required",
12+
"COLLECTIONS_PATH_LABEL": "Path:",
13+
"COLLECTIONS_PATH_PLACEHOLDER": "Enter path (optional): work",
14+
"COLLECTIONS_SAVE_MODAL_DESCRIPTION": "Save the current filter conditions as a collection for quick access next time.",
15+
"COLLECTIONS_TITLE": "Collections",
16+
"COMPOSITE_FILTERS_CLEAR_SEARCH_ARIA_LABEL": "Clear search keywords",
17+
"COMPOSITE_FILTERS_DOMAIN_FILTER_TITLE": "Domain Filter",
18+
"COMPOSITE_FILTERS_RESET_BUTTON": "Reset Filters",
19+
"COMPOSITE_FILTERS_TAG_FILTER_TITLE": "Tag Filter",
20+
"COMPOSITE_FILTERS_TITLE_LEVEL": "Filter #{level}",
21+
"COMPOSITE_FILTERS_TOGGLE_MULTI_SELECT_TITLE": "Toggle single/multi-select mode",
22+
"DELETED_BOOKMARKS": "Deleted Bookmarks",
23+
"DELETE_BUTTON_TEXT": "Delete",
24+
"EDIT_BUTTON_TEXT": "Edit",
25+
"FAVORITES_TITLE": "Favorites",
26+
"HIERARCHICAL_TAGS_TITLE": "Hierarchical Tags",
27+
"MODAL_CANCEL_BUTTON": "Cancel",
28+
"MODAL_CLOSE_ARIA_LABEL": "Close",
29+
"MODAL_SAVE_BUTTON": "Save",
30+
"MORE_COLLECTIONS_TITLE": "More Collections",
31+
"NOTES": "Notes",
32+
"READ_LATER": "Read Later",
33+
"RECENTLY_ADDED": "Recently added",
34+
"RECENTLY_MODIFIED": "Recently Modified",
35+
"RELEASE_NOTES": "Release Notes",
36+
"SAVED_FILTERS_CREATE_ARIA_LABEL": "Create new filter",
37+
"SAVED_FILTERS_CREATE_MODAL_TITLE": "Save Current Filter",
38+
"SAVED_FILTERS_DELETE_CONFIRM_MESSAGE": "Are you sure you want to delete this saved filter?",
39+
"SAVED_FILTERS_DESCRIPTION_LABEL": "Description:",
40+
"SAVED_FILTERS_DESCRIPTION_PLACEHOLDER": "Enter description (optional)",
41+
"SAVED_FILTERS_EDIT_MODAL_TITLE": "Edit Saved Filter",
42+
"SAVED_FILTERS_NAME_LABEL": "Filter Name:",
43+
"SAVED_FILTERS_NAME_PLACEHOLDER": "Enter filter name",
44+
"SAVED_FILTERS_NAME_VALIDATION_ERROR": "Filter name is required",
45+
"SAVED_FILTERS_TITLE": "Saved Filters",
46+
"SAVE_BUTTON_TEXT": "Save"
647
}

messages/es.json

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
{
2-
"$schema": "https://inlang.com/schema/inlang-message-format",
3-
"example_message": "Hola mundo {username}",
4-
"all_bookmarks": "Todos los marcadores",
5-
"recently_added": "Recientemente añadido"
6-
}
2+
"$schema": "https://inlang.com/schema/inlang-message-format",
3+
"ALL_BOOKMARKS": "Todos los marcadores",
4+
"COLLECTIONS_CREATE_ARIA_LABEL": "Crear nueva colección",
5+
"COLLECTIONS_CREATE_MODAL_TITLE": "Crear nueva colección",
6+
"COLLECTIONS_DELETE_CONFIRM_MESSAGE": "¿Seguro que quieres eliminar esta colección?",
7+
"COLLECTIONS_EDIT_MODAL_TITLE": "Editar colección",
8+
"COLLECTIONS_MORE_ACTIONS_ARIA_LABEL": "Más acciones",
9+
"COLLECTIONS_NAME_LABEL": "Nombre de la colección:",
10+
"COLLECTIONS_NAME_PLACEHOLDER": "Introduce el nombre de la colección",
11+
"COLLECTIONS_NAME_VALIDATION_ERROR": "El nombre de la colección es obligatorio",
12+
"COLLECTIONS_PATH_LABEL": "Ruta:",
13+
"COLLECTIONS_PATH_PLACEHOLDER": "Introducir ruta (opcional): work",
14+
"COLLECTIONS_SAVE_MODAL_DESCRIPTION": "Guarde las condiciones actuales del filtro como una colección para un acceso rápido la próxima vez.",
15+
"COLLECTIONS_TITLE": "Colecciones",
16+
"COMPOSITE_FILTERS_CLEAR_SEARCH_ARIA_LABEL": "Borrar palabras clave de búsqueda",
17+
"COMPOSITE_FILTERS_DOMAIN_FILTER_TITLE": "Filtro de dominios",
18+
"COMPOSITE_FILTERS_RESET_BUTTON": "Restablecer filtros",
19+
"COMPOSITE_FILTERS_TAG_FILTER_TITLE": "Filtro de etiquetas",
20+
"COMPOSITE_FILTERS_TITLE_LEVEL": "Filtro #{level}",
21+
"COMPOSITE_FILTERS_TOGGLE_MULTI_SELECT_TITLE": "Alternar modo de selección única/múltiple",
22+
"DELETED_BOOKMARKS": "Marcadores eliminados",
23+
"DELETE_BUTTON_TEXT": "Eliminar",
24+
"EDIT_BUTTON_TEXT": "Editar",
25+
"FAVORITES_TITLE": "Favoritos",
26+
"HIERARCHICAL_TAGS_TITLE": "Etiquetas Jerárquicas",
27+
"MODAL_CANCEL_BUTTON": "Cancelar",
28+
"MODAL_CLOSE_ARIA_LABEL": "Cerrar",
29+
"MODAL_SAVE_BUTTON": "Guardar",
30+
"MORE_COLLECTIONS_TITLE": "Más colecciones",
31+
"NOTES": "Notas",
32+
"READ_LATER": "Leer más tarde",
33+
"RECENTLY_ADDED": "Añadidos recientemente",
34+
"RECENTLY_MODIFIED": "Modificados recientemente",
35+
"RELEASE_NOTES": "Notas de la versión",
36+
"SAVED_FILTERS_CREATE_ARIA_LABEL": "Crear nuevo filtro",
37+
"SAVED_FILTERS_CREATE_MODAL_TITLE": "Guardar filtro actual",
38+
"SAVED_FILTERS_DELETE_CONFIRM_MESSAGE": "¿Seguro que quieres eliminar este filtro guardado?",
39+
"SAVED_FILTERS_DESCRIPTION_LABEL": "Descripción:",
40+
"SAVED_FILTERS_DESCRIPTION_PLACEHOLDER": "Introduce la descripción (opcional)",
41+
"SAVED_FILTERS_EDIT_MODAL_TITLE": "Editar filtro guardado",
42+
"SAVED_FILTERS_NAME_LABEL": "Nombre del filtro:",
43+
"SAVED_FILTERS_NAME_PLACEHOLDER": "Introduce el nombre del filtro",
44+
"SAVED_FILTERS_NAME_VALIDATION_ERROR": "El nombre del filtro es obligatorio",
45+
"SAVED_FILTERS_TITLE": "Filtros guardados",
46+
"SAVE_BUTTON_TEXT": "Guardar"
47+
}

messages/fr.json

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
{
2-
"$schema": "https://inlang.com/schema/inlang-message-format",
3-
"example_message": "Bonjour tout le monde {username}",
4-
"all_bookmarks": "Tous les signets",
5-
"recently_added": "Ajouté récemment"
6-
}
2+
"$schema": "https://inlang.com/schema/inlang-message-format",
3+
"ALL_BOOKMARKS": "Tous les signets",
4+
"COLLECTIONS_CREATE_ARIA_LABEL": "Créer une nouvelle collection",
5+
"COLLECTIONS_CREATE_MODAL_TITLE": "Créer une nouvelle collection",
6+
"COLLECTIONS_DELETE_CONFIRM_MESSAGE": "Voulez-vous vraiment supprimer cette collection ?",
7+
"COLLECTIONS_EDIT_MODAL_TITLE": "Modifier la collection",
8+
"COLLECTIONS_MORE_ACTIONS_ARIA_LABEL": "Plus d'actions",
9+
"COLLECTIONS_NAME_LABEL": "Nom de la collection :",
10+
"COLLECTIONS_NAME_PLACEHOLDER": "Saisir le nom de la collection",
11+
"COLLECTIONS_NAME_VALIDATION_ERROR": "Le nom de la collection est requis",
12+
"COLLECTIONS_PATH_LABEL": "Chemin :",
13+
"COLLECTIONS_PATH_PLACEHOLDER": "Saisir le chemin (optionnel) : travail",
14+
"COLLECTIONS_SAVE_MODAL_DESCRIPTION": "Enregistrez les conditions de filtre actuelles en tant que collection pour un accès rapide ultérieur.",
15+
"COLLECTIONS_TITLE": "Collections",
16+
"COMPOSITE_FILTERS_CLEAR_SEARCH_ARIA_LABEL": "Effacer les mots-clés de recherche",
17+
"COMPOSITE_FILTERS_DOMAIN_FILTER_TITLE": "Filtre de domaines",
18+
"COMPOSITE_FILTERS_RESET_BUTTON": "Réinitialiser les filtres",
19+
"COMPOSITE_FILTERS_TAG_FILTER_TITLE": "Filtre de tags",
20+
"COMPOSITE_FILTERS_TITLE_LEVEL": "Filtre #{level}",
21+
"COMPOSITE_FILTERS_TOGGLE_MULTI_SELECT_TITLE": "Basculer mode sélection unique/multiple",
22+
"DELETED_BOOKMARKS": "Signets supprimés",
23+
"DELETE_BUTTON_TEXT": "Supprimer",
24+
"EDIT_BUTTON_TEXT": "Modifier",
25+
"FAVORITES_TITLE": "Favoris",
26+
"HIERARCHICAL_TAGS_TITLE": "Tags Hiérarchiques",
27+
"MODAL_CANCEL_BUTTON": "Annuler",
28+
"MODAL_CLOSE_ARIA_LABEL": "Fermer",
29+
"MODAL_SAVE_BUTTON": "Enregistrer",
30+
"MORE_COLLECTIONS_TITLE": "Autres collections",
31+
"NOTES": "Notes",
32+
"READ_LATER": "À lire plus tard",
33+
"RECENTLY_ADDED": "Récemment ajoutés",
34+
"RECENTLY_MODIFIED": "Récemment modifiés",
35+
"RELEASE_NOTES": "Notes de version",
36+
"SAVED_FILTERS_CREATE_ARIA_LABEL": "Créer un nouveau filtre",
37+
"SAVED_FILTERS_CREATE_MODAL_TITLE": "Enregistrer le filtre actuel",
38+
"SAVED_FILTERS_DELETE_CONFIRM_MESSAGE": "Voulez-vous vraiment supprimer ce filtre enregistré ?",
39+
"SAVED_FILTERS_DESCRIPTION_LABEL": "Description :",
40+
"SAVED_FILTERS_DESCRIPTION_PLACEHOLDER": "Saisir la description (optionnel)",
41+
"SAVED_FILTERS_EDIT_MODAL_TITLE": "Modifier le filtre enregistré",
42+
"SAVED_FILTERS_NAME_LABEL": "Nom du filtre :",
43+
"SAVED_FILTERS_NAME_PLACEHOLDER": "Saisir le nom du filtre",
44+
"SAVED_FILTERS_NAME_VALIDATION_ERROR": "Le nom du filtre est requis",
45+
"SAVED_FILTERS_TITLE": "Filtres enregistrés",
46+
"SAVE_BUTTON_TEXT": "Enregistrer"
47+
}

messages/it.json

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
{
2-
"$schema": "https://inlang.com/schema/inlang-message-format",
3-
"example_message": "Ciao mondo {username}",
4-
"all_bookmarks": "Tutti i segnalibri",
5-
"recently_added": "Aggiunto di recente"
6-
}
2+
"$schema": "https://inlang.com/schema/inlang-message-format",
3+
"ALL_BOOKMARKS": "Tutti i segnalibri",
4+
"COLLECTIONS_CREATE_ARIA_LABEL": "Crea una nuova raccolta",
5+
"COLLECTIONS_CREATE_MODAL_TITLE": "Crea nuova raccolta",
6+
"COLLECTIONS_DELETE_CONFIRM_MESSAGE": "Vuoi davvero eliminare questa raccolta?",
7+
"COLLECTIONS_EDIT_MODAL_TITLE": "Modifica raccolta",
8+
"COLLECTIONS_MORE_ACTIONS_ARIA_LABEL": "Altre azioni",
9+
"COLLECTIONS_NAME_LABEL": "Nome della raccolta:",
10+
"COLLECTIONS_NAME_PLACEHOLDER": "Inserisci il nome della raccolta",
11+
"COLLECTIONS_NAME_VALIDATION_ERROR": "Il nome della raccolta è obbligatorio",
12+
"COLLECTIONS_PATH_LABEL": "Sentiero:",
13+
"COLLECTIONS_PATH_PLACEHOLDER": "Inserisci percorso (opzionale): work",
14+
"COLLECTIONS_SAVE_MODAL_DESCRIPTION": "Salva le condizioni del filtro corrente come una raccolta per un rapido accesso la prossima volta.",
15+
"COLLECTIONS_TITLE": "Collezioni",
16+
"COMPOSITE_FILTERS_CLEAR_SEARCH_ARIA_LABEL": "Cancella parole chiave di ricerca",
17+
"COMPOSITE_FILTERS_DOMAIN_FILTER_TITLE": "Filtro domini",
18+
"COMPOSITE_FILTERS_RESET_BUTTON": "Reimposta filtri",
19+
"COMPOSITE_FILTERS_TAG_FILTER_TITLE": "Filtro tag",
20+
"COMPOSITE_FILTERS_TITLE_LEVEL": "Filtro #{level}",
21+
"COMPOSITE_FILTERS_TOGGLE_MULTI_SELECT_TITLE": "Alterna modalità selezione singola/multipla",
22+
"DELETED_BOOKMARKS": "Segnalibri eliminati",
23+
"DELETE_BUTTON_TEXT": "Eliminare",
24+
"EDIT_BUTTON_TEXT": "Modificare",
25+
"FAVORITES_TITLE": "Preferiti",
26+
"HIERARCHICAL_TAGS_TITLE": "Tag Gerarchici",
27+
"MODAL_CANCEL_BUTTON": "Cancellare",
28+
"MODAL_CLOSE_ARIA_LABEL": "Vicino",
29+
"MODAL_SAVE_BUTTON": "Salva",
30+
"MORE_COLLECTIONS_TITLE": "Altre collezioni",
31+
"NOTES": "Note",
32+
"READ_LATER": "Leggi dopo",
33+
"RECENTLY_ADDED": "Aggiunto di recente",
34+
"RECENTLY_MODIFIED": "Modificato di recente",
35+
"RELEASE_NOTES": "Note di rilascio",
36+
"SAVED_FILTERS_CREATE_ARIA_LABEL": "Crea nuovo filtro",
37+
"SAVED_FILTERS_CREATE_MODAL_TITLE": "Salva filtro corrente",
38+
"SAVED_FILTERS_DELETE_CONFIRM_MESSAGE": "Sei sicuro di voler eliminare questo filtro salvato?",
39+
"SAVED_FILTERS_DESCRIPTION_LABEL": "Descrizione:",
40+
"SAVED_FILTERS_DESCRIPTION_PLACEHOLDER": "Inserisci descrizione (opzionale)",
41+
"SAVED_FILTERS_EDIT_MODAL_TITLE": "Modifica filtro salvato",
42+
"SAVED_FILTERS_NAME_LABEL": "Nome del filtro:",
43+
"SAVED_FILTERS_NAME_PLACEHOLDER": "Inserisci il nome del filtro",
44+
"SAVED_FILTERS_NAME_VALIDATION_ERROR": "Il nome del filtro è obbligatorio",
45+
"SAVED_FILTERS_TITLE": "Filtri salvati",
46+
"SAVE_BUTTON_TEXT": "Salva"
47+
}

0 commit comments

Comments
 (0)