diff --git a/.vscode/cSpell.json b/.vscode/cSpell.json index 1d360d99076..e6bee09b0b9 100644 --- a/.vscode/cSpell.json +++ b/.vscode/cSpell.json @@ -28,7 +28,7 @@ "vendor/**", "**/*.svg", "src/uu/*/locales/*.ftl", - "src/uucore/locales/*.ftl", + "src/uucore/locales/**/*.ftl", ".devcontainer/**", "util/gnu-patches/**", "docs/src/release-notes/**", diff --git a/src/uucore/build.rs b/src/uucore/build.rs index 935394cd4cc..15663e3f271 100644 --- a/src/uucore/build.rs +++ b/src/uucore/build.rs @@ -149,6 +149,21 @@ fn embed_single_utility_locale( project_root.join(format!("src/uucore/locales/{locale}.ftl")) })?; + // Conditionally embed SELinux locales when the selinux feature is enabled + #[cfg(feature = "selinux")] + embed_component_locales( + embedded_file, + locales_to_embed, + "uucore/selinux", + |locale| project_root.join(format!("src/uucore/locales/selinux/{locale}.ftl")), + )?; + + // Conditionally embed SMACK locales when the smack feature is enabled + #[cfg(feature = "smack")] + embed_component_locales(embedded_file, locales_to_embed, "uucore/smack", |locale| { + project_root.join(format!("src/uucore/locales/smack/{locale}.ftl")) + })?; + Ok(()) } @@ -199,6 +214,21 @@ fn embed_all_utility_locales( project_root.join(format!("src/uucore/locales/{locale}.ftl")) })?; + // Conditionally embed SELinux locales when the selinux feature is enabled + #[cfg(feature = "selinux")] + embed_component_locales( + embedded_file, + locales_to_embed, + "uucore/selinux", + |locale| project_root.join(format!("src/uucore/locales/selinux/{locale}.ftl")), + )?; + + // Conditionally embed SMACK locales when the smack feature is enabled + #[cfg(feature = "smack")] + embed_component_locales(embedded_file, locales_to_embed, "uucore/smack", |locale| { + project_root.join(format!("src/uucore/locales/smack/{locale}.ftl")) + })?; + embedded_file.flush()?; Ok(()) } @@ -230,6 +260,21 @@ fn embed_static_utility_locales( Path::new(&manifest_dir).join(format!("locales/{locale}.ftl")) })?; + // Conditionally embed SELinux locales when the selinux feature is enabled + #[cfg(feature = "selinux")] + embed_component_locales( + embedded_file, + locales_to_embed, + "uucore/selinux", + |locale| Path::new(&manifest_dir).join(format!("locales/selinux/{locale}.ftl")), + )?; + + // Conditionally embed SMACK locales when the smack feature is enabled + #[cfg(feature = "smack")] + embed_component_locales(embedded_file, locales_to_embed, "uucore/smack", |locale| { + Path::new(&manifest_dir).join(format!("locales/smack/{locale}.ftl")) + })?; + // Collect and sort for deterministic builds let mut entries: Vec<_> = std::fs::read_dir(registry_dir)? .filter_map(Result::ok) diff --git a/src/uucore/locales/en-US.ftl b/src/uucore/locales/en-US.ftl index 36cd9d942a9..5aac7144138 100644 --- a/src/uucore/locales/en-US.ftl +++ b/src/uucore/locales/en-US.ftl @@ -39,19 +39,6 @@ action-creating = creating action-reading = reading action-writing = writing -# SELinux error messages -selinux-error-not-enabled = SELinux is not enabled on this system -selinux-error-file-open-failure = failed to open the file: { $error } -selinux-error-context-retrieval-failure = failed to retrieve the security context: { $error } -selinux-error-context-set-failure = failed to set default file creation context to '{ $context }': { $error } -selinux-error-context-conversion-failure = failed to set default file creation context to '{ $context }': { $error } - -# SMACK error messages -smack-error-not-enabled = SMACK is not enabled on this system -smack-error-label-retrieval-failure = failed to get security context: { $error } -smack-error-label-set-failure = failed to set default file creation context to '{ $context }': { $error } -smack-error-no-label-set = no security context set - # Safe traversal error messages safe-traversal-error-path-contains-null = path contains null byte safe-traversal-error-open-failed = failed to open { $path }: { $source } diff --git a/src/uucore/locales/fr-FR.ftl b/src/uucore/locales/fr-FR.ftl index 9a60c87f21b..82b2b2d2e52 100644 --- a/src/uucore/locales/fr-FR.ftl +++ b/src/uucore/locales/fr-FR.ftl @@ -39,13 +39,6 @@ action-creating = création action-reading = lecture action-writing = écriture -# Messages d'erreur SELinux -selinux-error-not-enabled = SELinux n'est pas activé sur ce système -selinux-error-file-open-failure = échec de l'ouverture du fichier : { $error } -selinux-error-context-retrieval-failure = échec de la récupération du contexte de sécurité : { $error } -selinux-error-context-set-failure = échec de la définition du contexte de création de fichier par défaut à '{ $context }' : { $error } -selinux-error-context-conversion-failure = échec de la définition du contexte de création de fichier par défaut à '{ $context }' : { $error } - # Messages d'erreur de traversée sécurisée safe-traversal-error-path-contains-null = le chemin contient un octet null safe-traversal-error-open-failed = échec de l'ouverture de { $path } : { $source } diff --git a/src/uucore/locales/selinux/en-US.ftl b/src/uucore/locales/selinux/en-US.ftl new file mode 100644 index 00000000000..f89060bec7b --- /dev/null +++ b/src/uucore/locales/selinux/en-US.ftl @@ -0,0 +1,8 @@ +# SELinux error messages +# These strings are only loaded when the selinux feature is enabled + +selinux-error-not-enabled = SELinux is not enabled on this system +selinux-error-file-open-failure = failed to open the file: { $error } +selinux-error-context-retrieval-failure = failed to retrieve the security context: { $error } +selinux-error-context-set-failure = failed to set default file creation context to '{ $context }': { $error } +selinux-error-context-conversion-failure = failed to set default file creation context to '{ $context }': { $error } diff --git a/src/uucore/locales/selinux/fr-FR.ftl b/src/uucore/locales/selinux/fr-FR.ftl new file mode 100644 index 00000000000..6e4e8f65b22 --- /dev/null +++ b/src/uucore/locales/selinux/fr-FR.ftl @@ -0,0 +1,8 @@ +# Messages d'erreur SELinux +# Ces chaînes ne sont chargées que lorsque la fonctionnalité selinux est activée + +selinux-error-not-enabled = SELinux n'est pas activé sur ce système +selinux-error-file-open-failure = échec de l'ouverture du fichier : { $error } +selinux-error-context-retrieval-failure = échec de la récupération du contexte de sécurité : { $error } +selinux-error-context-set-failure = échec de la définition du contexte de création de fichier par défaut à '{ $context }' : { $error } +selinux-error-context-conversion-failure = échec de la définition du contexte de création de fichier par défaut à '{ $context }' : { $error } diff --git a/src/uucore/locales/smack/en-US.ftl b/src/uucore/locales/smack/en-US.ftl new file mode 100644 index 00000000000..41942e2a7bc --- /dev/null +++ b/src/uucore/locales/smack/en-US.ftl @@ -0,0 +1,7 @@ +# SMACK error messages +# These strings are only loaded when the smack feature is enabled + +smack-error-not-enabled = SMACK is not enabled on this system +smack-error-label-retrieval-failure = failed to get security context: { $error } +smack-error-label-set-failure = failed to set default file creation context to '{ $context }': { $error } +smack-error-no-label-set = no security context set diff --git a/src/uucore/locales/smack/fr-FR.ftl b/src/uucore/locales/smack/fr-FR.ftl new file mode 100644 index 00000000000..70e1fcc3666 --- /dev/null +++ b/src/uucore/locales/smack/fr-FR.ftl @@ -0,0 +1,7 @@ +# Messages d'erreur SMACK +# Ces chaines ne sont chargees que lorsque la fonctionnalite smack est activee + +smack-error-not-enabled = SMACK n'est pas active sur ce systeme +smack-error-label-retrieval-failure = echec de la recuperation du contexte de securite : { $error } +smack-error-label-set-failure = echec de la definition du contexte de creation de fichier par defaut a '{ $context }' : { $error } +smack-error-no-label-set = aucun contexte de securite defini diff --git a/src/uucore/src/lib/mods/locale.rs b/src/uucore/src/lib/mods/locale.rs index ec9a78b433c..af82655d64c 100644 --- a/src/uucore/src/lib/mods/locale.rs +++ b/src/uucore/src/lib/mods/locale.rs @@ -153,6 +153,15 @@ fn create_bundle( // Load common strings from uucore locales directory try_add_resource_from(find_uucore_locales_dir(locales_dir)); + + // Conditionally load SELinux locales when the selinux feature is enabled + #[cfg(feature = "selinux")] + try_add_resource_from(find_uucore_locales_dir(locales_dir).map(|p| p.join("selinux"))); + + // Conditionally load SMACK locales when the smack feature is enabled + #[cfg(feature = "smack")] + try_add_resource_from(find_uucore_locales_dir(locales_dir).map(|p| p.join("smack"))); + // Then, try to load utility-specific strings from the utility's locale directory try_add_resource_from(get_locales_dir(util_name).ok()); @@ -245,6 +254,20 @@ fn create_english_bundle_from_embedded( bundle.add_resource_overriding(uucore_resource); } + // Conditionally load SELinux embedded locales when the selinux feature is enabled + #[cfg(feature = "selinux")] + if let Some(selinux_content) = get_embedded_locale("uucore/selinux/en-US.ftl") { + let selinux_resource = parse_fluent_resource(selinux_content)?; + bundle.add_resource_overriding(selinux_resource); + } + + // Conditionally load SMACK embedded locales when the smack feature is enabled + #[cfg(feature = "smack")] + if let Some(smack_content) = get_embedded_locale("uucore/smack/en-US.ftl") { + let smack_resource = parse_fluent_resource(smack_content)?; + bundle.add_resource_overriding(smack_resource); + } + // Then, try to load utility-specific strings let locale_key = format!("{util_name}/en-US.ftl"); if let Some(ftl_content) = get_embedded_locale(&locale_key) {