-- =================================================================== -- 修复翻译数据插入问题的脚本 -- 自动适配现有语言代码,避免 NULL 值错误 -- =================================================================== -- 首先检查现有的语言代码 DO $$ DECLARE rec RECORD; BEGIN RAISE NOTICE '========================================'; RAISE NOTICE '检查现有的语言代码:'; RAISE NOTICE '========================================'; FOR rec IN SELECT code, name FROM public.ak_languages WHERE is_active = true ORDER BY code LOOP RAISE NOTICE '语言代码: % - 名称: %', rec.code, rec.name; END LOOP; RAISE NOTICE '========================================'; END $$; -- 创建一个通用的翻译函数,自动处理语言代码映射 CREATE OR REPLACE FUNCTION get_translation_value( p_language_code VARCHAR(10), p_config_key VARCHAR(100) ) RETURNS TEXT AS $$ DECLARE lang_code TEXT; BEGIN -- 标准化语言代码 lang_code := CASE WHEN p_language_code IN ('zh', 'zh-CN', 'zh_CN') THEN 'zh' WHEN p_language_code IN ('en', 'en-US', 'en_US') THEN 'en' WHEN p_language_code IN ('tw', 'zh-TW', 'zh_TW') THEN 'tw' WHEN p_language_code IN ('ja', 'ja-JP', 'ja_JP') THEN 'ja' ELSE 'zh' -- 默认中文 END; -- 根据配置键和语言返回翻译 RETURN CASE p_config_key -- 公司名称 WHEN 'company_name' THEN CASE lang_code WHEN 'zh' THEN '创新科技有限公司' WHEN 'en' THEN 'Innovation Technology Co., Ltd.' WHEN 'tw' THEN '創新科技有限公司' WHEN 'ja' THEN 'イノベーション技術株式会社' ELSE '创新科技有限公司' END -- 公司标语 WHEN 'company_slogan' THEN CASE lang_code WHEN 'zh' THEN '科技创新,未来可期' WHEN 'en' THEN 'Innovation for the Future' WHEN 'tw' THEN '科技創新,未來可期' WHEN 'ja' THEN '技術革新で未来を創る' ELSE '科技创新,未来可期' END -- 公司地址 WHEN 'company_address' THEN CASE lang_code WHEN 'zh' THEN '上海市浦东新区张江高科技园区创新路88号' WHEN 'en' THEN '88 Innovation Road, Zhangjiang Hi-Tech Park, Pudong New Area, Shanghai' WHEN 'tw' THEN '上海市浦東新區張江高科技園區創新路88號' WHEN 'ja' THEN '上海市浦東新区張江ハイテクパーク イノベーション路88号' ELSE '上海市浦东新区张江高科技园区创新路88号' END -- 热门搜索1 WHEN 'hot_search_1' THEN CASE lang_code WHEN 'zh' THEN '人工智能' WHEN 'en' THEN 'Artificial Intelligence' WHEN 'tw' THEN '人工智慧' WHEN 'ja' THEN '人工知能' ELSE '人工智能' END -- 热门搜索2 WHEN 'hot_search_2' THEN CASE lang_code WHEN 'zh' THEN '大数据分析' WHEN 'en' THEN 'Big Data Analytics' WHEN 'tw' THEN '大數據分析' WHEN 'ja' THEN 'ビッグデータ解析' ELSE '大数据分析' END -- 热门搜索3 WHEN 'hot_search_3' THEN CASE lang_code WHEN 'zh' THEN '物联网' WHEN 'en' THEN 'Internet of Things' WHEN 'tw' THEN '物聯網' WHEN 'ja' THEN 'IoT' ELSE '物联网' END -- 热门搜索4 WHEN 'hot_search_4' THEN CASE lang_code WHEN 'zh' THEN '云计算' WHEN 'en' THEN 'Cloud Computing' WHEN 'tw' THEN '雲端運算' WHEN 'ja' THEN 'クラウドコンピューティング' ELSE '云计算' END -- 热门搜索5 WHEN 'hot_search_5' THEN CASE lang_code WHEN 'zh' THEN '区块链' WHEN 'en' THEN 'Blockchain' WHEN 'tw' THEN '區塊鏈' WHEN 'ja' THEN 'ブロックチェーン' ELSE '区块链' END ELSE NULL END; END; $$ LANGUAGE plpgsql; -- 安全插入翻译数据的函数 CREATE OR REPLACE FUNCTION safe_insert_translations() RETURNS VOID AS $$ DECLARE config_rec RECORD; lang_rec RECORD; translation_value TEXT; BEGIN -- 获取所有需要翻译的配置项 FOR config_rec IN SELECT id, config_key FROM public.ak_global_config WHERE is_translatable = true AND is_active = true LOOP -- 为每种语言插入翻译 FOR lang_rec IN SELECT code FROM public.ak_languages WHERE is_active = true LOOP -- 获取翻译值 translation_value := get_translation_value(lang_rec.code, config_rec.config_key); -- 只有翻译值不为空时才插入 IF translation_value IS NOT NULL THEN INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value) VALUES (config_rec.id, lang_rec.code, translation_value) ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value, updated_at = NOW(); RAISE NOTICE '已插入翻译: % - % = %', config_rec.config_key, lang_rec.code, translation_value; ELSE RAISE NOTICE '跳过翻译: % - % (无对应翻译)', config_rec.config_key, lang_rec.code; END IF; END LOOP; END LOOP; RAISE NOTICE '翻译数据插入完成!'; END; $$ LANGUAGE plpgsql; -- 执行安全插入 SELECT safe_insert_translations(); -- 验证插入结果 DO $$ DECLARE config_count INTEGER; translation_count INTEGER; lang_count INTEGER; BEGIN SELECT COUNT(*) INTO config_count FROM public.ak_global_config WHERE is_translatable = true AND is_active = true; SELECT COUNT(*) INTO translation_count FROM public.ak_global_config_translations WHERE is_active = true; SELECT COUNT(*) INTO lang_count FROM public.ak_languages WHERE is_active = true; RAISE NOTICE '========================================'; RAISE NOTICE '翻译数据验证结果:'; RAISE NOTICE '需要翻译的配置项数量: %', config_count; RAISE NOTICE '活跃语言数量: %', lang_count; RAISE NOTICE '实际翻译记录数量: %', translation_count; RAISE NOTICE '预期翻译记录数量: %', config_count * lang_count; RAISE NOTICE '========================================'; END $$; -- 清理临时函数 DROP FUNCTION IF EXISTS get_translation_value(VARCHAR, VARCHAR); DROP FUNCTION IF EXISTS safe_insert_translations(); -- 完成提示 DO $$ BEGIN RAISE NOTICE '翻译数据修复完成!'; RAISE NOTICE '现在可以安全地查询多语言配置了。'; END $$;