Files
qingjian/apps/windows/server/tests/engine_loop/menu.rs
T
yenharvey fd5d73edfb feat: 设置程序与候选菜单支持七种界面语言
- 新 crate bamboo-slip-i18n:各 crate 的 locales/*.toml 编译时嵌入,tr 按进程级的界面语言查,缺的文案退到英文再退到中文;各文案表有测试核对废键与参数
- 设置程序、core、platform 里给用户看的文字都进了文案表,简体、繁体、英、日、西、越、德七种齐全;日志与报错类型不翻
- 界面语言放在设置侧栏左下角(文A 加当前语言自己的叫法),看不懂当前界面的人也找得到;配置是 [general] ui_language,缺省简体中文(不少中文用户的系统首选语言是英文),system 跟随系统
- 数字、日期跟着语言写:中日按万 / 亿,其余按 K / M,小数点与千位分隔按语言;统计页的数字卡片放不下时两张一排
- 生词本里的整句译词与原句换行,不再冲出卡片、压住右边的时间

Closes #823
2026-10-29 18:24:57 +08:00

44 lines
1.8 KiB
Rust

//! 候选右键菜单:右键一格给出这格能做的几项,点中一项就做、提示随下一帧下发、下一次按键清。
use qingjian_platform::candidate_menu::CandidateAction;
use crate::support::*;
#[test]
fn right_click_offers_actions_and_a_pick_shows_a_notice_until_next_key() {
bamboo_slip_i18n::pin_locale("zh-Hans");
let mut router = router();
let sink = RecordingCandidates::default();
router.set_candidate_sink(Box::new(sink.clone()));
let (_, _, frame) = type_letters(&mut router, "nihao");
let slot = slot_of(&frame, "你好") as usize - 1;
let _ = router.handle(ClientMessage::PositionCandidates {
session: SESSION,
rect: rect(),
});
router.handle_candidate_mouse(CandidateMouse::Menu {
offset: slot,
point: (10, 10),
});
let menu = sink.3.lock().unwrap().pop().expect("右键应弹出菜单");
assert_eq!(menu.offset, slot);
let labels: Vec<_> = menu.items.iter().map(|(_, label)| *label).collect();
assert!(
labels.contains(&"降权") && labels.contains(&"删除"),
"{labels:?}"
);
// 「你好」是词库词且没学习记录,删不掉,但提示照样给出,组句不变
router.handle_candidate_mouse(CandidateMouse::MenuPick {
offset: slot,
id: CandidateAction::Delete.id(),
});
let shown = sink.0.lock().unwrap().last().cloned().expect("做完要重画");
let notice = shown.notice.expect("做完应带屏幕提示");
assert!(notice.contains("你好"), "{notice}");
let (_, _, after) = press(&mut router, KeyEvent::new(0x10, None, Default::default())); // VK_SHIFT 不动组句
assert_eq!(after.notice, None, "提示应只活到下一次按键");
assert_eq!(preedit(&after), "ni'hao");
}