diff --git a/langs/zh_TW_extra_key.json b/langs/zh_TW_extra_key.json new file mode 100644 index 0000000..f73b892 --- /dev/null +++ b/langs/zh_TW_extra_key.json @@ -0,0 +1,4 @@ +{ + "hello": "哈囉,世界!", + "goodbye": "再見" +} \ No newline at end of file diff --git a/src/key_copy/json_gettext.rs b/src/key_copy/json_gettext.rs index 3d14d25..56683d7 100644 --- a/src/key_copy/json_gettext.rs +++ b/src/key_copy/json_gettext.rs @@ -23,6 +23,7 @@ impl<'a> JSONGetText<'a> { /// Create a new JSONGetText instance with context and a default key. pub(crate) fn from_context_with_default_key( default_key: Key, + ignore_extra_keys: bool, mut context: Context<'a>, ) -> Result, JSONGetTextBuildError> { if !context.contains_key(&default_key) { @@ -36,12 +37,17 @@ impl<'a> JSONGetText<'a> { { for (key, mut map) in context { { - for map_key in map.keys() { - if !default_map.contains_key(map_key) { - return Err(JSONGetTextBuildError::TextInKeyNotInDefaultKey { - key, - text: map_key.clone(), - }); + if ignore_extra_keys { + map = + map.into_iter().filter(|(k, _)| default_map.contains_key(k)).collect(); + } else { + for map_key in map.keys() { + if !default_map.contains_key(map_key) { + return Err(JSONGetTextBuildError::TextInKeyNotInDefaultKey { + key, + text: map_key.clone(), + }); + } } } } diff --git a/src/key_string/json_get_text_builder.rs b/src/key_string/json_get_text_builder.rs index 421f2d6..19bf809 100644 --- a/src/key_string/json_get_text_builder.rs +++ b/src/key_string/json_get_text_builder.rs @@ -142,8 +142,12 @@ impl<'a> JSONGetTextBuilder<'a> { } /// Build a `JSONGetText` instance. - pub fn build(self) -> Result, JSONGetTextBuildError> { - JSONGetText::from_context_with_default_key(self.default_key, self.context) + pub fn build(self, ignore_extra_keys: bool) -> Result, JSONGetTextBuildError> { + JSONGetText::from_context_with_default_key( + self.default_key, + ignore_extra_keys, + self.context, + ) } } diff --git a/src/key_string/json_gettext.rs b/src/key_string/json_gettext.rs index 41f7d61..b4ca087 100644 --- a/src/key_string/json_gettext.rs +++ b/src/key_string/json_gettext.rs @@ -23,6 +23,7 @@ impl<'a> JSONGetText<'a> { /// Create a new JSONGetText instance with context and a default key. pub(crate) fn from_context_with_default_key + Into>( default_key: S, + ignore_extra_keys: bool, mut context: Context<'a>, ) -> Result, JSONGetTextBuildError> { if !context.contains_key(default_key.as_ref()) { @@ -38,25 +39,33 @@ impl<'a> JSONGetText<'a> { { for (key, mut map) in context { { - for map_key in map.keys() { - if !default_map.contains_key(map_key) { - return Err(JSONGetTextBuildError::TextInKeyNotInDefaultKey { - key, - text: map_key.clone(), - }); + if ignore_extra_keys { + map = + map.into_iter().filter(|(k, _)| default_map.contains_key(k)).collect(); + } else { + for map_key in map.keys() { + if !default_map.contains_key(map_key) { + return Err(JSONGetTextBuildError::TextInKeyNotInDefaultKey { + key, + text: map_key.clone(), + }); + } } } - } - { - for map_key in default_map.keys() { - if !map.contains_key(map_key) { - map.insert(map_key.clone(), default_map.get(map_key).unwrap().clone()); + { + for map_key in default_map.keys() { + if !map.contains_key(map_key) { + map.insert( + map_key.clone(), + default_map.get(map_key).unwrap().clone(), + ); + } } } - } - inner_context.insert(key, map); + inner_context.insert(key, map); + } } inner_context.insert(default_key.clone().into(), default_map); diff --git a/src/macros/mod.rs b/src/macros/mod.rs index 8a8a674..b39550c 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -29,7 +29,7 @@ macro_rules! static_json_gettext_build { builder.add_json($key, include_str!($crate::manifest_dir_macros::path!($path))).unwrap(); )* - builder.build() + builder.build(false) } }; } diff --git a/tests/key_string_single.rs b/tests/key_string_single.rs index fbae6a7..e73f238 100644 --- a/tests/key_string_single.rs +++ b/tests/key_string_single.rs @@ -3,6 +3,8 @@ #[macro_use] extern crate json_gettext; +use json_gettext::JSONGetTextBuilder; + #[test] fn single_get() { let ctx = static_json_gettext_build!( @@ -44,3 +46,15 @@ fn map_get() { assert_eq!("哈囉,世界!", map.get("hello").unwrap()); assert_eq!("Rust!", map.get("rust").unwrap()); } + +#[test] +fn extra_keys() { + let mut builder = JSONGetTextBuilder::new("en_US"); + builder.add_json_file("en_US", "langs/en_US.json").unwrap(); + builder.add_json_file("zh_TW", "langs/zh_TW_extra_key.json").unwrap(); + let ctx = builder.build(true).unwrap(); + + let map = ctx.get("zh_TW"); + assert_eq!("哈囉,世界!", map.get("hello").unwrap()); + assert_eq!(None, map.get("goodbye")); +}