Skip to main content

cranpose_localization/
lib.rs

1#![deny(missing_docs)]
2#![doc = include_str!("../README.md")]
3
4mod catalog;
5mod deferred;
6#[cfg(feature = "formatting")]
7mod format;
8mod locale;
9mod message;
10mod preferences;
11mod thread_state;
12#[cfg(feature = "formatting")]
13pub use format::{FormatError, LocaleFormatters};
14
15fn new_bundle<R: std::borrow::Borrow<fluent_bundle::FluentResource>>(
16    language: unic_langid::LanguageIdentifier,
17) -> fluent_bundle::FluentBundle<R> {
18    let mut bundle = fluent_bundle::FluentBundle::new(vec![language]);
19    bundle
20        .add_builtins()
21        .expect("a fresh bundle has no conflicting functions");
22    bundle
23}
24#[cfg(feature = "tooling")]
25pub mod tooling;
26
27pub use catalog::{Catalog, Language, Resource, Translator};
28pub use deferred::DeferredMessage;
29/// Values accepted by generated message accessors, including borrowed text and numbers.
30pub use fluent_bundle::FluentValue;
31pub use locale::{Locale, PreviewMode};
32pub use message::{Argument, Message, SourceCatalog};
33pub use preferences::{LanguagePreference, LanguagePreferenceStore, Localization};
34
35/// A catalog, locale, or message could not be used.
36#[derive(Debug, thiserror::Error)]
37pub enum LocalizationError {
38    /// A language preference could not be read or saved.
39    #[error("language preference: {0}")]
40    Preference(String),
41    /// The requested language tag is invalid.
42    #[error("invalid language tag `{0}`")]
43    InvalidLocale(String),
44    /// A Fluent resource is malformed or contains duplicate definitions.
45    #[error("invalid catalog {resource}: {detail}")]
46    InvalidResource {
47        /// Locale and namespace of the failing resource.
48        resource: String,
49        /// Parser or validation diagnostics.
50        detail: String,
51    },
52    /// Neither a translation nor the source could be formatted.
53    #[error("cannot format {namespace}/{id}: {detail}")]
54    Format {
55        /// Package owning the message.
56        namespace: String,
57        /// Stable message identifier.
58        id: String,
59        /// Formatter diagnostics.
60        detail: String,
61    },
62}