chore: translations were still missing

This commit is contained in:
2026-02-21 11:13:04 +01:00
parent b8005bec30
commit c991015ea8
15 changed files with 880 additions and 135 deletions

View File

@@ -1,4 +1,4 @@
import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';
import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
import enJson from './locales/en.json';
import deJson from './locales/de.json';
import frJson from './locales/fr.json';
@@ -7,6 +7,10 @@ import esJson from './locales/es.json';
export type UiLanguage = 'en' | 'de' | 'fr' | 'it' | 'es';
export const UI_LANGUAGE_STORAGE_KEY = 'bds-ui-language';
export const SUPPORTED_UI_LANGUAGES: UiLanguage[] = ['en', 'de', 'fr', 'it', 'es'];
type TranslationTable = Record<string, string>;
const en = enJson as TranslationTable;
@@ -58,29 +62,59 @@ export function translateUi(
export interface I18nContextValue {
language: UiLanguage;
t: (key: string, params?: Record<string, string | number>) => string;
setLanguage: (language: UiLanguage) => void;
supportedLanguages: UiLanguage[];
}
const I18nContext = createContext<I18nContextValue>({
language: 'en',
t: (key, params) => translateUi('en', key, params),
setLanguage: () => {},
supportedLanguages: SUPPORTED_UI_LANGUAGES,
});
export const I18nProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [language, setLanguage] = useState<UiLanguage>('en');
const [language, setLanguageState] = useState<UiLanguage>('en');
const setLanguage = useCallback((nextLanguage: UiLanguage) => {
const normalized = resolveSupportedUiLanguage(nextLanguage);
setLanguageState(normalized);
try {
localStorage.setItem(UI_LANGUAGE_STORAGE_KEY, normalized);
} catch {
// Ignore storage errors and keep in-memory language state.
}
}, []);
useEffect(() => {
let cancelled = false;
const persistedLanguage = (() => {
try {
const value = localStorage.getItem(UI_LANGUAGE_STORAGE_KEY);
return value ? resolveSupportedUiLanguage(value) : null;
} catch {
return null;
}
})();
if (persistedLanguage) {
setLanguageState(persistedLanguage);
return () => {
cancelled = true;
};
}
const detectLanguage = async () => {
try {
const systemLocale = await window.electronAPI?.app.getSystemLanguage?.();
const locale = systemLocale || navigator.language;
if (!cancelled) {
setLanguage(resolveUiLanguageFromSystemLocale(locale));
setLanguageState(resolveUiLanguageFromSystemLocale(locale));
}
} catch {
if (!cancelled) {
setLanguage(resolveUiLanguageFromSystemLocale(navigator.language));
setLanguageState(resolveUiLanguageFromSystemLocale(navigator.language));
}
}
};
@@ -96,8 +130,10 @@ export const I18nProvider: React.FC<{ children: React.ReactNode }> = ({ children
() => ({
language,
t: (key, params) => translateUi(language, key, params),
setLanguage,
supportedLanguages: SUPPORTED_UI_LANGUAGES,
}),
[language]
[language, setLanguage]
);
return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;

View File

@@ -316,5 +316,99 @@
"metadataDiff.sync.fileToDb.error": "Fehler beim sync to database",
"metadataDiff.value.database": "Datenbank",
"metadataDiff.value.file": "Datei",
"metadataDiff.empty": "Klicke auf „Nach Unterschieden suchen“, um Datenbank-Metadaten mit Datei-Metadaten zu vergleichen."
"metadataDiff.empty": "Klicke auf „Nach Unterschieden suchen“, um Datenbank-Metadaten mit Datei-Metadaten zu vergleichen.",
"sidebar.archive": "Archiv",
"sidebar.clearFilter": "Filter löschen",
"sidebar.tags": "Tags",
"sidebar.categories": "Kategorien",
"sidebar.clearTags": "Tags löschen",
"sidebar.clearCategories": "Kategorien löschen",
"sidebar.noPostsYet": "Noch keine Beiträge",
"sidebar.noPagesYet": "Noch keine Seiten",
"sidebar.noMediaYet": "Noch keine Medien",
"sidebar.search": "Suchen",
"sidebar.searchPostsPlaceholder": "Beiträge durchsuchen...",
"sidebar.searchPagesPlaceholder": "Seiten durchsuchen...",
"sidebar.searchMediaPlaceholder": "Medien durchsuchen...",
"sidebar.toggleFilters": "Filter umschalten",
"sidebar.newPost": "Neuer Beitrag",
"sidebar.importMedia": "Medien importieren",
"sidebar.results": "{count} Ergebnisse",
"sidebar.resultsFor": "{count} Ergebnisse für \"{query}\"",
"sidebar.clearFilters": "Filter löschen",
"sidebar.drafts": "Entwürfe",
"sidebar.published": "Veröffentlicht",
"sidebar.archived": "Archiviert",
"sidebar.untitled": "Ohne Titel",
"sidebar.noMatchingPosts": "Keine passenden Beiträge",
"sidebar.createFirstPost": "Ersten Beitrag erstellen",
"sidebar.loadMore": "Mehr laden ({loaded} von {total})",
"sidebar.loading": "Lädt...",
"sidebar.noMediaFiles": "Keine Mediendateien",
"sidebar.settingsHeader": "Einstellungen",
"sidebar.tagsHeader": "Tags",
"sidebar.nav.project": "Projekt",
"sidebar.nav.editor": "Texteditor",
"sidebar.nav.content": "Inhalt",
"sidebar.nav.ai": "KI-Assistent",
"sidebar.nav.publishing": "Veröffentlichung",
"sidebar.nav.data": "Daten",
"sidebar.nav.style": "Stil",
"sidebar.tagCloud": "Tag-Wolke",
"sidebar.createEdit": "Erstellen & Bearbeiten",
"sidebar.mergeTags": "Tags zusammenführen",
"settings.project.descriptionGeneral": "Allgemeine Einstellungen für das aktive Blog-Projekt.",
"settings.project.nameLabel": "Projektname",
"settings.project.nameDescription": "Der Anzeigename deines Blog-Projekts.",
"settings.project.namePlaceholder": "Mein Blog",
"settings.project.descriptionLabel": "Beschreibung",
"settings.project.descriptionDescription": "Eine kurze Beschreibung deines Blogs. Diese kann in Vorlagen und Metadaten verwendet werden.",
"settings.project.descriptionPlaceholder": "Ein Blog über...",
"settings.project.dataPathLabel": "Projekt-Datenpfad",
"settings.project.dataPathDescription": "Benutzerdefinierter Ordner für Beiträge, Medien und Metadaten. Leer lassen, um den Standardpfad zu verwenden: {path}",
"settings.project.defaultLocation": "Standardpfad",
"settings.project.publicUrlLabel": "Öffentliche URL",
"settings.project.publicUrlDescription": "Die öffentliche Basis-URL deines veröffentlichten Blogs (für Sitemap-Erstellung).",
"settings.project.publicUrlPlaceholder": "https://example.com",
"settings.project.mainLanguageLabel": "Hauptsprache",
"settings.project.mainLanguageDescription": "Die primäre Sprache für deine Blog-Inhalte. KI-generierte Titel, Alt-Texte und Bildunterschriften nutzen diese Sprache.",
"settings.project.defaultAuthorLabel": "Standardautor",
"settings.project.defaultAuthorDescription": "Der Standard-Autorname für neue Beiträge und Medien. Kann pro Element überschrieben werden.",
"settings.project.defaultAuthorPlaceholder": "Autorenname",
"settings.project.maxPostsPerPageLabel": "Maximale Beiträge pro Seite",
"settings.project.maxPostsPerPageDescription": "Maximale Anzahl von Beiträgen pro Vorschau-Routenseite.",
"settings.project.saveButton": "Projekteinstellungen speichern",
"editor.loadingPost": "Beitrag wird geladen...",
"editor.unsavedChanges": "Ungespeicherte Änderungen (wird beim Wechsel automatisch gespeichert)",
"editor.saving": "Speichern...",
"editor.publish": "Veröffentlichen",
"editor.publishTitle": "Speichern und öffentlich machen",
"editor.discardChanges": "Änderungen verwerfen",
"editor.discardDraft": "Entwurf verwerfen",
"editor.discardChangesTitle": "Auf letzte veröffentlichte Version zurücksetzen",
"editor.discardDraftTitle": "Diesen Entwurf dauerhaft löschen",
"editor.delete": "Löschen",
"editor.deleteTitle": "Diesen Beitrag dauerhaft löschen",
"editor.field.title": "Titel",
"editor.field.tags": "Tags",
"editor.field.author": "Autor",
"editor.field.slug": "Slug",
"editor.field.categories": "Kategorien",
"editor.field.content": "Inhalt",
"editor.placeholder.tags": "Tags hinzufügen...",
"editor.placeholder.author": "Autorenname",
"editor.placeholder.categories": "Kategorien hinzufügen...",
"editor.placeholder.startWriting": "Mit dem Schreiben beginnen...",
"editor.mode.visual": "Visuell",
"editor.mode.visualTitle": "Visueller Editor",
"editor.mode.markdownTitle": "Markdown-Quelle",
"editor.mode.previewTitle": "Schreibgeschützte Vorschau",
"editor.galleryTitle": "{count} Bild(er) anzeigen",
"editor.insertPostLinkTitle": "Beitrag verlinken (Strg+K)",
"editor.insertMediaTitle": "Bild aus Medienbibliothek einfügen",
"editor.previewFrameTitle": "Beitragsvorschau",
"editor.previewLoading": "Vorschau wird geladen...",
"editor.footer.created": "Erstellt",
"editor.footer.updated": "Aktualisiert",
"editor.footer.published": "Veröffentlicht"
}

View File

@@ -316,5 +316,99 @@
"metadataDiff.sync.fileToDb.error": "Failed to sync to database",
"metadataDiff.value.database": "Database",
"metadataDiff.value.file": "File",
"metadataDiff.empty": "Click \"Scan for Differences\" to compare database metadata with file metadata."
"metadataDiff.empty": "Click \"Scan for Differences\" to compare database metadata with file metadata.",
"sidebar.archive": "Archive",
"sidebar.clearFilter": "Clear filter",
"sidebar.tags": "Tags",
"sidebar.categories": "Categories",
"sidebar.clearTags": "Clear tags",
"sidebar.clearCategories": "Clear categories",
"sidebar.noPostsYet": "No posts yet",
"sidebar.noPagesYet": "No pages yet",
"sidebar.noMediaYet": "No media yet",
"sidebar.search": "Search",
"sidebar.searchPostsPlaceholder": "Search posts...",
"sidebar.searchPagesPlaceholder": "Search pages...",
"sidebar.searchMediaPlaceholder": "Search media...",
"sidebar.toggleFilters": "Toggle Filters",
"sidebar.newPost": "New Post",
"sidebar.importMedia": "Import media",
"sidebar.results": "{count} results",
"sidebar.resultsFor": "{count} results for \"{query}\"",
"sidebar.clearFilters": "Clear filters",
"sidebar.drafts": "Drafts",
"sidebar.published": "Published",
"sidebar.archived": "Archived",
"sidebar.untitled": "Untitled",
"sidebar.noMatchingPosts": "No matching posts",
"sidebar.createFirstPost": "Create your first post",
"sidebar.loadMore": "Load more ({loaded} of {total})",
"sidebar.loading": "Loading...",
"sidebar.noMediaFiles": "No media files",
"sidebar.settingsHeader": "Settings",
"sidebar.tagsHeader": "Tags",
"sidebar.nav.project": "Project",
"sidebar.nav.editor": "Editor",
"sidebar.nav.content": "Content",
"sidebar.nav.ai": "AI Assistant",
"sidebar.nav.publishing": "Publishing",
"sidebar.nav.data": "Data",
"sidebar.nav.style": "Style",
"sidebar.tagCloud": "Tag Cloud",
"sidebar.createEdit": "Create & Edit",
"sidebar.mergeTags": "Merge Tags",
"settings.project.descriptionGeneral": "General settings for the active blog project.",
"settings.project.nameLabel": "Project Name",
"settings.project.nameDescription": "The display name of your blog project.",
"settings.project.namePlaceholder": "My Blog",
"settings.project.descriptionLabel": "Description",
"settings.project.descriptionDescription": "A short description of your blog. This can be used in templates and metadata.",
"settings.project.descriptionPlaceholder": "A blog about...",
"settings.project.dataPathLabel": "Project Data Path",
"settings.project.dataPathDescription": "Custom folder for storing posts, media, and metadata. Leave empty to use the default location: {path}",
"settings.project.defaultLocation": "Default location",
"settings.project.publicUrlLabel": "Public URL",
"settings.project.publicUrlDescription": "The public base URL of your published blog (used for sitemap generation).",
"settings.project.publicUrlPlaceholder": "https://example.com",
"settings.project.mainLanguageLabel": "Main Language",
"settings.project.mainLanguageDescription": "The primary language for your blog content. AI-generated titles, alt text, and captions will use this language.",
"settings.project.defaultAuthorLabel": "Default Author",
"settings.project.defaultAuthorDescription": "The default author name for new posts and media. Can be overridden per item.",
"settings.project.defaultAuthorPlaceholder": "Author Name",
"settings.project.maxPostsPerPageLabel": "Max Posts Per Page",
"settings.project.maxPostsPerPageDescription": "Maximum number of posts shown per preview route page.",
"settings.project.saveButton": "Save Project Settings",
"editor.loadingPost": "Loading post...",
"editor.unsavedChanges": "Unsaved changes (auto-saves on switch)",
"editor.saving": "Saving...",
"editor.publish": "Publish",
"editor.publishTitle": "Save and make this post public",
"editor.discardChanges": "Discard Changes",
"editor.discardDraft": "Discard Draft",
"editor.discardChangesTitle": "Revert to last published version",
"editor.discardDraftTitle": "Delete this draft permanently",
"editor.delete": "Delete",
"editor.deleteTitle": "Delete this post permanently",
"editor.field.title": "Title",
"editor.field.tags": "Tags",
"editor.field.author": "Author",
"editor.field.slug": "Slug",
"editor.field.categories": "Categories",
"editor.field.content": "Content",
"editor.placeholder.tags": "Add tags...",
"editor.placeholder.author": "Author name",
"editor.placeholder.categories": "Add categories...",
"editor.placeholder.startWriting": "Start writing...",
"editor.mode.visual": "Visual",
"editor.mode.visualTitle": "Visual editor",
"editor.mode.markdownTitle": "Markdown source",
"editor.mode.previewTitle": "Read-only preview",
"editor.galleryTitle": "View {count} image(s)",
"editor.insertPostLinkTitle": "Link to post (Ctrl+K)",
"editor.insertMediaTitle": "Insert image from media library",
"editor.previewFrameTitle": "Post preview",
"editor.previewLoading": "Loading preview...",
"editor.footer.created": "Created",
"editor.footer.updated": "Updated",
"editor.footer.published": "Published"
}

View File

@@ -316,5 +316,99 @@
"metadataDiff.sync.fileToDb.error": "No se pudo sync to database",
"metadataDiff.value.database": "Base de datos",
"metadataDiff.value.file": "Archivo",
"metadataDiff.empty": "Haz clic en \"Buscar diferencias\" para comparar metadatos de base de datos con metadatos de archivos."
"metadataDiff.empty": "Haz clic en \"Buscar diferencias\" para comparar metadatos de base de datos con metadatos de archivos.",
"sidebar.archive": "Archive",
"sidebar.clearFilter": "Clear filter",
"sidebar.tags": "Tags",
"sidebar.categories": "Categories",
"sidebar.clearTags": "Clear tags",
"sidebar.clearCategories": "Clear categories",
"sidebar.noPostsYet": "No posts yet",
"sidebar.noPagesYet": "No pages yet",
"sidebar.noMediaYet": "No media yet",
"sidebar.search": "Search",
"sidebar.searchPostsPlaceholder": "Search posts...",
"sidebar.searchPagesPlaceholder": "Search pages...",
"sidebar.searchMediaPlaceholder": "Search media...",
"sidebar.toggleFilters": "Toggle Filters",
"sidebar.newPost": "New Post",
"sidebar.importMedia": "Import media",
"sidebar.results": "{count} results",
"sidebar.resultsFor": "{count} results for \"{query}\"",
"sidebar.clearFilters": "Clear filters",
"sidebar.drafts": "Drafts",
"sidebar.published": "Published",
"sidebar.archived": "Archived",
"sidebar.untitled": "Untitled",
"sidebar.noMatchingPosts": "No matching posts",
"sidebar.createFirstPost": "Create your first post",
"sidebar.loadMore": "Load more ({loaded} of {total})",
"sidebar.loading": "Loading...",
"sidebar.noMediaFiles": "No media files",
"sidebar.settingsHeader": "Settings",
"sidebar.tagsHeader": "Tags",
"sidebar.nav.project": "Project",
"sidebar.nav.editor": "Editor",
"sidebar.nav.content": "Content",
"sidebar.nav.ai": "AI Assistant",
"sidebar.nav.publishing": "Publishing",
"sidebar.nav.data": "Data",
"sidebar.nav.style": "Style",
"sidebar.tagCloud": "Tag Cloud",
"sidebar.createEdit": "Create & Edit",
"sidebar.mergeTags": "Merge Tags",
"settings.project.descriptionGeneral": "General settings for the active blog project.",
"settings.project.nameLabel": "Project Name",
"settings.project.nameDescription": "The display name of your blog project.",
"settings.project.namePlaceholder": "My Blog",
"settings.project.descriptionLabel": "Description",
"settings.project.descriptionDescription": "A short description of your blog. This can be used in templates and metadata.",
"settings.project.descriptionPlaceholder": "A blog about...",
"settings.project.dataPathLabel": "Project Data Path",
"settings.project.dataPathDescription": "Custom folder for storing posts, media, and metadata. Leave empty to use the default location: {path}",
"settings.project.defaultLocation": "Default location",
"settings.project.publicUrlLabel": "Public URL",
"settings.project.publicUrlDescription": "The public base URL of your published blog (used for sitemap generation).",
"settings.project.publicUrlPlaceholder": "https://example.com",
"settings.project.mainLanguageLabel": "Main Language",
"settings.project.mainLanguageDescription": "The primary language for your blog content. AI-generated titles, alt text, and captions will use this language.",
"settings.project.defaultAuthorLabel": "Default Author",
"settings.project.defaultAuthorDescription": "The default author name for new posts and media. Can be overridden per item.",
"settings.project.defaultAuthorPlaceholder": "Author Name",
"settings.project.maxPostsPerPageLabel": "Max Posts Per Page",
"settings.project.maxPostsPerPageDescription": "Maximum number of posts shown per preview route page.",
"settings.project.saveButton": "Save Project Settings",
"editor.loadingPost": "Loading post...",
"editor.unsavedChanges": "Unsaved changes (auto-saves on switch)",
"editor.saving": "Saving...",
"editor.publish": "Publish",
"editor.publishTitle": "Save and make this post public",
"editor.discardChanges": "Discard Changes",
"editor.discardDraft": "Discard Draft",
"editor.discardChangesTitle": "Revert to last published version",
"editor.discardDraftTitle": "Delete this draft permanently",
"editor.delete": "Delete",
"editor.deleteTitle": "Delete this post permanently",
"editor.field.title": "Title",
"editor.field.tags": "Tags",
"editor.field.author": "Author",
"editor.field.slug": "Slug",
"editor.field.categories": "Categories",
"editor.field.content": "Content",
"editor.placeholder.tags": "Add tags...",
"editor.placeholder.author": "Author name",
"editor.placeholder.categories": "Add categories...",
"editor.placeholder.startWriting": "Start writing...",
"editor.mode.visual": "Visual",
"editor.mode.visualTitle": "Visual editor",
"editor.mode.markdownTitle": "Markdown source",
"editor.mode.previewTitle": "Read-only preview",
"editor.galleryTitle": "View {count} image(s)",
"editor.insertPostLinkTitle": "Link to post (Ctrl+K)",
"editor.insertMediaTitle": "Insert image from media library",
"editor.previewFrameTitle": "Post preview",
"editor.previewLoading": "Loading preview...",
"editor.footer.created": "Created",
"editor.footer.updated": "Updated",
"editor.footer.published": "Published"
}

View File

@@ -316,5 +316,99 @@
"metadataDiff.sync.fileToDb.error": "Échec de sync to database",
"metadataDiff.value.database": "Base de données",
"metadataDiff.value.file": "Fichier",
"metadataDiff.empty": "Cliquez sur « Rechercher les différences » pour comparer les métadonnées de la base et celles des fichiers."
"metadataDiff.empty": "Cliquez sur « Rechercher les différences » pour comparer les métadonnées de la base et celles des fichiers.",
"sidebar.archive": "Archive",
"sidebar.clearFilter": "Clear filter",
"sidebar.tags": "Tags",
"sidebar.categories": "Categories",
"sidebar.clearTags": "Clear tags",
"sidebar.clearCategories": "Clear categories",
"sidebar.noPostsYet": "No posts yet",
"sidebar.noPagesYet": "No pages yet",
"sidebar.noMediaYet": "No media yet",
"sidebar.search": "Search",
"sidebar.searchPostsPlaceholder": "Search posts...",
"sidebar.searchPagesPlaceholder": "Search pages...",
"sidebar.searchMediaPlaceholder": "Search media...",
"sidebar.toggleFilters": "Toggle Filters",
"sidebar.newPost": "New Post",
"sidebar.importMedia": "Import media",
"sidebar.results": "{count} results",
"sidebar.resultsFor": "{count} results for \"{query}\"",
"sidebar.clearFilters": "Clear filters",
"sidebar.drafts": "Drafts",
"sidebar.published": "Published",
"sidebar.archived": "Archived",
"sidebar.untitled": "Untitled",
"sidebar.noMatchingPosts": "No matching posts",
"sidebar.createFirstPost": "Create your first post",
"sidebar.loadMore": "Load more ({loaded} of {total})",
"sidebar.loading": "Loading...",
"sidebar.noMediaFiles": "No media files",
"sidebar.settingsHeader": "Settings",
"sidebar.tagsHeader": "Tags",
"sidebar.nav.project": "Project",
"sidebar.nav.editor": "Editor",
"sidebar.nav.content": "Content",
"sidebar.nav.ai": "AI Assistant",
"sidebar.nav.publishing": "Publishing",
"sidebar.nav.data": "Data",
"sidebar.nav.style": "Style",
"sidebar.tagCloud": "Tag Cloud",
"sidebar.createEdit": "Create & Edit",
"sidebar.mergeTags": "Merge Tags",
"settings.project.descriptionGeneral": "General settings for the active blog project.",
"settings.project.nameLabel": "Project Name",
"settings.project.nameDescription": "The display name of your blog project.",
"settings.project.namePlaceholder": "My Blog",
"settings.project.descriptionLabel": "Description",
"settings.project.descriptionDescription": "A short description of your blog. This can be used in templates and metadata.",
"settings.project.descriptionPlaceholder": "A blog about...",
"settings.project.dataPathLabel": "Project Data Path",
"settings.project.dataPathDescription": "Custom folder for storing posts, media, and metadata. Leave empty to use the default location: {path}",
"settings.project.defaultLocation": "Default location",
"settings.project.publicUrlLabel": "Public URL",
"settings.project.publicUrlDescription": "The public base URL of your published blog (used for sitemap generation).",
"settings.project.publicUrlPlaceholder": "https://example.com",
"settings.project.mainLanguageLabel": "Main Language",
"settings.project.mainLanguageDescription": "The primary language for your blog content. AI-generated titles, alt text, and captions will use this language.",
"settings.project.defaultAuthorLabel": "Default Author",
"settings.project.defaultAuthorDescription": "The default author name for new posts and media. Can be overridden per item.",
"settings.project.defaultAuthorPlaceholder": "Author Name",
"settings.project.maxPostsPerPageLabel": "Max Posts Per Page",
"settings.project.maxPostsPerPageDescription": "Maximum number of posts shown per preview route page.",
"settings.project.saveButton": "Save Project Settings",
"editor.loadingPost": "Loading post...",
"editor.unsavedChanges": "Unsaved changes (auto-saves on switch)",
"editor.saving": "Saving...",
"editor.publish": "Publish",
"editor.publishTitle": "Save and make this post public",
"editor.discardChanges": "Discard Changes",
"editor.discardDraft": "Discard Draft",
"editor.discardChangesTitle": "Revert to last published version",
"editor.discardDraftTitle": "Delete this draft permanently",
"editor.delete": "Delete",
"editor.deleteTitle": "Delete this post permanently",
"editor.field.title": "Title",
"editor.field.tags": "Tags",
"editor.field.author": "Author",
"editor.field.slug": "Slug",
"editor.field.categories": "Categories",
"editor.field.content": "Content",
"editor.placeholder.tags": "Add tags...",
"editor.placeholder.author": "Author name",
"editor.placeholder.categories": "Add categories...",
"editor.placeholder.startWriting": "Start writing...",
"editor.mode.visual": "Visual",
"editor.mode.visualTitle": "Visual editor",
"editor.mode.markdownTitle": "Markdown source",
"editor.mode.previewTitle": "Read-only preview",
"editor.galleryTitle": "View {count} image(s)",
"editor.insertPostLinkTitle": "Link to post (Ctrl+K)",
"editor.insertMediaTitle": "Insert image from media library",
"editor.previewFrameTitle": "Post preview",
"editor.previewLoading": "Loading preview...",
"editor.footer.created": "Created",
"editor.footer.updated": "Updated",
"editor.footer.published": "Published"
}

