mintrt 0.1.1

Security-featured runtime for lua.
//! 国际化支持模块 (i10n)
//! 
//! 基于静态字符串的轻量级国际化实现
//! 支持多语言日志和输出翻译

use std::collections::HashMap;
use std::sync::OnceLock;

/// 全局国际化实例
static I18N_INSTANCE: OnceLock<I18n> = OnceLock::new();

/// 国际化实例结构
#[derive(Debug)]
pub struct I18n {
    /// 当前语言
    current_language: String,
    /// 语言包映射
    translations: HashMap<&'static str, HashMap<&'static str, &'static str>>,
}

impl I18n {
    /// 创建新的国际化实例
    pub fn new() -> Self {
        Self {
            current_language: String::new(),
            translations: HashMap::new(),
        }
    }

    /// 设置当前语言
    pub fn set_language(&mut self, lang: &'static str) {
        self.current_language = lang.to_string();
    }

    /// 获取翻译文本
    pub fn translate(&self, key: &'static str) -> &'static str {
        if let Some(lang_map) = self.translations.get(key) {
            if let Some(text) = lang_map.get(self.current_language.as_str()) {
                return text;
            }
        }
        // 如果没有翻译,返回键本身作为默认值
        key
    }

    /// 添加翻译条目
    pub fn add_translation(
        &mut self,
        key: &'static str,
        language: &'static str,
        translation: &'static str,
    ) {
        self.translations
            .entry(key)
            .or_insert_with(HashMap::new)
            .insert(language, translation);
    }
}

/// 初始化国际化系统
/// 
/// 注册所有支持的翻译键和对应文本
pub fn init_i18n() {
    let mut i18n = I18n::new();
    
    // 设置默认语言为中文
    i18n.set_language("zh");
    
    // 添加中文翻译
    i18n.add_translation("runtime_init", "zh", "运行时初始化");
    i18n.add_translation("runtime_init", "en", "Runtime initialized");
    
    i18n.add_translation("security_check", "zh", "安全检查");
    i18n.add_translation("security_check", "en", "Security check");
    
    i18n.add_translation("lua_error", "zh", "Lua 错误");
    i18n.add_translation("lua_error", "en", "Lua error");
    
    i18n.add_translation("config_load", "zh", "配置加载");
    i18n.add_translation("config_load", "en", "Configuration loaded");
    
    i18n.add_translation("task_complete", "zh", "任务完成");
    i18n.add_translation("task_complete", "en", "Task completed");
    
    i18n.add_translation("permission_denied", "zh", "权限拒绝");
    i18n.add_translation("permission_denied", "en", "Permission denied");
    
    i18n.add_translation("bytecode_verify", "zh", "字节码验证");
    i18n.add_translation("bytecode_verify", "en", "Bytecode verification");
    
    i18n.add_translation("env_modify_blocked", "zh", "环境修改被阻止");
    i18n.add_translation("env_modify_blocked", "en", "Environment modification blocked");
    
    i18n.add_translation("external_call_hook", "zh", "外部调用钩子");
    i18n.add_translation("external_call_hook", "en", "External call hook");
    
    i18n.add_translation("log_rate_limit", "zh", "日志速率限制");
    i18n.add_translation("log_rate_limit", "en", "Log rate limit");
    
    i18n.add_translation("promise_resolved", "zh", "Promise 已解析");
    i18n.add_translation("promise_resolved", "en", "Promise resolved");
    
    i18n.add_translation("promise_rejected", "zh", "Promise 已拒绝");
    i18n.add_translation("promise_rejected", "en", "Promise rejected");
    
    i18n.add_translation("module_loaded", "zh", "模块已加载");
    i18n.add_translation("module_loaded", "en", "Module loaded");
    
    I18N_INSTANCE.set(i18n).expect("Failed to initialize i18n");
}

/// 翻译文本(快捷函数)
/// 
/// # 参数
/// * `key` - 翻译键
/// 
/// # 返回
/// 翻译后的文本,如果没有找到翻译则返回键本身
pub fn t(key: &'static str) -> &'static str {
    I18N_INSTANCE
        .get()
        .map(|i| i.translate(key))
        .unwrap_or(key)
}

/// 设置当前语言(快捷函数)
/// 
/// # 参数
/// * `lang` - 语言代码 (如 "zh", "en")
pub fn set_lang(lang: &'static str) {
    // 语言应在初始化时设置,此函数保留用于未来扩展
    log::info!("Language setting: {}", lang);
}

/// 日志宏 - 自动翻译日志消息
#[macro_export]
macro_rules! log_i18n {
    ($level:expr, $key:expr) => {
        log::log!($level, "{}", $crate::i10n::t($key))
    };
    ($level:expr, $key:expr, $($arg:tt)*) => {
        log::log!($level, "{} {}", $crate::i10n::t($key), format!($($arg)*))
    };
}

/// 便捷日志宏
#[macro_export]
macro_rules! info_i18n {
    ($key:expr) => {
        log::info!("{}", $crate::i10n::t($key))
    };
    ($key:expr, $($arg:tt)*) => {
        log::info!("{} {}", $crate::i10n::t($key), format!($($arg)*))
    };
}

#[macro_export]
macro_rules! error_i18n {
    ($key:expr) => {
        log::error!("{}", $crate::i10n::t($key))
    };
    ($key:expr, $($arg:tt)*) => {
        log::error!("{} {}", $crate::i10n::t($key), format!($($arg)*))
    };
}

#[macro_export]
macro_rules! warn_i18n {
    ($key:expr) => {
        log::warn!("{}", $crate::i10n::t($key))
    };
    ($key:expr, $($arg:tt)*) => {
        log::warn!("{} {}", $crate::i10n::t($key), format!($($arg)*))
    };
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_translation() {
        init_i18n();
        assert_eq!(t("runtime_init"), "运行时初始化");
        assert_eq!(t("security_check"), "安全检查");
        assert_eq!(t("nonexistent_key"), "nonexistent_key");
    }
}