Merge pull request #382 from storytold/claude/i18n-371-spanish
Fix #371: Spanish interface
This commit is contained in:
commit
a673b2bb7a
|
|
@ -0,0 +1,182 @@
|
|||
{
|
||||
" ({unsure} with several look-alike files: use Locate)": " ({unsure} con varios archivos parecidos: usar Localizar)",
|
||||
" ({} in Recently Deleted)": " ({} en Eliminadas recientemente)",
|
||||
" · {:.0}% clipped": " · {:.0}% recortado",
|
||||
" · {failed} couldn't be rendered": " · no se pudieron renderizar: {failed}",
|
||||
" · {skipped} skipped (file exists)": " · omitidas: {skipped} (el archivo existe)",
|
||||
" · {} duplicate{} skipped": " · {0} duplicado{1} omitido{1}",
|
||||
" · {} failed: {}": " · {} con errores: {}",
|
||||
" · {} moved": " · movidas: {}",
|
||||
" · {} not readable": " · ilegibles: {}",
|
||||
" · {} original{} left at the source": " · originales conservados en el origen: {}{:.0}",
|
||||
" · {} restored from Recently Deleted": " · restauradas desde Eliminadas recientemente: {}",
|
||||
" — not carried over: {}{}": " — no transferido: {}{}",
|
||||
"+{} more": "+{} más",
|
||||
", {failed} file{} not readable": ", {failed} archivo{0} ilegible{0}",
|
||||
"; {kept} already had a location": "; ya tenían ubicación: {kept}",
|
||||
"; {outside} outside its time range": "; fuera de su intervalo de tiempo: {outside}",
|
||||
"@{}: {} PRs, {} commits, +{} / −{} lines (Δ {}), +{} / −{} binary assets, {} – {}": "@{}: {} PR, {} commits, +{} / −{} líneas (Δ {}), +{} / −{} recursos binarios, {} – {}",
|
||||
"Add {local_n} to My Photos": "Añadir {local_n} a Mis fotos",
|
||||
"Add {} Photo{}": "Añadir {} foto{}",
|
||||
"Add {} Photo{}, restore {}": "Añadir {} foto{}, restaurar {}",
|
||||
"Add “{}” to Favorites": "Añadir “{}” a Favoritos",
|
||||
"Added {n} photo{} to My Photos": "{n} foto{0} añadida{0} a Mis fotos",
|
||||
"Added {n} photo{} to “{}”": "{n} foto{0} añadida{0} a “{1}”",
|
||||
"Added {what} to {name}": "{what} añadido a {name}",
|
||||
"Adding photos… {} of {}": "Añadiendo fotos… {} de {}",
|
||||
"All {n} selected photos move by the same amount.": "Las {n} fotos seleccionadas se desplazan la misma cantidad.",
|
||||
"Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Ya en la biblioteca, en Eliminadas recientemente: {0} foto{1} seleccionada{1} · clic derecho ▸ Restaurar, o Eliminar definitivamente para importar de nuevo",
|
||||
"Already in the library: {} photo{} selected in All Photos": "Ya en la biblioteca: {0} foto{1} seleccionada{1} en Todas las fotos",
|
||||
"Auto ({})": "Automático ({})",
|
||||
"Auto Import: added {} photo{}": "Importación automática: {0} foto{1} añadida{1}",
|
||||
"Auto Sync: edits apply to {n} photos": "Sincronización automática: las ediciones se aplican a {n} fotos",
|
||||
"Automatic ({} MB)": "Automático ({} MB)",
|
||||
"Build 1:1 Previews ({scope})": "Generar vistas previas 1:1 ({scope})",
|
||||
"Build Smart Previews ({scope})": "Generar vistas previas inteligentes ({scope})",
|
||||
"Build Standard-Sized Previews ({scope})": "Generar vistas previas de tamaño estándar ({scope})",
|
||||
"Building previews for {} photos…": "Generando vistas previas de {} fotos…",
|
||||
"Click {}:1": "Clic {}:1",
|
||||
"Couldn't open the editor: {e}": "No se pudo abrir el editor: {e}",
|
||||
"Create {n} Virtual Copies": "Crear {n} copias virtuales",
|
||||
"Creates {} stacks from {} of {scope}": "Crea {} pilas a partir de {} de {scope}",
|
||||
"Decoder: {reason}": "Decodificador: {reason}",
|
||||
"Delete \"{label}\"": "Eliminar \"{label}\"",
|
||||
"Delete \"{label}\" (and the mask)": "Eliminar \"{label}\" (y la máscara)",
|
||||
"Delete {n} Photos": "Eliminar {n} fotos",
|
||||
"Delete “{current}”": "Eliminar “{current}”",
|
||||
"Discard Smart Previews ({scope})": "Descartar vistas previas inteligentes ({scope})",
|
||||
"Done ({what}): {done} photo{plural}": "Listo ({what}): {done} foto{plural}",
|
||||
"Duplicate \"{label}\"": "Duplicar \"{label}\"",
|
||||
"Example: {example}": "Ejemplo: {example}",
|
||||
"Exported {n} photo{}": "{n} foto{0} exportada{0}",
|
||||
"Exported {ok} of {total} photo{}": "Exportadas {ok} de {total} foto{}",
|
||||
"Exported {} point curve preset{}": "{0} ajuste{1} preestablecido{1} de curva de puntos exportado{1}",
|
||||
"Exported {} preset{}": "{0} ajuste{1} preestablecido{1} exportado{1}",
|
||||
"Exporting {} of {total}": "Exportando {} de {total}",
|
||||
"Filter bar — {active} active filter{}": "Barra de filtros: {active} filtro{0} activo{0}",
|
||||
"Focus {:.0}": "Enfoque {:.0}",
|
||||
"Folder “{}” (and its subfolders)": "Carpeta “{}” (y sus subcarpetas)",
|
||||
"Found {n} missing photo{}; {left} still missing{unsure}": "Fotos que faltaban encontradas: {n}{:.0}; siguen faltando: {left}{unsure}",
|
||||
"Healed {n} dust spot{}": "{n} mancha{0} de polvo corregida{0}",
|
||||
"Import cancelled · {} photo{} added": "Importación cancelada · {0} foto{1} añadida{1}",
|
||||
"Import failed: {e}": "Error de importación: {e}",
|
||||
"Imported {n} point curve preset{}": "{n} ajuste{0} preestablecido{0} de curva de puntos importado{0}",
|
||||
"Imported {n} preset{}": "{n} ajuste{0} preestablecido{0} importado{0}",
|
||||
"Imported {n} preset{}, {f} file{} not readable": "{n} ajuste{0} preestablecido{0} importado{0}, {f} archivo{1} ilegible{1}",
|
||||
"Imported {profiles} profile{} (Profile browser ▸ their groups)": "Perfiles importados: {profiles}{:.0} (Explorador de perfiles ▸ sus grupos)",
|
||||
"Imported {} photo{}": "{0} foto{1} importada{1}",
|
||||
"Insert at the cursor (also written {})": "Insertar en el cursor (también se escribe {})",
|
||||
"Label Set: {name}": "Conjunto de etiquetas: {name}",
|
||||
"LightCraft could not open its window: {e}": "LightCraft no pudo abrir su ventana: {e}",
|
||||
"LightCraft could not open its window: {e}\n\nThe log file has the details: {path}": "LightCraft no pudo abrir su ventana: {e}\n\nLos detalles están en el archivo de registro: {path}",
|
||||
"MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0. Fuentes: {} (OFL). Iconos: originales.",
|
||||
"Matches: {}": "Coincidencias: {}",
|
||||
"Merging… {stage} {:.0}%": "Combinando… {stage} {:.0}%",
|
||||
"Move {what} to Recently Deleted?": "¿Mover {what} a Eliminadas recientemente?",
|
||||
"Named ({named_n})": "Con nombre ({named_n})",
|
||||
"Painting “{k}”: click photos to add or remove it · Esc stops": "Pintando “{k}”: hacer clic en las fotos para añadirla o quitarla · Esc para terminar",
|
||||
"Paste into {n} photo{} — only settings that were copied are pasted": "Pegar en {n} foto{}: solo se pegan los ajustes copiados",
|
||||
"Preset: {name}": "Ajuste preestablecido: {name}",
|
||||
"Preview only — editing the camera's embedded JPEG ({})": "Solo vista previa: editando el JPEG incrustado de la cámara ({})",
|
||||
"Preview only — {}": "Solo vista previa: {}",
|
||||
"Previews ready for {done} photo{plural}": "Vistas previas listas para {done} foto{plural}",
|
||||
"Profile: {}": "Perfil: {}",
|
||||
"Proof Copy ({})": "Copia de prueba ({})",
|
||||
"Proof Preview · {}": "Vista previa de prueba · {}",
|
||||
"Quick Develop · {n} photos": "Revelado rápido · {n} fotos",
|
||||
"Quick Develop: {name}": "Revelado rápido: {name}",
|
||||
"Rated {}": "Valorada con {}",
|
||||
"Reading photos… {done} of {total}": "Leyendo fotos… {done} de {total}",
|
||||
"Reading photos… {} of {}": "Leyendo fotos… {} de {}",
|
||||
"Redo {}": "Rehacer {}",
|
||||
"Remove “{name}” and its {count} photo{} from the library?": "¿Quitar “{name}” y sus {count} foto{} de la biblioteca?",
|
||||
"Remove “{}” from Favorites": "Quitar “{}” de Favoritos",
|
||||
"Removed {what} from {name}": "{what} quitado de {name}",
|
||||
"Rename {n} Photos…": "Cambiar nombre de {n} fotos…",
|
||||
"Rename “{name}”": "Cambiar nombre de “{name}”",
|
||||
"Renames “{from}” on {n} photo{} (keywords below it too). Use | for levels, e.g. Travel|Italy. An existing name merges the two.": "Cambia el nombre de “{from}” en {n} foto{} (también las palabras clave que dependen de ella). | separa niveles, p. ej. Viajes|Italia. Un nombre existente combina las dos.",
|
||||
"Rendering on the CPU: {why}": "Renderizado en la CPU: {why}",
|
||||
"Replace {} with:": "Reemplazar {} por:",
|
||||
"Reset {name}": "Restablecer {name}",
|
||||
"Reset {} Channel": "Restablecer canal {}",
|
||||
"Restore {} Photo{}": "Restaurar {} foto{}",
|
||||
"Saved export preset “{}”": "Ajuste preestablecido de exportación “{}” guardado",
|
||||
"Scores {scope} for focus and exposure and finds similar shots taken within seconds of each other (bursts).": "Puntúa el enfoque y la exposición de {scope} y busca tomas similares hechas con pocos segundos de diferencia (ráfagas).",
|
||||
"Show {hidden} hidden location{}": "Mostrar ubicaciones ocultas: {hidden}{:.0}",
|
||||
"Showing {n} of {}": "Mostrando {n} de {}",
|
||||
"Smart album: {}": "Álbum inteligente: {}",
|
||||
"Tagged {n} photo{} from the tracklog": "{n} foto{0} ubicada{0} desde el registro de ruta",
|
||||
"The SAM 3 download failed: {e}": "Error en la descarga de SAM 3: {e}",
|
||||
"Undo {}": "Deshacer {}",
|
||||
"Unknown tag{s} {} stay{} as typed (see Tags)": "Etiqueta{s} desconocida{s} {} sin cambios{:.0} (ver Etiquetas)",
|
||||
"Updated “{name}”": "“{name}” actualizado",
|
||||
"Version {} — a clean-room, pure-Rust photo library and raw developer.": "Versión {}: biblioteca de fotos y revelador RAW de desarrollo independiente (clean-room) en Rust puro.",
|
||||
"Version: {}": "Versión: {}",
|
||||
"Virtual copy “{name}” of {of}": "Copia virtual “{name}” de {of}",
|
||||
"Working on {what} for {} photos…": "Procesando {what} para {} fotos…",
|
||||
"none (CPU rendering): {why}": "ninguna (renderizado por CPU): {why}",
|
||||
"the {n} selected photos": "las {n} fotos seleccionadas",
|
||||
"the {} photos in view": "las {} fotos de la vista",
|
||||
"these {count} photos": "estas {count} fotos",
|
||||
"{count} smart preview{} · {:.1} MB": "{count} vista{0} previa{0} inteligente{0} · {1:.1} MB",
|
||||
"{f} folders (and their subfolders)": "{f} carpetas (y sus subcarpetas)",
|
||||
"{label} Grading": "Gradación de {label}",
|
||||
"{label} {d:+} on every selected photo": "{label} {d:+} en cada foto seleccionada",
|
||||
"{label} {index} of {n}": "{label} {index} de {n}",
|
||||
"{label}, {n} photos": "{label}, {n} fotos",
|
||||
"{matching} of {t} photos": "{matching} de {t} fotos",
|
||||
"{matching} photos": "{matching} fotos",
|
||||
"{mode} spot {} of {}": "{mode}: mancha {} de {}",
|
||||
"{month}": "{month:02}",
|
||||
"{month} {year}": "{month:02}/{year}",
|
||||
"{msg} ({failed} failed)": "{msg} ({failed} con errores)",
|
||||
"{name} Label": "Etiqueta {name}",
|
||||
"{name} Off": "{name}: desactivado",
|
||||
"{name} On": "{name}: activado",
|
||||
"{name} opened for editing; it is stacked with the original": "{name} abierta para editar; está apilada con el original",
|
||||
"{name} — double-click to reset it": "{name}: doble clic para restablecer",
|
||||
"{n} change{} couldn't be written to disk: {e}\nIf you quit now, {} lost.": "Cambios que no se pudieron escribir en el disco: {n}{0:.0}: {e}\nSi se sale ahora, se perderán.{1:.0}",
|
||||
"{n} change{} saved in memory but not written to disk: {e}\nLightCraft retries automatically; quitting now would lose {}.": "Cambios guardados en memoria, pero no escritos en el disco: {n}{0:.0}: {e}\nLightCraft vuelve a intentarlo automáticamente; si se sale ahora, se perderán.{1:.0}",
|
||||
"{n} change{} saved in memory but not written to disk: {e} — LightCraft will retry": "Cambios guardados solo en memoria: {n}{:.0}: {e}; LightCraft volverá a intentarlo",
|
||||
"{n} found · {sel} selected": "{n} encontradas · {sel} seleccionadas",
|
||||
"{n} photos": "{n} fotos",
|
||||
"{n} photos in {} are hidden by the filters above": "Los filtros de arriba ocultan {n} fotos en {}",
|
||||
"{n} photo{}": "{n} foto{}",
|
||||
"{n} photo{} match · updates automatically as photos change": "{n} foto{0} coincidente{0} · se actualiza automáticamente cuando cambian las fotos",
|
||||
"{n} photo{} now · updates automatically as photos change": "{n} foto{} ahora · se actualiza automáticamente cuando cambian las fotos",
|
||||
"{pid} (missing)": "{pid} (falta)",
|
||||
"{sel_n} selected · {counted}": "{sel_n} seleccionadas · {counted}",
|
||||
"{stage}… {:.0}%": "{stage}… {:.0}%",
|
||||
"{verb} {n} Photo{}": "{verb} {n} foto{}",
|
||||
"{weekday}, {day}": "{weekday}, {day}",
|
||||
"{weekday}, {day} {month} {year}": "{weekday}, {day}/{month:02}/{year}",
|
||||
"{what} merge added": "Combinación {what} añadida",
|
||||
"{what} merge failed: {e}": "Error en la combinación {what}: {e}",
|
||||
"{year}": "{year}",
|
||||
"{{date:…}} directives: {}": "Directivas de {{date:…}}: {}",
|
||||
"{} and higher": "{} o más",
|
||||
"{} contributors · {} commits": "{} colaboradores · {} commits",
|
||||
"{} failed": "Con errores: {}",
|
||||
"{} files": "{} archivos",
|
||||
"{} files and {f} folder{}": "{} archivos y {f} carpeta{}",
|
||||
"{} item{}": "{0} elemento{1}",
|
||||
"{} of 4 guides — drag along lines that should be vertical or horizontal.": "{} de 4 guías: arrastrar a lo largo de líneas que deban ser verticales u horizontales.",
|
||||
"{} photos": "{} fotos",
|
||||
"{} photos · exposures {} EV": "{} fotos · exposiciones {} EV",
|
||||
"{} photos · {} · {:.0}° × {:.0}°": "{} fotos · {} · {:.0}° × {:.0}°",
|
||||
"{} photo{} not readable": "{0} foto{1} ilegible{1}",
|
||||
"{} sample{}": "{} muestra{}",
|
||||
"{} sec": "{} s",
|
||||
"{} spot(s) on this photo": "{} mancha(s) en esta foto",
|
||||
"{} — show their photos": "{}: mostrar sus fotos",
|
||||
"· {dups} already in the library": "· ya en la biblioteca: {dups}",
|
||||
"· {n} photo{}": "· {n} foto{}",
|
||||
"… and {more} more": "… y {more} más",
|
||||
"LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft aún no puede decodificar esta variante RAW ({}). Se está editando la vista previa JPEG incrustada de la cámara, que ya incluye el estilo de imagen de la cámara (p. ej. Monocromo) y el balance de blancos.",
|
||||
"Filtered: {label}": "Filtrado: {label}",
|
||||
"{n} similar photo{} · View ▸ Clear Filters to see all": "Fotos similares: {n}{:.0} · Vista ▸ Borrar filtros para ver todas",
|
||||
"Moved; {} photo(s) relinked": "Movida; {} foto(s) vinculada(s) de nuevo",
|
||||
"{} label (click more labels to show any of them)": "Etiqueta {} (hacer clic en más etiquetas para mostrar cualquiera de ellas)",
|
||||
", {} star{}": ", {} estrella{}",
|
||||
", {} label": ", etiqueta {}"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -121,6 +121,7 @@ language_table! {
|
|||
ZhHant, "zh-hant", "繁體中文(台灣)", "Hant", include_str!("../locales/zh-hant.json");
|
||||
Ja, "ja", "日本語", "Jpan", include_str!("../locales/ja.json");
|
||||
PtBr, "pt-br", "Português (Brasil)", "Latn", include_str!("../locales/pt-br.json");
|
||||
Es, "es", "Español", "Latn", include_str!("../locales/es.json");
|
||||
De, "de", "Deutsch", "Latn", include_str!("../locales/de.json");
|
||||
Ru, "ru", "Русский", "Cyrl", include_str!("../locales/ru.json");
|
||||
}
|
||||
|
|
@ -449,6 +450,9 @@ mod tests {
|
|||
for tag in ["ru", "ru-RU", "ru_RU.UTF-8", "ru-UA"] {
|
||||
assert_eq!(Locale::parse_tag(tag), Some(Locale::Ru), "{tag}");
|
||||
}
|
||||
for tag in ["es", "es-ES", "es_MX.UTF-8", "es-419"] {
|
||||
assert_eq!(Locale::parse_tag(tag), Some(Locale::Es), "{tag}");
|
||||
}
|
||||
assert_eq!(Locale::parse_tag("xx"), None);
|
||||
}
|
||||
|
||||
|
|
@ -571,6 +575,7 @@ mod tests {
|
|||
("app.language.simplifiedChinese", Locale::ZhHans),
|
||||
("app.language.japanese", Locale::Ja),
|
||||
("app.language.portuguese", Locale::PtBr),
|
||||
("app.language.spanish", Locale::Es),
|
||||
("app.language.german", Locale::De),
|
||||
("app.language.russian", Locale::Ru),
|
||||
];
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ pub const LANGUAGE_COMMANDS: &[UiCommand] = &[
|
|||
("app.language.traditionalChinese", crate::i18n::Locale::ZhHant.name(), None, "Edit>Language"),
|
||||
("app.language.japanese", crate::i18n::Locale::Ja.name(), None, "Edit>Language"),
|
||||
("app.language.portuguese", crate::i18n::Locale::PtBr.name(), None, "Edit>Language"),
|
||||
("app.language.spanish", crate::i18n::Locale::Es.name(), None, "Edit>Language"),
|
||||
("app.language.german", crate::i18n::Locale::De.name(), None, "Edit>Language"),
|
||||
("app.language.russian", crate::i18n::Locale::Ru.name(), None, "Edit>Language"),
|
||||
];
|
||||
|
|
@ -37,6 +38,7 @@ pub fn language_from_command(id: &str) -> Option<crate::i18n::Locale> {
|
|||
"app.language.traditionalChinese" => Some(crate::i18n::Locale::ZhHant),
|
||||
"app.language.japanese" => Some(crate::i18n::Locale::Ja),
|
||||
"app.language.portuguese" => Some(crate::i18n::Locale::PtBr),
|
||||
"app.language.spanish" => Some(crate::i18n::Locale::Es),
|
||||
"app.language.german" => Some(crate::i18n::Locale::De),
|
||||
"app.language.russian" => Some(crate::i18n::Locale::Ru),
|
||||
_ => None,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
# LightCraft en español
|
||||
|
||||
Elegir **Editar → Idioma → Español** o **Ajustes → General → Idioma**. El cambio se aplica al
|
||||
momento y se conserva para el próximo inicio (`language: "es"` en `ui.json`). `LIGHTCRAFT_LANGUAGE`
|
||||
acepta cualquier variante del español (`es`, `es-ES`, `es_MX.UTF-8`, `es-419`…).
|
||||
|
||||
El catálogo en español cubre los menús, los métodos abreviados de teclado, la biblioteca, el
|
||||
revelado, el recorte, las máscaras, la importación y la exportación, los ajustes, los ajustes
|
||||
preestablecidos y perfiles integrados, el historial, las fechas y los mensajes de progreso. Como en
|
||||
los demás idiomas, los errores técnicos de los niveles inferiores siguen en inglés, y los textos
|
||||
que aún no están en el catálogo se muestran en inglés.
|
||||
|
||||
Los nombres de archivo, los identificadores de comandos, las plantillas y los álbumes, ajustes
|
||||
preestablecidos y metadatos con nombres propios no se traducen. La fuente de la interfaz, Inter,
|
||||
incluye todos los caracteres del español; no hacen falta fuentes adicionales.
|
||||
|
||||
## Terminología
|
||||
|
||||
Se usan infinitivos o formas impersonales en las instrucciones («Hacer clic…», «Elegir…»), sin
|
||||
tratamiento de usted. Algunos términos que conviene mantener coherentes:
|
||||
|
||||
| Inglés | Español |
|
||||
|---|---|
|
||||
| Highlights / Shadows | Iluminaciones / Sombras |
|
||||
| Dehaze | Eliminar neblina |
|
||||
| Vibrance | Intensidad |
|
||||
| Tint | Matiz |
|
||||
| Hue (HSL) | Tono |
|
||||
| Color Grading | Gradación de color |
|
||||
| Preset | Ajuste preestablecido |
|
||||
| Pick / Reject | Seleccionada / Rechazada |
|
||||
| Upright | Vertical |
|
||||
| Lens Corrections | Correcciones de lente |
|
||||
|
||||
Las correcciones de hablantes nativos son bienvenidas: abrir un issue o un pull request con el
|
||||
texto inglés, la traducción actual y la propuesta.
|
||||
|
||||
## Mantenimiento y comprobación
|
||||
|
||||
Textos fijos: `crates/ui-egui/locales/es.json`. Mensajes con valores:
|
||||
`crates/ui-egui/locales/es-formats.json`. Las claves en inglés no cambian; el compilador de Rust
|
||||
comprueba los marcadores al compilar. Las terminaciones de plural del inglés se ocultan con `{:.0}`.
|
||||
|
||||
```sh
|
||||
cargo test -p lightcraft-ui-egui i18n::tests -- --nocapture
|
||||
LIGHTCRAFT_LANGUAGE=es lightcraft-cli snapshot --demo -o espanol.png --size 1600x1000
|
||||
```
|
||||
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
The interface ships in the language it is written in (English) plus every language in the table in
|
||||
`crates/ui-egui/src/i18n.rs`. Today that is English, Simplified Chinese (`zh-hans`), Traditional
|
||||
Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), German (`de`) and Russian (`ru`). This file is the reference for **adding or maintaining a language**; the per-language notes
|
||||
Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), Spanish (`es`), German (`de`) and Russian (`ru`). This file is the reference for **adding or maintaining a language**; the per-language notes
|
||||
are in [`localization-zh-hans.md`](localization-zh-hans.md), [`localization-zh-hant.md`](localization-zh-hant.md),
|
||||
[`localization-ja.md`](localization-ja.md), [`localization-pt-br.md`](localization-pt-br.md),
|
||||
[`localization-ja.md`](localization-ja.md), [`localization-pt-br.md`](localization-pt-br.md), [`localization-es.md`](localization-es.md),
|
||||
[`localization-de.md`](localization-de.md) and [`localization-ru.md`](localization-ru.md).
|
||||
|
||||
## Adding a language
|
||||
|
|
|
|||
|
|
@ -520,8 +520,8 @@ under the UI command that wraps it (a no-op error); the UI command now wins.
|
|||
| LR-BEHAV-EMPTY-STATES | Empty states | P1 | ✅ | `crates/ui-egui/src/panels/mod.rs` (`empty_message`) | |
|
||||
| LR-BEHAV-TOOLTIPS | Tooltips with shortcuts | P0 | ✅ | `crates/ui-egui/src/panels/bottombar.rs` | |
|
||||
| LR-BEHAV-ACCESS | Accessibility | P2 | 🟡 | `crates/ui-egui/src/widgets.rs`, `crates/ui-egui/src/panels/grid.rs` | AccessKit (VoiceOver / Narrator / AT-SPI): sliders announce control and value, buttons / icon buttons / dropdowns / section headers / sources their labels and state, grid thumbnails file name, rating, flag and label; the canvas tools (crop, masks) are pointer-only; not audited with a screen reader |
|
||||
| LR-BEHAV-LOCALE | Language options | P2 | ✅ | `cmd:app.language.english`, `cmd:app.language.simplifiedChinese`, `cmd:app.language.traditionalChinese`, `cmd:app.language.japanese`, `cmd:app.language.portuguese`, `cmd:app.language.german`, `cmd:app.language.russian` | Edit > Language lists every language in the table and the active one is checked; shared with Settings > General (docs/localization.md) |
|
||||
| LR-BEHAV-LOCALIZE | Localisation | P2 | 🟡 | `crates/ui-egui/src/i18n.rs`, `crates/ui-egui/locales/`, `docs/localization.md`, `docs/localization-zh-hans.md`, `docs/localization-zh-hant.md`, `docs/localization-ja.md`, `docs/localization-pt-br.md`, `docs/localization-de.md`, `docs/localization-ru.md` | One table entry per language (code, endonym, ISO 15924 script, catalog): English, Simplified Chinese, Traditional Chinese (Taiwan), Japanese, Brazilian Portuguese, German and Russian UI with a persisted language preference and craft-fonts regular/bold faces per script; menus, edit, crop/masks, settings, import/export and primary progress messages. Adding a language is a table entry plus two catalogs. Stock presets/profiles, history steps, library headings, date headings and capture times are localised (user-named items stay verbatim); the German catalog covers every existing catalog key, command/control label and rule-editor label; the other catalogs fall back to English for messages they lack. Technical errors remain English; release notes are translated in German; Traditional Chinese borrows the Simplified Chinese face (no TC face in craft-fonts yet), and the web build embeds only the Japanese face. |
|
||||
| LR-BEHAV-LOCALE | Language options | P2 | ✅ | `cmd:app.language.english`, `cmd:app.language.simplifiedChinese`, `cmd:app.language.traditionalChinese`, `cmd:app.language.japanese`, `cmd:app.language.portuguese`, `cmd:app.language.spanish`, `cmd:app.language.german`, `cmd:app.language.russian` | Edit > Language lists every language in the table and the active one is checked; shared with Settings > General (docs/localization.md) |
|
||||
| LR-BEHAV-LOCALIZE | Localisation | P2 | 🟡 | `crates/ui-egui/src/i18n.rs`, `crates/ui-egui/locales/`, `docs/localization.md`, `docs/localization-zh-hans.md`, `docs/localization-zh-hant.md`, `docs/localization-ja.md`, `docs/localization-pt-br.md`, `docs/localization-es.md`, `docs/localization-de.md`, `docs/localization-ru.md` | One table entry per language (code, endonym, ISO 15924 script, catalog): English, Simplified Chinese, Traditional Chinese (Taiwan), Japanese, Brazilian Portuguese, Spanish, German and Russian UI with a persisted language preference and craft-fonts regular/bold faces per script; menus, edit, crop/masks, settings, import/export and primary progress messages. Adding a language is a table entry plus two catalogs. Stock presets/profiles, history steps, library headings, date headings and capture times are localised (user-named items stay verbatim); the German catalog covers every existing catalog key, command/control label and rule-editor label; the other catalogs fall back to English for messages they lack. Technical errors remain English; release notes are translated in German; Traditional Chinese borrows the Simplified Chinese face (no TC face in craft-fonts yet), and the web build embeds only the Japanese face. |
|
||||
| LR-BEHAV-LEARN | Tutorials | OOS | 🚫 | | |
|
||||
| LR-BEHAV-WHATSNEW | What's new | P2 | ✅ | `cmd:app.whatsNew`, `docs/whats-new.md` | Help ▸ What's New: release highlights |
|
||||
| LR-BEHAV-AI-EA | Early-access badges | P2 | ⬜ | | |
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
or unchecks a range of photos (issue #338).
|
||||
|
||||
### Languages
|
||||
- The interface is available in German and Russian (Edit ▸ Language), alongside English, Chinese (Simplified and
|
||||
Traditional), Japanese and Brazilian Portuguese.
|
||||
- The interface is available in Spanish (issue #371), German and Russian (Edit ▸ Language), alongside English,
|
||||
Chinese (Simplified and Traditional), Japanese and Brazilian Portuguese.
|
||||
|
||||
### Editing
|
||||
- Type an exact value into any slider (issue #322): click the number next to its name, type (`1.5`, `-20`, `5600`)
|
||||
|
|
|
|||
Loading…
Reference in New Issue