Skip to content

Commit fa4905b

Browse files
committed
refactor(xcstrings): simplify Localization and StringUnit construction
- Refactored the `Item` implementation to utilize new `From` trait implementations for `Localization`, improving clarity and reducing boilerplate code. - Introduced `new` methods for `StringUnit` and `PluralVariation` to streamline their creation. - Enhanced the `Variations` struct with a new constructor for easier initialization from plural forms. - These changes aim to improve code readability and maintainability in the xcstrings format handling.
1 parent 902b81d commit fa4905b

2 files changed

Lines changed: 54 additions & 26 deletions

File tree

langcodec/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "langcodec"
3-
version = "0.6.2"
3+
version = "0.6.3"
44
edition = "2024"
55
description = "Universal localization file toolkit for Rust. Supports Apple, Android, and CSV formats."
66
license = "MIT"

langcodec/src/formats/xcstrings.rs

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -183,36 +183,20 @@ impl Item {
183183
Translation::Singular(value) => {
184184
localizations.insert(
185185
language,
186-
Localization {
187-
string_unit: Some(StringUnit {
188-
state: entry.status,
189-
value: crate::placeholder::to_ios_placeholders(&value),
190-
}),
191-
variations: None,
192-
},
186+
Localization::from(StringUnit::new(entry.status, &value)),
193187
);
194188
}
195189
Translation::Plural(plural) => {
196-
let mut plural_map = HashMap::new();
197-
for (category, value) in plural.forms {
198-
plural_map.insert(
199-
category,
200-
PluralVariation {
201-
string_unit: Some(StringUnit {
202-
state: entry.status.clone(),
203-
value: crate::placeholder::to_ios_placeholders(&value),
204-
}),
205-
},
206-
);
207-
}
208190
localizations.insert(
209191
language,
210-
Localization {
211-
string_unit: None,
212-
variations: Some(Variations {
213-
plural: Some(plural_map),
214-
}),
215-
},
192+
Localization::from(Variations::new(plural.forms.iter().map(
193+
|(category, value)| {
194+
(
195+
category.clone(),
196+
PluralVariation::new(entry.status.clone(), value),
197+
)
198+
},
199+
))),
216200
);
217201
}
218202
}
@@ -283,6 +267,24 @@ pub struct Localization {
283267
pub variations: Option<Variations>,
284268
}
285269

270+
impl From<StringUnit> for Localization {
271+
fn from(string_unit: StringUnit) -> Self {
272+
Localization {
273+
string_unit: Some(string_unit),
274+
variations: None,
275+
}
276+
}
277+
}
278+
279+
impl From<Variations> for Localization {
280+
fn from(variations: Variations) -> Self {
281+
Localization {
282+
string_unit: None,
283+
variations: Some(variations),
284+
}
285+
}
286+
}
287+
286288
impl Localization {
287289
fn to_translation(&self) -> Option<Translation> {
288290
match (self.string_unit.as_ref(), self.variations.as_ref()) {
@@ -318,12 +320,30 @@ pub struct StringUnit {
318320
pub value: String,
319321
}
320322

323+
impl StringUnit {
324+
pub fn new(state: EntryStatus, value: &str) -> Self {
325+
Self {
326+
state,
327+
value: crate::placeholder::to_ios_placeholders(value).replace("\\n", "\n"),
328+
}
329+
}
330+
}
331+
321332
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
322333
pub struct Variations {
323334
#[serde(skip_serializing_if = "Option::is_none")]
324335
pub plural: Option<HashMap<PluralCategory, PluralVariation>>,
325336
}
326337

338+
impl Variations {
339+
pub fn new(plural: impl Iterator<Item = (PluralCategory, PluralVariation)>) -> Self {
340+
let plural = plural.collect();
341+
Self {
342+
plural: Some(plural),
343+
}
344+
}
345+
}
346+
327347
impl Variations {
328348
fn to_translation(&self) -> Option<Translation> {
329349
self.plural.as_ref().and_then(|plural_map| {
@@ -345,6 +365,14 @@ pub struct PluralVariation {
345365
pub string_unit: Option<StringUnit>,
346366
}
347367

368+
impl PluralVariation {
369+
pub fn new(state: EntryStatus, value: &str) -> Self {
370+
Self {
371+
string_unit: Some(StringUnit::new(state, value)),
372+
}
373+
}
374+
}
375+
348376
#[cfg(test)]
349377
mod tests {
350378
use super::*;

0 commit comments

Comments
 (0)