File indexing completed on 2025-12-07 04:08:38

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2018-02-22
0007  * Description : A text translator using web-services - Conversion tables.
0008  *
0009  * SPDX-FileCopyrightText: 2018-2022 by Hennadii Chernyshchyk <genaloner at gmail dot com>
0010  * SPDX-FileCopyrightText: 2021-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "donlinetranslator_p.h"
0017 
0018 namespace Digikam
0019 {
0020 
0021 QString DOnlineTranslator::fromRFC3066(Engine engine, const QString& langCodeRFC3066)
0022 {
0023     QString lg;
0024 
0025     switch (engine)
0026     {
0027         case Google:
0028         case LibreTranslate:
0029         {
0030             lg = DOnlineTranslator::Private::s_rfc3066LanguageCodesGoogle[langCodeRFC3066];
0031             break;
0032         }
0033 
0034         case Yandex:
0035         {
0036             lg = DOnlineTranslator::Private::s_rfc3066LanguageCodesYandex[langCodeRFC3066];
0037             break;
0038         }
0039 
0040         case Bing:
0041         {
0042             lg = DOnlineTranslator::Private::s_rfc3066LanguageCodesBing[langCodeRFC3066];
0043             break;
0044         }
0045 
0046         case Lingva:
0047         {
0048             lg = DOnlineTranslator::Private::s_rfc3066LanguageCodesLingva[langCodeRFC3066];
0049             break;
0050         }
0051     }
0052 
0053     if (lg.isEmpty())
0054     {
0055         lg = DOnlineTranslator::Private::s_rfc3066LanguageCodesGeneric[langCodeRFC3066];
0056     }
0057 
0058     return lg;
0059 }
0060 
0061 QStringList DOnlineTranslator::supportedRFC3066(Engine engine)
0062 {
0063     QStringList lst = DOnlineTranslator::Private::s_rfc3066LanguageCodesGeneric.keys();
0064 
0065     switch (engine)
0066     {
0067         case Google:
0068         case LibreTranslate:
0069         {
0070             lst << DOnlineTranslator::Private::s_rfc3066LanguageCodesGoogle.keys();
0071             break;
0072         }
0073 
0074         case Yandex:
0075         {
0076             lst << DOnlineTranslator::Private::s_rfc3066LanguageCodesYandex.keys();
0077             break;
0078         }
0079 
0080         case Bing:
0081         {
0082             lst << DOnlineTranslator::Private::s_rfc3066LanguageCodesBing.keys();
0083             break;
0084         }
0085 
0086         case Lingva:
0087         {
0088             lst << DOnlineTranslator::Private::s_rfc3066LanguageCodesLingva.keys();
0089             break;
0090         }
0091     }
0092 
0093     lst.removeDuplicates();
0094 
0095     return lst;
0096 }
0097 
0098 QString DOnlineTranslator::languageName(Language lang)
0099 {
0100     switch (lang)
0101     {
0102         case Auto:
0103             return i18nc("@info: language name", "Automatically detect");
0104 
0105         case Afrikaans:
0106             return i18nc("@info: language name", "Afrikaans");
0107 
0108         case Albanian:
0109             return i18nc("@info: language name", "Albanian");
0110 
0111         case Amharic:
0112             return i18nc("@info: language name", "Amharic");
0113 
0114         case Arabic:
0115             return i18nc("@info: language name", "Arabic");
0116 
0117         case Armenian:
0118             return i18nc("@info: language name", "Armenian");
0119 
0120         case Azerbaijani:
0121             return i18nc("@info: language name", "Azeerbaijani");
0122 
0123         case Basque:
0124             return i18nc("@info: language name", "Basque");
0125 
0126         case Bashkir:
0127             return i18nc("@info: language name", "Bashkir");
0128 
0129         case Belarusian:
0130             return i18nc("@info: language name", "Belarusian");
0131 
0132         case Bengali:
0133             return i18nc("@info: language name", "Bengali");
0134 
0135         case Bosnian:
0136             return i18nc("@info: language name", "Bosnian");
0137 
0138         case Bulgarian:
0139             return i18nc("@info: language name", "Bulgarian");
0140 
0141         case Catalan:
0142             return i18nc("@info: language name", "Catalan");
0143 
0144         case Cantonese:
0145             return i18nc("@info: language name", "Cantonese");
0146 
0147         case Cebuano:
0148             return i18nc("@info: language name", "Cebuano");
0149 
0150         case SimplifiedChinese:
0151             return i18nc("@info: language name", "Chinese (Simplified)");
0152 
0153         case TraditionalChinese:
0154             return i18nc("@info: language name", "Chinese (Traditional)");
0155 
0156         case Corsican:
0157             return i18nc("@info: language name", "Corsican");
0158 
0159         case Croatian:
0160             return i18nc("@info: language name", "Croatian");
0161 
0162         case Czech:
0163             return i18nc("@info: language name", "Czech");
0164 
0165         case Danish:
0166             return i18nc("@info: language name", "Danish");
0167 
0168         case Dutch:
0169             return i18nc("@info: language name", "Dutch");
0170 
0171         case English:
0172             return i18nc("@info: language name", "English");
0173 
0174         case Esperanto:
0175             return i18nc("@info: language name", "Esperanto");
0176 
0177         case Estonian:
0178             return i18nc("@info: language name", "Estonian");
0179 
0180         case Fijian:
0181             return i18nc("@info: language name", "Fijian");
0182 
0183         case Filipino:
0184             return i18nc("@info: language name", "Filipino");
0185 
0186         case Finnish:
0187             return i18nc("@info: language name", "Finnish");
0188 
0189         case French:
0190             return i18nc("@info: language name", "French");
0191 
0192         case Frisian:
0193             return i18nc("@info: language name", "Frisian");
0194 
0195         case Galician:
0196             return i18nc("@info: language name", "Galician");
0197 
0198         case Georgian:
0199             return i18nc("@info: language name", "Georgian");
0200 
0201         case German:
0202             return i18nc("@info: language name", "German");
0203 
0204         case Greek:
0205             return i18nc("@info: language name", "Greek");
0206 
0207         case Gujarati:
0208             return i18nc("@info: language name", "Gujarati");
0209 
0210         case HaitianCreole:
0211             return i18nc("@info: language name", "Haitian Creole");
0212 
0213         case Hausa:
0214             return i18nc("@info: language name", "Hausa");
0215 
0216         case Hawaiian:
0217             return i18nc("@info: language name", "Hawaiian");
0218 
0219         case Hebrew:
0220             return i18nc("@info: language name", "Hebrew");
0221 
0222         case HillMari:
0223             return i18nc("@info: language name", "Hill Mari");
0224 
0225         case Hindi:
0226             return i18nc("@info: language name", "Hindi");
0227 
0228         case Hmong:
0229             return i18nc("@info: language name", "Hmong");
0230 
0231         case Hungarian:
0232             return i18nc("@info: language name", "Hungarian");
0233 
0234         case Icelandic:
0235             return i18nc("@info: language name", "Icelandic");
0236 
0237         case Igbo:
0238             return i18nc("@info: language name", "Igbo");
0239 
0240         case Indonesian:
0241             return i18nc("@info: language name", "Indonesian");
0242 
0243         case Irish:
0244             return i18nc("@info: language name", "Irish");
0245 
0246         case Italian:
0247             return i18nc("@info: language name", "Italian");
0248 
0249         case Japanese:
0250             return i18nc("@info: language name", "Japanese");
0251 
0252         case Javanese:
0253             return i18nc("@info: language name", "Javanese");
0254 
0255         case Kannada:
0256             return i18nc("@info: language name", "Kannada");
0257 
0258         case Kazakh:
0259             return i18nc("@info: language name", "Kazakh");
0260 
0261         case Khmer:
0262             return i18nc("@info: language name", "Khmer");
0263 
0264         case Kinyarwanda:
0265             return i18nc("@info: language name", "Kinyarwanda");
0266 
0267         case Klingon:
0268             return i18nc("@info: language name", "Klingon");
0269 
0270         case KlingonPlqaD:
0271             return i18nc("@info: language name", "Klingon (PlqaD)");
0272 
0273         case Korean:
0274             return i18nc("@info: language name", "Korean");
0275 
0276         case Kurdish:
0277             return i18nc("@info: language name", "Kurdish");
0278 
0279         case Kyrgyz:
0280             return i18nc("@info: language name", "Kyrgyz");
0281 
0282         case Lao:
0283             return i18nc("@info: language name", "Lao");
0284 
0285         case Latin:
0286             return i18nc("@info: language name", "Latin");
0287 
0288         case Latvian:
0289             return i18nc("@info: language name", "Latvian");
0290 
0291         case LevantineArabic:
0292             return i18nc("@info: language name", "Levantine Arabic");
0293 
0294         case Lithuanian:
0295             return i18nc("@info: language name", "Lithuanian");
0296 
0297         case Luxembourgish:
0298             return i18nc("@info: language name", "Luxembourgish");
0299 
0300         case Macedonian:
0301             return i18nc("@info: language name", "Macedonian");
0302 
0303         case Malagasy:
0304             return i18nc("@info: language name", "Malagasy");
0305 
0306         case Malay:
0307             return i18nc("@info: language name", "Malay");
0308 
0309         case Malayalam:
0310             return i18nc("@info: language name", "Malayalam");
0311 
0312         case Maltese:
0313             return i18nc("@info: language name", "Maltese");
0314 
0315         case Maori:
0316             return i18nc("@info: language name", "Maori");
0317 
0318         case Marathi:
0319             return i18nc("@info: language name", "Marathi");
0320 
0321         case Mari:
0322             return i18nc("@info: language name", "Mari");
0323 
0324         case Mongolian:
0325             return i18nc("@info: language name", "Mongolian");
0326 
0327         case Myanmar:
0328             return i18nc("@info: language name", "Myanmar");
0329 
0330         case Nepali:
0331             return i18nc("@info: language name", "Nepali");
0332 
0333         case Norwegian:
0334             return i18nc("@info: language name", "Norwegian");
0335 
0336         case Oriya:
0337             return i18nc("@info: language name", "Oriya");
0338 
0339         case Chichewa:
0340             return i18nc("@info: language name", "Chichewa");
0341 
0342         case Papiamento:
0343             return i18nc("@info: language name", "Papiamento");
0344 
0345         case Pashto:
0346             return i18nc("@info: language name", "Pashto");
0347 
0348         case Persian:
0349             return i18nc("@info: language name", "Persian");
0350 
0351         case Polish:
0352             return i18nc("@info: language name", "Polish");
0353 
0354         case Portuguese:
0355             return i18nc("@info: language name", "Portuguese");
0356 
0357         case Punjabi:
0358             return i18nc("@info: language name", "Punjabi");
0359 
0360         case QueretaroOtomi:
0361             return i18nc("@info: language name", "Queretaro Otomi");
0362 
0363         case Romanian:
0364             return i18nc("@info: language name", "Romanian");
0365 
0366         case Russian:
0367             return i18nc("@info: language name", "Russian");
0368 
0369         case Samoan:
0370             return i18nc("@info: language name", "Samoan");
0371 
0372         case ScotsGaelic:
0373             return i18nc("@info: language name", "Scots Gaelic");
0374 
0375         case SerbianCyrillic:
0376             return i18nc("@info: language name", "Serbian (Cyrillic)");
0377 
0378         case SerbianLatin:
0379             return i18nc("@info: language name", "Serbian (Latin)");
0380 
0381         case Sesotho:
0382             return i18nc("@info: language name", "Sesotho");
0383 
0384         case Shona:
0385             return i18nc("@info: language name", "Shona");
0386 
0387         case Sindhi:
0388             return i18nc("@info: language name", "Sindhi");
0389 
0390         case Sinhala:
0391             return i18nc("@info: language name", "Sinhala");
0392 
0393         case Slovak:
0394             return i18nc("@info: language name", "Slovak");
0395 
0396         case Slovenian:
0397             return i18nc("@info: language name", "Slovenian");
0398 
0399         case Somali:
0400             return i18nc("@info: language name", "Somali");
0401 
0402         case Spanish:
0403             return i18nc("@info: language name", "Spanish");
0404 
0405         case Sundanese:
0406             return i18nc("@info: language name", "Sundanese");
0407 
0408         case Swahili:
0409             return i18nc("@info: language name", "Swahili");
0410 
0411         case Swedish:
0412             return i18nc("@info: language name", "Swedish");
0413 
0414         case Tagalog:
0415             return i18nc("@info: language name", "Tagalog");
0416 
0417         case Tahitian:
0418             return i18nc("@info: language name", "Tahitian");
0419 
0420         case Tajik:
0421             return i18nc("@info: language name", "Tajik");
0422 
0423         case Tamil:
0424             return i18nc("@info: language name", "Tamil");
0425 
0426         case Tatar:
0427             return i18nc("@info: language name", "Tatar");
0428 
0429         case Telugu:
0430             return i18nc("@info: language name", "Telugu");
0431 
0432         case Thai:
0433             return i18nc("@info: language name", "Thai");
0434 
0435         case Tongan:
0436             return i18nc("@info: language name", "Tongan");
0437 
0438         case Turkish:
0439             return i18nc("@info: language name", "Turkish");
0440 
0441         case Turkmen:
0442             return i18nc("@info: language name", "Turkmen");
0443 
0444         case Udmurt:
0445             return i18nc("@info: language name", "Udmurt");
0446 
0447         case Uighur:
0448             return i18nc("@info: language name", "Uighur");
0449 
0450         case Ukrainian:
0451             return i18nc("@info: language name", "Ukrainian");
0452 
0453         case Urdu:
0454             return i18nc("@info: language name", "Urdu");
0455 
0456         case Uzbek:
0457             return i18nc("@info: language name", "Uzbek");
0458 
0459         case Vietnamese:
0460             return i18nc("@info: language name", "Vietnamese");
0461 
0462         case Welsh:
0463             return i18nc("@info: language name", "Welsh");
0464 
0465         case Xhosa:
0466             return i18nc("@info: language name", "Xhosa");
0467 
0468         case Yiddish:
0469             return i18nc("@info: language name", "Yiddish");
0470 
0471         case Yoruba:
0472             return i18nc("@info: language name", "Yoruba");
0473 
0474         case YucatecMaya:
0475             return i18nc("@info: language name", "Yucatec Maya");
0476 
0477         case Zulu:
0478             return i18nc("@info: language name", "Zulu");
0479 
0480         default:
0481             return QString();
0482     }
0483 }
0484 
0485 DOnlineTranslator::Language DOnlineTranslator::language(const QLocale& locale)
0486 {
0487     switch (locale.language())
0488     {
0489         case QLocale::Afrikaans:
0490             return Afrikaans;
0491 
0492         case QLocale::Albanian:
0493             return Albanian;
0494 
0495         case QLocale::Amharic:
0496             return Amharic;
0497 
0498         case QLocale::Arabic:
0499             return Arabic;
0500 
0501         case QLocale::Armenian:
0502             return Armenian;
0503 
0504         case QLocale::Azerbaijani:
0505             return Azerbaijani;
0506 
0507         case QLocale::Basque:
0508             return Basque;
0509 
0510         case QLocale::Belarusian:
0511             return Belarusian;
0512 
0513         case QLocale::Bengali:
0514             return Bengali;
0515 
0516         case QLocale::Bosnian:
0517             return Bosnian;
0518 
0519         case QLocale::Bulgarian:
0520             return Bulgarian;
0521 
0522         case QLocale::Catalan:
0523             return Catalan;
0524 
0525         case QLocale::Chinese:
0526             return SimplifiedChinese;
0527 
0528         case QLocale::LiteraryChinese:
0529             return TraditionalChinese;
0530 
0531         case QLocale::Corsican:
0532             return Corsican;
0533 
0534         case QLocale::Croatian:
0535             return Croatian;
0536 
0537         case QLocale::Czech:
0538             return Czech;
0539 
0540         case QLocale::Danish:
0541             return Danish;
0542 
0543         case QLocale::Dutch:
0544             return Dutch;
0545 
0546         case QLocale::Esperanto:
0547             return Esperanto;
0548 
0549         case QLocale::Estonian:
0550             return Estonian;
0551 
0552         case QLocale::Finnish:
0553             return Finnish;
0554 
0555         case QLocale::French:
0556             return French;
0557 
0558         case QLocale::Frisian:
0559             return Frisian;
0560 
0561         case QLocale::Galician:
0562             return Galician;
0563 
0564         case QLocale::Georgian:
0565             return Georgian;
0566 
0567         case QLocale::German:
0568             return German;
0569 
0570         case QLocale::Greek:
0571             return Greek;
0572 
0573         case QLocale::Gujarati:
0574             return Gujarati;
0575 
0576         case QLocale::Haitian:
0577             return HaitianCreole;
0578 
0579         case QLocale::Hausa:
0580             return Hausa;
0581 
0582         case QLocale::Hawaiian:
0583             return Hawaiian;
0584 
0585         case QLocale::Hebrew:
0586             return Hebrew;
0587 
0588         case QLocale::Hindi:
0589             return Hindi;
0590 
0591         case QLocale::Hungarian:
0592             return Hungarian;
0593 
0594         case QLocale::Icelandic:
0595             return Icelandic;
0596 
0597         case QLocale::Igbo:
0598             return Igbo;
0599 
0600         case QLocale::Indonesian:
0601             return Indonesian;
0602 
0603         case QLocale::Irish:
0604             return Irish;
0605 
0606         case QLocale::Italian:
0607             return Italian;
0608 
0609         case QLocale::Japanese:
0610             return Japanese;
0611 
0612         case QLocale::Javanese:
0613             return Javanese;
0614 
0615         case QLocale::Kannada:
0616             return Kannada;
0617 
0618         case QLocale::Kazakh:
0619             return Kazakh;
0620 
0621         case QLocale::Khmer:
0622             return Khmer;
0623 
0624         case QLocale::Kinyarwanda:
0625             return Kinyarwanda;
0626 
0627         case QLocale::Korean:
0628             return Korean;
0629 
0630         case QLocale::Kurdish:
0631             return Kurdish;
0632 
0633         case QLocale::Lao:
0634             return Lao;
0635 
0636         case QLocale::Latin:
0637             return Latin;
0638 
0639         case QLocale::Latvian:
0640             return Latvian;
0641 
0642         case QLocale::Lithuanian:
0643             return Lithuanian;
0644 
0645         case QLocale::Luxembourgish:
0646             return Luxembourgish;
0647 
0648         case QLocale::Macedonian:
0649             return Macedonian;
0650 
0651         case QLocale::Malagasy:
0652             return Malagasy;
0653 
0654         case QLocale::Malay:
0655             return Malay;
0656 
0657         case QLocale::Malayalam:
0658             return Malayalam;
0659 
0660         case QLocale::Maltese:
0661             return Maltese;
0662 
0663         case QLocale::Maori:
0664             return Maori;
0665 
0666         case QLocale::Marathi:
0667             return Marathi;
0668 
0669         case QLocale::Mongolian:
0670             return Mongolian;
0671 
0672         case QLocale::Nepali:
0673             return Nepali;
0674 
0675         case QLocale::NorwegianBokmal:
0676             return Norwegian;
0677 
0678         case QLocale::Oriya:
0679             return Oriya;
0680 
0681         case QLocale::Pashto:
0682             return Pashto;
0683 
0684         case QLocale::Persian:
0685             return Persian;
0686 
0687         case QLocale::Polish:
0688             return Polish;
0689 
0690         case QLocale::Portuguese:
0691             return Portuguese;
0692 
0693         case QLocale::Punjabi:
0694             return Punjabi;
0695 
0696         case QLocale::Romanian:
0697             return Romanian;
0698 
0699         case QLocale::Russian:
0700             return Russian;
0701 
0702         case QLocale::Samoan:
0703             return Samoan;
0704 
0705         case QLocale::Gaelic:
0706             return ScotsGaelic;
0707 
0708         case QLocale::Serbian:
0709             return SerbianCyrillic;
0710 
0711         case QLocale::Shona:
0712             return Shona;
0713 
0714         case QLocale::Sindhi:
0715             return Sindhi;
0716 
0717         case QLocale::Sinhala:
0718             return Sinhala;
0719 
0720         case QLocale::Slovak:
0721             return Slovak;
0722 
0723         case QLocale::Slovenian:
0724             return Slovenian;
0725 
0726         case QLocale::Somali:
0727             return Somali;
0728 
0729         case QLocale::Spanish:
0730             return Spanish;
0731 
0732         case QLocale::Sundanese:
0733             return Sundanese;
0734 
0735         case QLocale::Swahili:
0736             return Swahili;
0737 
0738         case QLocale::Swedish:
0739             return Swedish;
0740 
0741         case QLocale::Filipino:
0742             return Filipino;
0743 
0744         case QLocale::Tajik:
0745             return Tajik;
0746 
0747         case QLocale::Tamil:
0748             return Tamil;
0749 
0750         case QLocale::Tatar:
0751             return Tatar;
0752 
0753         case QLocale::Telugu:
0754             return Telugu;
0755 
0756         case QLocale::Thai:
0757             return Thai;
0758 
0759         case QLocale::Turkish:
0760             return Turkish;
0761 
0762         case QLocale::Turkmen:
0763             return Turkmen;
0764 
0765         case QLocale::Uighur:
0766             return Uighur;
0767 
0768         case QLocale::Ukrainian:
0769             return Ukrainian;
0770 
0771         case QLocale::Urdu:
0772             return Urdu;
0773 
0774         case QLocale::Uzbek:
0775             return Uzbek;
0776 
0777         case QLocale::Vietnamese:
0778             return Vietnamese;
0779 
0780         case QLocale::Welsh:
0781             return Welsh;
0782 
0783         case QLocale::Xhosa:
0784             return Xhosa;
0785 
0786         case QLocale::Yiddish:
0787             return Yiddish;
0788 
0789         case QLocale::Yoruba:
0790             return Yoruba;
0791 
0792         case QLocale::Zulu:
0793             return Zulu;
0794 
0795         default:
0796             return English;
0797     }
0798 }
0799 
0800 bool DOnlineTranslator::isSupportTranslation(Engine engine, Language lang)
0801 {
0802     bool isSupported = false;
0803 
0804     switch (engine)
0805     {
0806         case Google:
0807         case Lingva: // Lingva is a frontend to Google Translate
0808 
0809             switch (lang)
0810             {
0811                 case NoLanguage:
0812                 case Bashkir:
0813                 case Cantonese:
0814                 case Fijian:
0815                 case Filipino:
0816                 case Georgian:
0817                 case HillMari:
0818                 case Klingon:
0819                 case KlingonPlqaD:
0820                 case LevantineArabic:
0821                 case Mari:
0822                 case Papiamento:
0823                 case QueretaroOtomi:
0824                 case SerbianLatin:
0825                 case Tahitian:
0826                 case Tongan:
0827                 case Udmurt:
0828                 case YucatecMaya:
0829                     isSupported = false;
0830                     break;
0831 
0832                 default:
0833                     isSupported = true;
0834                     break;
0835             }
0836 
0837             break;
0838 
0839         case Yandex:
0840 
0841             switch (lang)
0842             {
0843                 case NoLanguage:
0844                 case Cantonese:
0845                 case Chichewa:
0846                 case Corsican:
0847                 case Fijian:
0848                 case Filipino:
0849                 case Frisian:
0850                 case Hausa:
0851                 case Hawaiian:
0852                 case Igbo:
0853                 case Kinyarwanda:
0854                 case Klingon:
0855                 case KlingonPlqaD:
0856                 case Kurdish:
0857                 case LevantineArabic:
0858                 case Oriya:
0859                 case Pashto:
0860                 case QueretaroOtomi:
0861                 case Samoan:
0862                 case SerbianLatin:
0863                 case Sesotho:
0864                 case Shona:
0865                 case Sindhi:
0866                 case Somali:
0867                 case Tahitian:
0868                 case Tongan:
0869                 case Turkmen:
0870                 case Uighur:
0871                 case Yoruba:
0872                 case YucatecMaya:
0873                 case Zulu:
0874                     isSupported = false;
0875                     break;
0876 
0877                 default:
0878                     isSupported = true;
0879                     break;
0880                 }
0881 
0882                 break;
0883 
0884         case Bing:
0885 
0886             switch (lang)
0887             {
0888                 case NoLanguage:
0889                 case Albanian:
0890                 case Amharic:
0891                 case Armenian:
0892                 case Azerbaijani:
0893                 case Basque:
0894                 case Bashkir:
0895                 case Belarusian:
0896                 case Cebuano:
0897                 case Corsican:
0898                 case Esperanto:
0899                 case Frisian:
0900                 case Galician:
0901                 case Georgian:
0902                 case Gujarati:
0903                 case Hausa:
0904                 case Hawaiian:
0905                 case HillMari:
0906                 case Igbo:
0907                 case Irish:
0908                 case Javanese:
0909                 case Kannada:
0910                 case Kazakh:
0911                 case Khmer:
0912                 case Kinyarwanda:
0913                 case Kurdish:
0914                 case Kyrgyz:
0915                 case Lao:
0916                 case Latin:
0917                 case Luxembourgish:
0918                 case Macedonian:
0919                 case Malayalam:
0920                 case Maori:
0921                 case Marathi:
0922                 case Mari:
0923                 case Mongolian:
0924                 case Myanmar:
0925                 case Nepali:
0926                 case Oriya:
0927                 case Chichewa:
0928                 case Papiamento:
0929                 case Pashto:
0930                 case Punjabi:
0931                 case ScotsGaelic:
0932                 case Sesotho:
0933                 case Shona:
0934                 case Sindhi:
0935                 case Sinhala:
0936                 case Somali:
0937                 case Sundanese:
0938                 case Tagalog:
0939                 case Tajik:
0940                 case Tatar:
0941                 case Turkmen:
0942                 case Uighur:
0943                 case Udmurt:
0944                 case Uzbek:
0945                 case Xhosa:
0946                 case Yiddish:
0947                 case Yoruba:
0948                 case Zulu:
0949                     isSupported = false;
0950                     break;
0951 
0952                 default:
0953                     isSupported = true;
0954                     break;
0955                 }
0956 
0957                 break;
0958 
0959         case LibreTranslate:
0960 
0961             switch (lang)
0962             {
0963                 case NoLanguage:
0964                 case Afrikaans:
0965                 case Albanian:
0966                 case Amharic:
0967                 case Armenian:
0968                 case Azerbaijani:
0969                 case Bashkir:
0970                 case Basque:
0971                 case Belarusian:
0972                 case Bengali:
0973                 case Bosnian:
0974                 case Bulgarian:
0975                 case Cantonese:
0976                 case Catalan:
0977                 case Cebuano:
0978                 case Chichewa:
0979                 case Corsican:
0980                 case Croatian:
0981                 case Czech:
0982                 case Danish:
0983                 case Dutch:
0984                 case Esperanto:
0985                 case Estonian:
0986                 case Fijian:
0987                 case Filipino:
0988                 case Finnish:
0989                 case Frisian:
0990                 case Galician:
0991                 case Georgian:
0992                 case Greek:
0993                 case Gujarati:
0994                 case HaitianCreole:
0995                 case Hausa:
0996                 case Hawaiian:
0997                 case Hebrew:
0998                 case HillMari:
0999                 case Hmong:
1000                 case Hungarian:
1001                 case Icelandic:
1002                 case Igbo:
1003                 case Javanese:
1004                 case Kannada:
1005                 case Kazakh:
1006                 case Khmer:
1007                 case Kinyarwanda:
1008                 case Klingon:
1009                 case KlingonPlqaD:
1010                 case Kurdish:
1011                 case Kyrgyz:
1012                 case Lao:
1013                 case Latin:
1014                 case Latvian:
1015                 case LevantineArabic:
1016                 case Lithuanian:
1017                 case Luxembourgish:
1018                 case Macedonian:
1019                 case Malagasy:
1020                 case Malay:
1021                 case Malayalam:
1022                 case Maltese:
1023                 case Maori:
1024                 case Marathi:
1025                 case Mari:
1026                 case Mongolian:
1027                 case Myanmar:
1028                 case Nepali:
1029                 case Norwegian:
1030                 case Oriya:
1031                 case Papiamento:
1032                 case Pashto:
1033                 case Persian:
1034                 case Punjabi:
1035                 case QueretaroOtomi:
1036                 case Romanian:
1037                 case Samoan:
1038                 case ScotsGaelic:
1039                 case SerbianCyrillic:
1040                 case SerbianLatin:
1041                 case Sesotho:
1042                 case Shona:
1043                 case SimplifiedChinese:
1044                 case Sindhi:
1045                 case Sinhala:
1046                 case Slovak:
1047                 case Slovenian:
1048                 case Somali:
1049                 case Sundanese:
1050                 case Swahili:
1051                 case Swedish:
1052                 case Tagalog:
1053                 case Tahitian:
1054                 case Tajik:
1055                 case Tamil:
1056                 case Tatar:
1057                 case Telugu:
1058                 case Thai:
1059                 case Tongan:
1060                 case Turkmen:
1061                 case Udmurt:
1062                 case Uighur:
1063                 case Ukrainian:
1064                 case Urdu:
1065                 case Uzbek:
1066                 case Welsh:
1067                 case Xhosa:
1068                 case Yiddish:
1069                 case Yoruba:
1070                 case YucatecMaya:
1071                 case Zulu:
1072                     isSupported = false;
1073                     break;
1074 
1075                 default:
1076                     isSupported = true;
1077                     break;
1078             }
1079 
1080             break;
1081     }
1082 
1083     return isSupported;
1084 }
1085 
1086 bool DOnlineTranslator::isSupportTranslit(Engine engine, Language lang)
1087 {
1088     switch (engine)
1089     {
1090         case Google:
1091             isSupportTranslation(Google, lang); // Google supports transliteration for all supported languages
1092             break;
1093 
1094         case Yandex:
1095 
1096             switch (lang)
1097             {
1098                 case Amharic:
1099                 case Armenian:
1100                 case Bengali:
1101                 case SimplifiedChinese:
1102                 case Georgian:
1103                 case Greek:
1104                 case Gujarati:
1105                 case Hebrew:
1106                 case Hindi:
1107                 case Japanese:
1108                 case Kannada:
1109                 case Korean:
1110                 case Malayalam:
1111                 case Marathi:
1112                 case Nepali:
1113                 case Punjabi:
1114                 case Russian:
1115                 case Sinhala:
1116                 case Tamil:
1117                 case Telugu:
1118                 case Thai:
1119                 case Yiddish:
1120                     return true;
1121                 default:
1122                     return false;
1123             }
1124 
1125         case Bing:
1126 
1127             switch (lang)
1128             {
1129                 case Arabic:
1130                 case Bengali:
1131                 case Gujarati:
1132                 case Hebrew:
1133                 case Hindi:
1134                 case Japanese:
1135                 case Kannada:
1136                 case Malayalam:
1137                 case Marathi:
1138                 case Punjabi:
1139                 case SerbianCyrillic:
1140                 case SerbianLatin:
1141                 case Tamil:
1142                 case Telugu:
1143                 case Thai:
1144                 case SimplifiedChinese:
1145                 case TraditionalChinese:
1146                     return true;
1147                 default:
1148                     return false;
1149             }
1150 
1151         case LibreTranslate:    // LibreTranslate doesn't support translit
1152         case Lingva:            // Although Lingvo is a frontend to Google Translate, it doesn't support transliteration
1153             return false;
1154     }
1155 
1156     return false;
1157 }
1158 
1159 bool DOnlineTranslator::isSupportDictionary(Engine engine, Language sourceLang, Language translationLang)
1160 {
1161     switch (engine)
1162     {
1163         case Google:
1164             // Google supports dictionary for all supported languages
1165             return isSupportTranslation(Google, sourceLang) && isSupportTranslation(Google, translationLang);
1166 
1167         case Yandex:
1168 
1169             switch (sourceLang)
1170             {
1171                 case Belarusian:
1172 
1173                     switch (translationLang)
1174                     {
1175                         case Belarusian:
1176                         case Russian:
1177                             return true;
1178                         default:
1179                             return false;
1180                     }
1181 
1182                 case Bulgarian:
1183 
1184                     switch (translationLang)
1185                     {
1186                         case Russian:
1187                             return true;
1188                         default:
1189                             return false;
1190                     }
1191 
1192                 case Czech:
1193                 case Danish:
1194                 case Dutch:
1195                 case Estonian:
1196                 case Greek:
1197                 case Latvian:
1198                 case Norwegian:
1199                 case Portuguese:
1200                 case Slovak:
1201                 case Swedish:
1202 
1203                     switch (translationLang)
1204                     {
1205                         case English:
1206                         case Russian:
1207                             return true;
1208                         default:
1209                             return false;
1210                     }
1211 
1212                 case German:
1213 
1214                     switch (translationLang)
1215                     {
1216                         case German:
1217                         case English:
1218                         case Russian:
1219                         case Turkish:
1220                             return true;
1221                         default:
1222                             return false;
1223                     }
1224 
1225                 case English:
1226 
1227                     switch (translationLang)
1228                     {
1229                         case Czech:
1230                         case Danish:
1231                         case German:
1232                         case Greek:
1233                         case English:
1234                         case Spanish:
1235                         case Estonian:
1236                         case Finnish:
1237                         case French:
1238                         case Italian:
1239                         case Lithuanian:
1240                         case Latvian:
1241                         case Dutch:
1242                         case Norwegian:
1243                         case Portuguese:
1244                         case Russian:
1245                         case Slovak:
1246                         case Swedish:
1247                         case Turkish:
1248                         case Ukrainian:
1249                             return true;
1250                         default:
1251                             return false;
1252                     }
1253 
1254                 case Spanish:
1255 
1256                     switch (translationLang)
1257                     {
1258                         case English:
1259                         case Spanish:
1260                         case Russian:
1261                             return true;
1262                         default:
1263                             return false;
1264                     }
1265 
1266                 case Finnish:
1267 
1268                     switch (translationLang)
1269                     {
1270                         case English:
1271                         case Russian:
1272                         case Finnish:
1273                             return true;
1274                         default:
1275                             return false;
1276                     }
1277                 case French:
1278 
1279                     switch (translationLang)
1280                     {
1281                         case French:
1282                         case English:
1283                         case Russian:
1284                             return true;
1285                         default:
1286                             return false;
1287                     }
1288 
1289                 case Hungarian:
1290 
1291                     switch (translationLang)
1292                     {
1293                         case Hungarian:
1294                         case Russian:
1295                             return true;
1296                         default:
1297                             return false;
1298                     }
1299 
1300                 case Italian:
1301 
1302                     switch (translationLang)
1303                     {
1304                         case English:
1305                         case Italian:
1306                         case Russian:
1307                             return true;
1308                         default:
1309                             return false;
1310                     }
1311 
1312                 case Lithuanian:
1313                     switch (translationLang)
1314                     {
1315                         case English:
1316                         case Lithuanian:
1317                         case Russian:
1318                             return true;
1319                         default:
1320                             return false;
1321                     }
1322 
1323                 case Mari:
1324                 case HillMari:
1325                 case Polish:
1326                 case Tatar:
1327 
1328                     switch (translationLang)
1329                     {
1330                         case Russian:
1331                             return true;
1332                         default:
1333                             return false;
1334                     }
1335 
1336                 case Russian:
1337 
1338                     switch (translationLang)
1339                     {
1340                         case Belarusian:
1341                         case Bulgarian:
1342                         case Czech:
1343                         case Danish:
1344                         case German:
1345                         case Greek:
1346                         case English:
1347                         case Spanish:
1348                         case Estonian:
1349                         case Finnish:
1350                         case French:
1351                         case Italian:
1352                         case Lithuanian:
1353                         case Latvian:
1354                         case Mari:
1355                         case HillMari:
1356                         case Dutch:
1357                         case Norwegian:
1358                         case Portuguese:
1359                         case Russian:
1360                         case Slovak:
1361                         case Swedish:
1362                         case Turkish:
1363                         case Tatar:
1364                         case Ukrainian:
1365                             return true;
1366                         default:
1367                             return false;
1368                     }
1369 
1370                     case Turkish:
1371 
1372                         switch (translationLang)
1373                         {
1374                             case German:
1375                             case English:
1376                             case Russian:
1377                                 return true;
1378                             default:
1379                                 return false;
1380                         }
1381 
1382                     case Ukrainian:
1383 
1384                         switch (translationLang)
1385                         {
1386                             case English:
1387                             case Russian:
1388                             case Ukrainian:
1389                                 return true;
1390                             default:
1391                                 return false;
1392                         }
1393 
1394                     default:
1395                         return false;
1396             }
1397 
1398             case Bing:
1399 
1400                 // Bing support dictionary only to or from English
1401 
1402                 Language secondLang;
1403 
1404                 if      (sourceLang == English)
1405                     secondLang = translationLang;
1406                 else if (translationLang == English)
1407                     secondLang = sourceLang;
1408                 else
1409                     return false;
1410 
1411                 switch (secondLang)
1412                 {
1413                     case Afrikaans:
1414                     case Arabic:
1415                     case Bengali:
1416                     case Bosnian:
1417                     case Bulgarian:
1418                     case Catalan:
1419                     case SimplifiedChinese:
1420                     case Croatian:
1421                     case Czech:
1422                     case Danish:
1423                     case Dutch:
1424                     case Estonian:
1425                     case Finnish:
1426                     case French:
1427                     case German:
1428                     case Greek:
1429                     case HaitianCreole:
1430                     case Hebrew:
1431                     case Hindi:
1432                     case Hmong:
1433                     case Hungarian:
1434                     case Icelandic:
1435                     case Indonesian:
1436                     case Italian:
1437                     case Japanese:
1438                     case Swahili:
1439                     case Klingon:
1440                     case Korean:
1441                     case Latvian:
1442                     case Lithuanian:
1443                     case Malay:
1444                     case Maltese:
1445                     case Norwegian:
1446                     case Persian:
1447                     case Polish:
1448                     case Portuguese:
1449                     case Romanian:
1450                     case Russian:
1451                     case SerbianLatin:
1452                     case Slovak:
1453                     case Slovenian:
1454                     case Spanish:
1455                     case Swedish:
1456                     case Tamil:
1457                     case Thai:
1458                     case Turkish:
1459                     case Ukrainian:
1460                     case Urdu:
1461                     case Vietnamese:
1462                     case Welsh:
1463                         return true;
1464                     default:
1465                         return false;
1466                 }
1467 
1468             case LibreTranslate: // LibreTranslate doesn't support dictinaries
1469             case Lingva:         // Although Lingvo is a frontend to Google Translate, it doesn't support dictionaries
1470                 return false;
1471     }
1472 
1473     return false;
1474 }
1475 
1476 } // namespace Digikam