#![doc = include_str!("../../docs/api/localization.md")]
use std::rc::Rc;
use dioxus::prelude::*;
pub type TwoNamePhrase = Rc<dyn Fn(&str, &str) -> String>;
#[derive(Clone)]
pub struct DndStrings {
pub picked_up: Rc<dyn Fn(&str) -> String>,
pub over: Rc<dyn Fn(&str) -> String>,
pub over_inside: TwoNamePhrase,
pub no_targets: Rc<dyn Fn() -> String>,
pub no_target_selected: Rc<dyn Fn() -> String>,
pub dropped_in: Rc<dyn Fn(&str) -> String>,
pub cancelled: Rc<dyn Fn() -> String>,
pub item: Rc<dyn Fn() -> String>,
pub zone: Rc<dyn Fn(u64) -> String>,
pub move_up: Rc<dyn Fn(&str) -> String>,
pub move_down: Rc<dyn Fn(&str) -> String>,
pub row: Rc<dyn Fn(usize) -> String>,
pub selection_count: Rc<dyn Fn(usize) -> String>,
}
impl Default for DndStrings {
fn default() -> Self {
Self {
picked_up: Rc::new(|name| {
format!(
"Picked up {name}. Use arrow keys to choose a drop target, \
Enter to drop, Escape to cancel."
)
}),
over: Rc::new(|name| format!("Over {name}.")),
over_inside: Rc::new(|name, parent| format!("Over {name}, inside {parent}.")),
no_targets: Rc::new(|| "No drop targets available.".to_string()),
no_target_selected: Rc::new(|| "No drop target selected.".to_string()),
dropped_in: Rc::new(|name| format!("Dropped in {name}.")),
cancelled: Rc::new(|| "Drag cancelled.".to_string()),
item: Rc::new(|| "item".to_string()),
zone: Rc::new(|n| format!("zone {n}")),
move_up: Rc::new(|name| format!("Move {name} up")),
move_down: Rc::new(|name| format!("Move {name} down")),
row: Rc::new(|n| format!("item {n}")),
selection_count: Rc::new(|n| format!("{n} item(s)")),
}
}
}
impl std::fmt::Debug for DndStrings {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("DndStrings")
}
}
pub fn use_dnd_strings() -> DndStrings {
use_hook(|| try_consume_context::<DndStrings>().unwrap_or_default())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn english_defaults() {
let s = DndStrings::default();
assert_eq!(
(s.picked_up)("Piranesi"),
"Picked up Piranesi. Use arrow keys to choose a drop target, \
Enter to drop, Escape to cancel."
);
assert_eq!((s.over)("Done"), "Over Done.");
assert_eq!((s.over_inside)("Done", "Board"), "Over Done, inside Board.");
assert_eq!((s.no_targets)(), "No drop targets available.");
assert_eq!((s.no_target_selected)(), "No drop target selected.");
assert_eq!((s.dropped_in)("Done"), "Dropped in Done.");
assert_eq!((s.cancelled)(), "Drag cancelled.");
assert_eq!((s.item)(), "item");
assert_eq!((s.zone)(7), "zone 7");
assert_eq!((s.move_up)("Draft"), "Move Draft up");
assert_eq!((s.move_down)("Draft"), "Move Draft down");
assert_eq!((s.row)(3), "item 3");
assert_eq!((s.selection_count)(3), "3 item(s)");
}
}