mirror of
https://github.com/an-anime-team/an-anime-game-launcher.git
synced 2024-12-17 23:41:47 +03:00
refactor: remove unsafe in i18n
This commit is contained in:
parent
b7bfda5a85
commit
462ada831c
2 changed files with 14 additions and 14 deletions
26
src/i18n.rs
26
src/i18n.rs
|
@ -1,3 +1,4 @@
|
|||
use std::sync::OnceLock;
|
||||
use unic_langid::{langid, LanguageIdentifier};
|
||||
|
||||
fluent_templates::static_loader! {
|
||||
|
@ -32,14 +33,15 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[
|
|||
langid!("cs-cz")
|
||||
];
|
||||
|
||||
pub static mut LANG: LanguageIdentifier = langid!("en-us");
|
||||
/// Fallback used if the system language is not supported
|
||||
static FALLBACK: LanguageIdentifier = langid!("en-us");
|
||||
|
||||
pub static LANG: OnceLock<LanguageIdentifier> = OnceLock::new();
|
||||
|
||||
/// Set launcher language
|
||||
pub fn set_lang(lang: LanguageIdentifier) -> anyhow::Result<()> {
|
||||
if SUPPORTED_LANGUAGES.iter().any(|item| item.language == lang.language) {
|
||||
unsafe {
|
||||
LANG = lang
|
||||
}
|
||||
LANG.set(lang).expect("Can't overwrite language!");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -50,8 +52,8 @@ pub fn set_lang(lang: LanguageIdentifier) -> anyhow::Result<()> {
|
|||
}
|
||||
|
||||
/// Get launcher language
|
||||
pub fn get_lang() -> LanguageIdentifier {
|
||||
unsafe { LANG.clone() }
|
||||
pub fn get_lang() -> &'static LanguageIdentifier {
|
||||
LANG.get().expect("Language hasn't been initialized!")
|
||||
}
|
||||
|
||||
/// Get system language or default language if system one is not supported
|
||||
|
@ -60,7 +62,7 @@ pub fn get_lang() -> LanguageIdentifier {
|
|||
/// - `LC_ALL`
|
||||
/// - `LC_MESSAGES`
|
||||
/// - `LANG`
|
||||
pub fn get_default_lang() -> LanguageIdentifier {
|
||||
pub fn get_default_lang() -> &'static LanguageIdentifier {
|
||||
let current = std::env::var("LC_ALL")
|
||||
.unwrap_or_else(|_| std::env::var("LC_MESSAGES")
|
||||
.unwrap_or_else(|_| std::env::var("LANG")
|
||||
|
@ -69,11 +71,11 @@ pub fn get_default_lang() -> LanguageIdentifier {
|
|||
|
||||
for lang in SUPPORTED_LANGUAGES {
|
||||
if current.starts_with(lang.language.as_str()) {
|
||||
return lang.clone();
|
||||
return lang;
|
||||
}
|
||||
}
|
||||
|
||||
get_lang()
|
||||
&FALLBACK
|
||||
}
|
||||
|
||||
pub fn format_lang(lang: &LanguageIdentifier) -> String {
|
||||
|
@ -106,8 +108,7 @@ macro_rules! tr {
|
|||
{
|
||||
use fluent_templates::Loader;
|
||||
|
||||
#[allow(unused_unsafe)]
|
||||
$crate::i18n::LOCALES.lookup(unsafe { $crate::i18n::LANG.as_ref() }, $id)
|
||||
$crate::i18n::LOCALES.lookup($crate::i18n::get_lang(), $id)
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -124,8 +125,7 @@ macro_rules! tr {
|
|||
args.insert($key, FluentValue::from($value));
|
||||
)*
|
||||
|
||||
#[allow(unused_unsafe)]
|
||||
$crate::i18n::LOCALES.lookup_complete(unsafe { $crate::i18n::LANG.as_ref() }, $id, Some(&args))
|
||||
$crate::i18n::LOCALES.lookup_complete($crate::i18n::get_lang(), $id, Some(&args))
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ fn main() -> anyhow::Result<()> {
|
|||
// CONFIG is initialized lazily so it will contain following changes as well
|
||||
let mut config = Config::get().expect("Failed to get config");
|
||||
|
||||
config.launcher.language = i18n::format_lang(&i18n::get_default_lang());
|
||||
config.launcher.language = i18n::format_lang(i18n::get_default_lang());
|
||||
|
||||
Config::update_raw(config).expect("Failed to update config");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue