Files
akmon/fix_translation_nulls.sql
2026-01-20 08:04:15 +08:00

201 lines
7.2 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ===================================================================
-- 修复翻译数据插入问题的脚本
-- 自动适配现有语言代码,避免 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 $$;