package com.ssyf.third.trans.baidu;

import com.cybozu.labs.langdetect.Detector;
import com.cybozu.labs.langdetect.DetectorFactory;
import com.cybozu.labs.langdetect.LangDetectException;

public class LanguageDetector {
    static {
        try {
            // 加载语言模型（需从github下载profiles文件夹，放置在资源目录）  
            DetectorFactory.loadProfile("profiles");
        } catch (LangDetectException e) {
            e.printStackTrace();
        }
    }

    public static String detectLanguage(String text) {
        try {
            Detector detector = DetectorFactory.create();
            detector.append(text);
            return detector.detect();
        } catch (LangDetectException e) {
            return "unknown"; // 无法识别时返回未知
        }
    }

    public static boolean isChineseLanguage(String text) {
        return "zh".equals(detectLanguageForBaidu(text));
    }

    /**
     * 检测语言并映射到百度翻译支持的语言代码
     *
     * @param text 要检测的语言文本
     * @return 百度翻译语言代码
     */
    public static String detectLanguageForBaidu(String text) {
        String detectedLanguage = detectLanguage(text);
        return mapToBaiduLanguageCode(detectedLanguage);
    }

    /**
     * 将语言检测库的语言代码映射到百度翻译的语言代码
     *
     * @param lang 检测到的语言代码
     * @return 百度翻译的语言代码
     */
    private static String mapToBaiduLanguageCode(String lang) {
        if (lang == null || lang.equals("unknown")) {
            return LanguageCode.AUTO.getCode();
        }

        switch (lang) {
            case "zh-cn":
            case "zh":
                return LanguageCode.CHINESE.getCode();
            case "zh-tw":
                return LanguageCode.CHINESE.getCode(); // 百度翻译将繁体和简体中文都视为"zh"
            case "en":
                return LanguageCode.ENGLISH.getCode();
            case "ja":
                return LanguageCode.JAPANESE.getCode();
            case "ko":
                return LanguageCode.KOREAN.getCode();
            case "fr":
                return LanguageCode.FRENCH.getCode();
            case "es":
                return LanguageCode.SPANISH.getCode();
            case "ru":
                return LanguageCode.RUSSIAN.getCode();
            case "de":
                return LanguageCode.GERMAN.getCode();
            case "ar":
                return LanguageCode.ARABIC.getCode();
            case "pt":
                return LanguageCode.PORTUGUESE.getCode();
            case "it":
                return LanguageCode.ITALIAN.getCode();
            case "nl":
                return LanguageCode.DUTCH.getCode();
            case "pl":
                return LanguageCode.POLISH.getCode();
            case "ro":
                return LanguageCode.ROMANIAN.getCode();
            case "sv":
                return LanguageCode.SWEDISH.getCode();
            case "cs":
                return LanguageCode.CZECH.getCode();
            case "el":
                return LanguageCode.GREEK.getCode();
            case "da":
                return LanguageCode.DANISH.getCode();
            case "hu":
                return LanguageCode.HUNGARIAN.getCode();
            case "he":
                return LanguageCode.HEBREW.getCode();
            case "no":
                return LanguageCode.NORWEGIAN.getCode();
            case "vi":
                return LanguageCode.VIETNAMESE.getCode();
            case "th":
                return LanguageCode.THAI.getCode();
            case "tr":
                return LanguageCode.TURKISH.getCode();
            case "uk":
                return LanguageCode.UKRAINIAN.getCode();
            case "fa":
                return LanguageCode.PERSIAN.getCode();
            case "af":
                return "auto"; // 百度翻译不支持南非荷兰语，返回auto
            case "bg":
                return "auto"; // 百度翻译不支持保加利亚语，返回auto
            case "bn":
                return "auto"; // 百度翻译不支持孟加拉语，返回auto
            case "ca":
                return "auto"; // 百度翻译不支持加泰罗尼亚语，返回auto
            case "cy":
                return "auto"; // 百度翻译不支持威尔士语，返回auto
            case "et":
                return "auto"; // 百度翻译不支持爱沙尼亚语，返回auto
            case "fi":
                return "auto"; // 百度翻译不支持芬兰语，返回auto
            case "gu":
                return "auto"; // 百度翻译不支持古吉拉特语，返回auto
            case "hi":
                return "auto"; // 百度翻译不支持印地语，返回auto
            case "hr":
                return "auto"; // 百度翻译不支持克罗地亚语，返回auto
            case "id":
                return "auto"; // 百度翻译不支持印尼语，返回auto
            case "kn":
                return "auto"; // 百度翻译不支持卡纳达语，返回auto
            case "lt":
                return "auto"; // 百度翻译不支持立陶宛语，返回auto
            case "lv":
                return "auto"; // 百度翻译不支持拉脱维亚语，返回auto
            case "mk":
                return "auto"; // 百度翻译不支持马其顿语，返回auto
            case "ml":
                return "auto"; // 百度翻译不支持马拉雅拉姆语，返回auto
            case "mr":
                return "auto"; // 百度翻译不支持马拉地语，返回auto
            case "ne":
                return "auto"; // 百度翻译不支持尼泊尔语，返回auto
            case "pa":
                return "auto"; // 百度翻译不支持旁遮普语，返回auto
            case "sl":
                return "auto"; // 百度翻译不支持斯洛文尼亚语，返回auto
            case "so":
                return "auto"; // 百度翻译不支持索马里语，返回auto
            case "sq":
                return "auto"; // 百度翻译不支持阿尔巴尼亚语，返回auto
            case "sw":
                return "auto"; // 百度翻译不支持斯瓦希里语，返回auto
            case "ta":
                return "auto"; // 百度翻译不支持泰米尔语，返回auto
            case "te":
                return "auto"; // 百度翻译不支持泰卢固语，返回auto
            case "tl":
                return "auto"; // 百度翻译不支持菲律宾语，返回auto
            case "ur":
                return "auto"; // 百度翻译不支持乌尔都语，返回auto
            default:
                return LanguageCode.AUTO.getCode(); // 默认返回自动检测
        }
    }

    public static void main(String[] args) {
        System.out.println("Original detection:");
        System.out.println(detectLanguage("hello world ,this is english")); // 输出 "en"
        System.out.println(detectLanguage("你好，世界"));   // 输出 "zh-cn"
        System.out.println(detectLanguage("こんにちは"));    // 输出 "ja"

        System.out.println("\nMapped to Baidu codes:");
        System.out.println(detectLanguageForBaidu("hello world ,this is english")); // 输出 "en"
        System.out.println(detectLanguageForBaidu("你好，世界"));   // 输出 "zh"
        System.out.println(detectLanguageForBaidu("こんにちは"));    // 输出 "jp"
    }
}