View File

@@ -316,5 +316,99 @@
"metadataDiff.sync.fileToDb.error": "Impossibile sync to database",
"metadataDiff.value.database": "Database locale",
"metadataDiff.value.file": "File sorgente",
"metadataDiff.empty": "Fai clic su \"Scansiona differenze\" per confrontare i metadati del database con quelli dei file."
"metadataDiff.empty": "Fai clic su \"Scansiona differenze\" per confrontare i metadati del database con quelli dei file.",
"sidebar.archive": "Archive",
"sidebar.clearFilter": "Clear filter",
"sidebar.tags": "Tags",
"sidebar.categories": "Categories",
"sidebar.clearTags": "Clear tags",
"sidebar.clearCategories": "Clear categories",
"sidebar.noPostsYet": "No posts yet",
"sidebar.noPagesYet": "No pages yet",
"sidebar.noMediaYet": "No media yet",
"sidebar.search": "Search",
"sidebar.searchPostsPlaceholder": "Search posts...",
"sidebar.searchPagesPlaceholder": "Search pages...",
"sidebar.searchMediaPlaceholder": "Search media...",
"sidebar.toggleFilters": "Toggle Filters",
"sidebar.newPost": "New Post",
"sidebar.importMedia": "Import media",
"sidebar.results": "{count} results",
"sidebar.resultsFor": "{count} results for \"{query}\"",
"sidebar.clearFilters": "Clear filters",
"sidebar.drafts": "Drafts",
"sidebar.published": "Published",
"sidebar.archived": "Archived",
"sidebar.untitled": "Untitled",
"sidebar.noMatchingPosts": "No matching posts",
"sidebar.createFirstPost": "Create your first post",
"sidebar.loadMore": "Load more ({loaded} of {total})",
"sidebar.loading": "Loading...",
"sidebar.noMediaFiles": "No media files",
"sidebar.settingsHeader": "Settings",
"sidebar.tagsHeader": "Tags",
"sidebar.nav.project": "Project",
"sidebar.nav.editor": "Editor",
"sidebar.nav.content": "Content",
"sidebar.nav.ai": "AI Assistant",
"sidebar.nav.publishing": "Publishing",
"sidebar.nav.data": "Data",
"sidebar.nav.style": "Style",
"sidebar.tagCloud": "Tag Cloud",
"sidebar.createEdit": "Create & Edit",
"sidebar.mergeTags": "Merge Tags",
"settings.project.descriptionGeneral": "General settings for the active blog project.",
"settings.project.nameLabel": "Project Name",
"settings.project.nameDescription": "The display name of your blog project.",
"settings.project.namePlaceholder": "My Blog",
"settings.project.descriptionLabel": "Description",
"settings.project.descriptionDescription": "A short description of your blog. This can be used in templates and metadata.",
"settings.project.descriptionPlaceholder": "A blog about...",
"settings.project.dataPathLabel": "Project Data Path",
"settings.project.dataPathDescription": "Custom folder for storing posts, media, and metadata. Leave empty to use the default location: {path}",
"settings.project.defaultLocation": "Default location",
"settings.project.publicUrlLabel": "Public URL",
"settings.project.publicUrlDescription": "The public base URL of your published blog (used for sitemap generation).",
"settings.project.publicUrlPlaceholder": "https://example.com",
"settings.project.mainLanguageLabel": "Main Language",
"settings.project.mainLanguageDescription": "The primary language for your blog content. AI-generated titles, alt text, and captions will use this language.",
"settings.project.defaultAuthorLabel": "Default Author",
"settings.project.defaultAuthorDescription": "The default author name for new posts and media. Can be overridden per item.",
"settings.project.defaultAuthorPlaceholder": "Author Name",
"settings.project.maxPostsPerPageLabel": "Max Posts Per Page",
"settings.project.maxPostsPerPageDescription": "Maximum number of posts shown per preview route page.",
"settings.project.saveButton": "Save Project Settings",
"editor.loadingPost": "Loading post...",
"editor.unsavedChanges": "Unsaved changes (auto-saves on switch)",
"editor.saving": "Saving...",
"editor.publish": "Publish",
"editor.publishTitle": "Save and make this post public",
"editor.discardChanges": "Discard Changes",
"editor.discardDraft": "Discard Draft",
"editor.discardChangesTitle": "Revert to last published version",
"editor.discardDraftTitle": "Delete this draft permanently",
"editor.delete": "Delete",
"editor.deleteTitle": "Delete this post permanently",
"editor.field.title": "Title",
"editor.field.tags": "Tags",
"editor.field.author": "Author",
"editor.field.slug": "Slug",
"editor.field.categories": "Categories",
"editor.field.content": "Content",
"editor.placeholder.tags": "Add tags...",
"editor.placeholder.author": "Author name",
"editor.placeholder.categories": "Add categories...",
"editor.placeholder.startWriting": "Start writing...",
"editor.mode.visual": "Visual",
"editor.mode.visualTitle": "Visual editor",
"editor.mode.markdownTitle": "Markdown source",
"editor.mode.previewTitle": "Read-only preview",
"editor.galleryTitle": "View {count} image(s)",
"editor.insertPostLinkTitle": "Link to post (Ctrl+K)",
"editor.insertMediaTitle": "Insert image from media library",
"editor.previewFrameTitle": "Post preview",
"editor.previewLoading": "Loading preview...",
"editor.footer.created": "Created",
"editor.footer.updated": "Updated",
"editor.footer.published": "Published"
}