Merge branch 'juliancoffee/new-fluent-abilities' into 'master'

Use fluent attributes for abilities

See merge request veloren/veloren!3549
This commit is contained in:
Imbris 2022-08-20 03:21:16 +00:00
commit 74e8dbf757
8 changed files with 187 additions and 113 deletions

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Possessing Arrow
common-abilities-debug-possess-desc = Shoots a poisonous arrow. Lets you control your target.
common-abilities-sword-spin-name = Whirlwind
common-abilities-sword-spin-desc = Move forward while spinning with your sword.
common-abilities-axe-leap-name = Axe Jump
common-abilities-axe-leap-desc = A jump with the slashing leap to position of cursor.
common-abilities-hammer-leap-name = Smash of Doom
common-abilities-hammer-leap-desc = An AOE attack with knockback. Leaps to position of cursor.
common-abilities-bow-shotgun-name = Burst
common-abilities-bow-shotgun-desc = Launches a burst of arrows
common-abilities-staff-fireshockwave-name = Ring of Fire
common-abilities-staff-fireshockwave-desc = Ignites the ground with fiery shockwave.
common-abilities-sceptre-wardingaura-name = Warding Aura
common-abilities-sceptre-wardingaura-desc = Wards your allies against enemy attacks.
common-abilities-unknown-name = Ability has no title
common-abilities-unknown-desc = Ability has no description
common-abilities-debug-possess = Possessing Arrow
.desc = Shoots a poisonous arrow. Lets you control your target.
common-abilities-sword-spin = Whirlwind
.desc = Move forward while spinning with your sword.
common-abilities-axe-leap = Axe Jump
.desc = A jump with the slashing leap to position of cursor.
common-abilities-hammer-leap = Smash of Doom
.desc = An AOE attack with knockback. Leaps to position of cursor.
common-abilities-bow-shotgun = Burst
.desc = Launches a burst of arrows
common-abilities-staff-fireshockwave = Ring of Fire
.desc = Ignites the ground with fiery shockwave.
common-abilities-sceptre-wardingaura = Warding Aura
.desc = Wards your allies against enemy attacks.

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Strzała Opętania
common-abilities-debug-possess-desc = Pozwala przejąć kontrolę nad twoim celem.
common-abilities-sword-spin-name = Cyklon
common-abilities-sword-spin-desc = Poruszasz się do przodu kręcąc się z Twoim mieczem.
common-abilities-axe-leap-name = Skok Drwala
common-abilities-axe-leap-desc = Skaczesz w kierunku kursora, tnąc swoją siekierą.
common-abilities-hammer-leap-name = Uderzenie Zagłady
common-abilities-hammer-leap-desc = Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem.
common-abilities-bow-shotgun-name = Salwa
common-abilities-bow-shotgun-desc = Wystrzeliwujesz salwę strzał.
common-abilities-staff-fireshockwave-name = Pierścień Ognia
common-abilities-staff-fireshockwave-desc = Przywołujesz ognisty pierścień odrzucający przeciwników.
common-abilities-sceptre-wardingaura-name = Ochronna Aura
common-abilities-sceptre-wardingaura-desc = Chroni twoich sojuszników przed atakami.
common-abilities-unknown-name = Umiejętność bez nazwy
common-abilities-unknown-desc = Umiejętność bez opisu
common-abilities-debug-possess = Strzała Opętania
.desc = Pozwala przejąć kontrolę nad twoim celem.
common-abilities-sword-spin = Cyklon
.desc = Poruszasz się do przodu kręcąc się z Twoim mieczem.
common-abilities-axe-leap = Skok Drwala
.desc = Skaczesz w kierunku kursora, tnąc swoją siekierą.
common-abilities-hammer-leap = Uderzenie Zagłady
.desc = Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem.
common-abilities-bow-shotgun = Salwa
.desc = Wystrzeliwujesz salwę strzał.
common-abilities-staff-fireshockwave = Pierścień Ognia
.desc = Przywołujesz ognisty pierścień odrzucający przeciwników.
common-abilities-sceptre-wardingaura = Ochronna Aura
.desc = Chroni twoich sojuszników przed atakami.

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Flecha Marionete
common-abilities-debug-possess-desc = Atira uma flecha venenosa que deixa você controlar seu alvo.
common-abilities-sword-spin-name = Redemoinho
common-abilities-sword-spin-desc = Movimento frontal girando com sua espada.
common-abilities-axe-leap-name = Machadada Pulante
common-abilities-axe-leap-desc = Um pulo cortante na direção do cursor do mouse.
common-abilities-hammer-leap-name = Golpe da Ruína
common-abilities-hammer-leap-desc = Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse.
common-abilities-bow-shotgun-name = Estrondo
common-abilities-bow-shotgun-desc = Atira uma sequência de flechas
common-abilities-staff-fireshockwave-name = Anel de Fogo
common-abilities-staff-fireshockwave-desc = Incendeia o chão com uma onda de chamas.
common-abilities-sceptre-wardingaura-name = Aura Protetora
common-abilities-sceptre-wardingaura-desc = Protege seus aliados contra ataques inimigos.
common-abilities-unknown-name = Habilidade sem título
common-abilities-unknown-desc = Habilidade sem descrição
common-abilities-debug-possess = Flecha Marionete
.desc = Atira uma flecha venenosa que deixa você controlar seu alvo.
common-abilities-sword-spin = Redemoinho
.desc = Movimento frontal girando com sua espada.
common-abilities-axe-leap = Machadada Pulante
.desc = Um pulo cortante na direção do cursor do mouse.
common-abilities-hammer-leap = Golpe da Ruína
.desc = Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse.
common-abilities-bow-shotgun = Estrondo
.desc = Atira uma sequência de flechas
common-abilities-staff-fireshockwave = Anel de Fogo
.desc = Incendeia o chão com uma onda de chamas.
common-abilities-sceptre-wardingaura = Aura Protetora
.desc = Protege seus aliados contra ataques inimigos.

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Săgeată Manipulatoare
common-abilities-debug-possess-desc = Trage o săgeată otrăvitoare care te lasă să controlezi inamicul.
common-abilities-sword-spin-name = Vârtej de vânt
common-abilities-sword-spin-desc = Mișcă-te înainte în timp ce te rotești cu sabia.
common-abilities-axe-leap-name = Saltul Toporului
common-abilities-axe-leap-desc = Un salt cu mișcare tăioasă la poziția cursorului.
common-abilities-hammer-leap-name = Lovitura Morții
common-abilities-hammer-leap-desc = Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului.
common-abilities-bow-shotgun-name = Burst
common-abilities-bow-shotgun-desc = Trage rapid mai multe sageți
common-abilities-staff-fireshockwave-name = Inel de Foc
common-abilities-staff-fireshockwave-desc = Aprinde pământul cu undă de șoc în flăcări.
common-abilities-sceptre-wardingaura-name = Aură Protectoare
common-abilities-sceptre-wardingaura-desc = Protejează aliații tăi împotriva atacutilor inamicilor
common-abilities-unknown-name = Ablitatea nu are titlu
common-abilities-unknown-desc = Ablitatea nu are descripție
common-abilities-debug-possess = Săgeată Manipulatoare
.desc = Trage o săgeată otrăvitoare care te lasă să controlezi inamicul.
common-abilities-sword-spin = Vârtej de vânt
.desc = Mișcă-te înainte în timp ce te rotești cu sabia.
common-abilities-axe-leap = Saltul Toporului
.desc = Un salt cu mișcare tăioasă la poziția cursorului.
common-abilities-hammer-leap = Lovitura Morții
.desc = Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului.
common-abilities-bow-shotgun = Burst
.desc = Trage rapid mai multe sageți
common-abilities-staff-fireshockwave = Inel de Foc
.desc = Aprinde pământul cu undă de șoc în flăcări.
common-abilities-sceptre-wardingaura = Aură Protectoare
.desc = Protejează aliații tăi împotriva atacutilor inamicilor

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Besittningspil
common-abilities-debug-possess-desc = Skjuter en förgiftad pil. Låter dig kontrollera ditt mål.
common-abilities-sword-spin-name = Virvelvind
common-abilities-sword-spin-desc = Flytta dig framåt medan du snurrar med ditt svärd.
common-abilities-axe-leap-name = Yxhopp
common-abilities-axe-leap-desc = Ett hopp med det skärande språnget riktat mot pekarens position.
common-abilities-hammer-leap-name = Nederslag
common-abilities-hammer-leap-desc = En attack som träffar ett område och knuffar fiender. Hoppar mot pekarens position.
common-abilities-bow-shotgun-name = Pilskur
common-abilities-bow-shotgun-desc = Skjuter iväg en skur av pilar.
common-abilities-staff-fireshockwave-name = Eldens ring
common-abilities-staff-fireshockwave-desc = Tänder eld på marken med en eldig stötvåg.
common-abilities-sceptre-wardingaura-name = Vårdande Aura
common-abilities-sceptre-wardingaura-desc = Skyddar dina allierade mot fiendens attacker.
common-abilities-unknown-name = Förmågan har ingen titel
common-abilities-unknown-desc = Förmågan har ingen beskrivning
common-abilities-debug-possess = Besittningspil
.desc = Skjuter en förgiftad pil. Låter dig kontrollera ditt mål.
common-abilities-sword-spin = Virvelvind
.desc = Flytta dig framåt medan du snurrar med ditt svärd.
common-abilities-axe-leap = Yxhopp
.desc = Ett hopp med det skärande språnget riktat mot pekarens position.
common-abilities-hammer-leap = Nederslag
.desc = En attack som träffar ett område och knuffar fiender. Hoppar mot pekarens position.
common-abilities-bow-shotgun = Pilskur
.desc = Skjuter iväg en skur av pilar.
common-abilities-staff-fireshockwave = Eldens ring
.desc = Tänder eld på marken med en eldig stötvåg.
common-abilities-sceptre-wardingaura = Vårdande Aura
.desc = Skyddar dina allierade mot fiendens attacker.

