201 lines
7.2 KiB
PL/PgSQL
201 lines
7.2 KiB
PL/PgSQL
-- ===================================================================
|
||
-- 修复翻译数据插入问题的脚本
|
||
-- 自动适配现有语言代码,避免 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 $$;
|