View File

@ -1,16 +1,14 @@
common-abilities-debug-possess-name = Заклинаюча Стріла
common-abilities-debug-possess-desc = Стріляє отруйною стрілою. Дає тобі контроль над ціллю.
common-abilities-sword-spin-name = Буревій
common-abilities-sword-spin-desc = Рушай вперед кружляючи з мечем.
common-abilities-axe-leap-name = Стрибок Сокири
common-abilities-axe-leap-desc = Стрибок з рубаним ударом, слідує за курсором.
common-abilities-hammer-leap-name = Погром
common-abilities-hammer-leap-desc = Атака по області. Стрибок спрямований за курсором.
common-abilities-bow-shotgun-name = Стріловик
common-abilities-bow-shotgun-desc = Постріл купою стріл за раз.
common-abilities-staff-fireshockwave-name = Кільце Вогню
common-abilities-staff-fireshockwave-desc = Підпалює землю вогненною ударною хвилєю.
common-abilities-sceptre-wardingaura-name = Захисна Аура
common-abilities-sceptre-wardingaura-desc = Укріплює тебе і твоїх спільників силами природи на деякий час.
common-abilities-unknown-name = Неназвана Здатність
common-abilities-unknown-desc = Здатність без опису
common-abilities-debug-possess = Заклинаюча Стріла
.desc = Стріляє отруйною стрілою. Дає тобі контроль над ціллю.
common-abilities-sword-spin = Буревій
.desc = Рушай вперед кружляючи з мечем.
common-abilities-axe-leap = Стрибок Сокири
.desc = Стрибок з рубаним ударом, слідує за курсором.
common-abilities-hammer-leap = Погром
.desc = Атака по області. Стрибок спрямований за курсором.
common-abilities-bow-shotgun = Стріловик
.desc = Постріл купою стріл за раз.
common-abilities-staff-fireshockwave = Кільце Вогню
.desc = Підпалює землю вогненною ударною хвилєю.
common-abilities-sceptre-wardingaura = Захисна Аура
.desc = Укріплює тебе і твоїх спільників силами природи на деякий час.

View File

@ -86,6 +86,26 @@ impl Language {
Some(msg)
}
fn try_attr<'a>(
&'a self,
key: &str,
attr: &str,
args: Option<&'a FluentArgs>,
) -> Option<Cow<'a, str>> {
let bundle = &self.bundle;
let msg = bundle.get_message(key)?;
let attr = msg.get_attribute(attr)?;
let attr = attr.value();
let mut errs = Vec::new();
let msg = bundle.format_pattern(attr, args, &mut errs);
for err in errs {
tracing::error!("err: {err} for {key}");
}
Some(msg)
}
fn try_variation<'a>(
&'a self,
key: &str,
@ -291,6 +311,10 @@ impl LocalizationGuard {
.unwrap_or_else(|| Cow::Owned(key.to_owned()))
}
/// Get a localized text from the variation of given key
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
pub fn try_variation(&self, key: &str, seed: u16) -> Option<Cow<str>> {
self.active.try_variation(key, seed, None).or_else(|| {
self.fallback
@ -299,11 +323,22 @@ impl LocalizationGuard {
})
}
/// Get a localized text from the variation of given key
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
/// If the key is not present in the localization object
/// then the key itself is returned.
pub fn get_variation(&self, key: &str, seed: u16) -> Cow<str> {
self.try_variation(key, seed)
.unwrap_or_else(|| Cow::Owned(key.to_owned()))
}
/// Get a localized text from the variation of given key with given
/// arguments
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
pub fn try_variation_ctx<'a>(
&'a self,
key: &str,
@ -325,11 +360,77 @@ impl LocalizationGuard {
})
}
/// Get a localized text from the variation of given key with given
/// arguments
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
/// If the key is not present in the localization object
/// then the key itself is returned.
pub fn get_variation_ctx<'a>(&'a self, key: &str, seed: u16, args: &'a FluentArgs) -> Cow<str> {
self.try_variation_ctx(key, seed, args)
.unwrap_or_else(|| Cow::Owned(key.to_owned()))
}
/// Get a localized text from the given key by given attribute
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
pub fn try_attr(&self, key: &str, attr: &str) -> Option<Cow<str>> {
self.active.try_attr(key, attr, None).or_else(|| {
self.fallback
.as_ref()
.and_then(|fb| fb.try_attr(key, attr, None))
})
}
/// Get a localized text from the given key by given attribute
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
/// If the key is not present in the localization object
/// then the key itself is returned.
pub fn get_attr(&self, key: &str, attr: &str) -> Cow<str> {
self.try_attr(key, attr)
.unwrap_or_else(|| Cow::Owned(format!("{key}.{attr}")))
}
/// Get a localized text from the given key by given attribute and arguments
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
pub fn try_attr_ctx<'a>(
&'a self,
key: &str,
attr: &str,
args: &'a FluentArgs,
) -> Option<Cow<str>> {
self.active
.try_attr(key, attr, Some(args))
.or_else(|| {
self.fallback
.as_ref()
.and_then(|fb| fb.try_attr(key, attr, Some(args)))
})
.map(|x| {
// NOTE:
// Hack. Remove Unicode Directionality Marks, conrod doesn't support them.
let res = x.replace('\u{2068}', "").replace('\u{2069}', "");
Cow::Owned(res)
})
}
/// Get a localized text from the given key by given attribute and arguments
///
/// First lookup is done in the active language, second in
/// the fallback (if present).
/// If the key is not present in the localization object
/// then the key itself is returned.
pub fn get_attr_ctx<'a>(&'a self, key: &str, attr: &str, args: &'a FluentArgs) -> Cow<str> {
self.try_attr_ctx(key, attr, args)
.unwrap_or_else(|| Cow::Owned(format!("{key}.{attr}")))
}
#[must_use]
pub fn fonts(&self) -> &Fonts { &self.active.fonts }

View File

@ -359,22 +359,7 @@ pub fn ability_description<'a>(
ability_id: &str,
loc: &'a Localization,
) -> (Cow<'a, str>, Cow<'a, str>) {
// TODO: Use fluent attribute mechanic
let (name, desc) = (
format!("{}.name", ability_id).replace('.', "-"),
format!("{}.desc", ability_id).replace('.', "-"),
);
let ability = ability_id.replace('.', "-");
// 1) Try localize ability
// 2) If not, say that ability is unknown
// 3) If unknown key is missed, just return id
// TODO: better algorithm?
(
loc.try_msg(&name)
.or_else(|| loc.try_msg("common-abilities-unknown-name"))
.unwrap_or(Cow::Owned(name)),
loc.try_msg(&desc)
.or_else(|| loc.try_msg("common-abilities-unknown-desc"))
.unwrap_or(Cow::Owned(desc)),
)
(loc.get_msg(&ability), loc.get_attr(&ability, "desc"))
}