JavaScript: Detect Language of String (Node.js)

May 12, 2021

languagedetect

https://github.com/FGRibreau/node-language-detect

npm install languagedetect --save

Test 1

const LanguageDetect = require('languagedetect');
const langDetect = new LanguageDetect();
langDetect.setLanguageType('iso2')

const values = [
  'I am a happy cow',           // English
  'Je suis une vache heureuse', // French
  'Ich bin eine glückliche Kuh',// German
  'Soy una vaca feliz',         // Spanish
  'Saya sapi yang bahagia',     // Indonesian
  '我是一头快乐的牛',             // Chinese Simplified
  '我是一頭快樂的牛',             // Chinese Traditional 
  '私は幸せな牛です',             // Japanese
  'मैं एक खुश गाय हूँ',              // Hindi
  'انا بقرة سعيدة',             // Arabic
  'Я счастливая корова'         // Russian
]

const data = {}

values.forEach(value => {

  const result = langDetect.detect(value);
  data[value] = (result.find(v => v[0] != null) || [null])[0]
})

console.log(data)

Accuracy 1: 6 / 11

{
  "I am a happy cow": "cy",             // false
  "Je suis une vache heureuse": "fr",   // true
  "Ich bin eine glückliche Kuh": "de",  // true
  "Soy una vaca feliz": "it",           // false
  "Saya sapi yang bahagia": "id",       // true
  "我是一头快乐的牛": null,                // fail
  "我是一頭快樂的牛": null,                // fail
  "私は幸せな牛です": null,                // fail
  "मैं एक खुश गाय हूँ": "hi",                 // true
  "انا بقرة سعيدة": "ar",               // true
  "Я счастливая корова": "ru"           // true
}

Test 2

const values = [
  'What do we know so far about the Covid-19 variants?',        // English
  "Que savons-nous jusqu'à présent des variantes du Covid-19?", // French
  "Was wissen wir bisher über die Covid-19-Varianten?",         // German
  "¿Qué sabemos hasta ahora sobre las variantes de Covid-19?",  // Spanish
  "Apa yang kita ketahui sejauh ini tentang varian Covid-19?",  // Indonesian
  "到目前为止,我们对Covid-19变体了解多少?",                        // Chinese Simplified
  "到目前為止,我們對Covid-19變體了解多少?",                        // Chinese Traditional 
  "Covid-19バリアントについてこれまでに何を知っていますか?",           // Japanese
  "हम कोविड -19 वेरिएंट के बारे में अब तक क्या जानते हैं?",                   // Hindi
  "ما الذي نعرفه حتى الآن عن بدائل Covid-19؟",                  // Arabic
  "Что мы знаем о вариантах Covid-19?"                          // Russian
]

Accuracy 2: 8 / 11

{
  "What do we know so far about the Covid-19 variants?": "en",        // true
  "Que savons-nous jusqu'à présent des variantes du Covid-19?": "fr", // true
  "Was wissen wir bisher über die Covid-19-Varianten?": "de",         // true
  "¿Qué sabemos hasta ahora sobre las variantes de Covid-19?": "es",  // true
  "Apa yang kita ketahui sejauh ini tentang varian Covid-19?": "id",  // true
  "到目前为止,我们对Covid-19变体了解多少?": "et",                        // false
  "到目前為止,我們對Covid-19變體了解多少?": "et",                        // false
  "Covid-19バリアントについてこれまでに何を知っていますか?": "en",           // false
  "हम कोविड -19 वेरिएंट के बारे में अब तक क्या जानते हैं?": "hi",                   // true
  "ما الذي نعرفه حتى الآن عن بدائل Covid-19؟": "ar",                  // true
  "Что мы знаем о вариантах Covid-19?": "ru"                          // true
}

franc

https://github.com/wooorm/franc

npm install franc --save

Test 1

var franc = require('franc')

const values = [
  'I am a happy cow',           // English
  'Je suis une vache heureuse', // French
  'Ich bin eine glückliche Kuh',// German
  'Soy una vaca feliz',         // Spanish
  'Saya sapi yang bahagia',     // Indonesian
  '我是一头快乐的牛',             // Chinese Simplified
  '我是一頭快樂的牛',             // Chinese Traditional 
  '私は幸せな牛です',             // Japanese
  'मैं एक खुश गाय हूँ',              // Hindi
  'انا بقرة سعيدة',             // Arabic
  'Я счастливая корова'         // Russian
]

const data = {}

values.forEach(value => {
    let lang = franc(value)
    data[value] = lang == 'und' ? null: lang
})

console.log(data)

Accuracy 1: 3 / 11

{
  "I am a happy cow": "hau",            // false
  "Je suis une vache heureuse": "ada",  // false
  "Ich bin eine glückliche Kuh": "deu", // true
  "Soy una vaca feliz": "vmw",          // false
  "Saya sapi yang bahagia": "zlm",      // false
  "我是一头快乐的牛": null,                // fail
  "我是一頭快樂的牛": null,               // fail
  "私は幸せな牛です": null,               // fail
  "मैं एक खुश गाय हूँ": "mai",                // false
  "انا بقرة سعيدة": "arb",              // true
  "Я счастливая корова": "rus"          // true
}

Test 2

const values = [
  'What do we know so far about the Covid-19 variants?',        // English
  "Que savons-nous jusqu'à présent des variantes du Covid-19?", // French
  "Was wissen wir bisher über die Covid-19-Varianten?",         // German
  "¿Qué sabemos hasta ahora sobre las variantes de Covid-19?",  // Spanish
  "Apa yang kita ketahui sejauh ini tentang varian Covid-19?",  // Indonesian
  "到目前为止,我们对Covid-19变体了解多少?",                        // Chinese Simplified
  "到目前為止,我們對Covid-19變體了解多少?",                        // Chinese Traditional 
  "Covid-19バリアントについてこれまでに何を知っていますか?",           // Japanese
  "हम कोविड -19 वेरिएंट के बारे में अब तक क्या जानते हैं?",                   // Hindi
  "ما الذي نعرفه حتى الآن عن بدائل Covid-19؟",                  // Arabic
  "Что мы знаем о вариантах Covid-19?"                          // Russian
]

Accuracy 2: 8 / 11

{
  "What do we know so far about the Covid-19 variants?": "sco",         // false
  "Que savons-nous jusqu'à présent des variantes du Covid-19?": "fra",  // true
  "Was wissen wir bisher über die Covid-19-Varianten?": "afr",          // false
  "¿Qué sabemos hasta ahora sobre las variantes de Covid-19?": "spa",   // true
  "Apa yang kita ketahui sejauh ini tentang varian Covid-19?": "snk",   // false
  "到目前为止,我们对Covid-19变体了解多少?": "cmn",                          // true
  "到目前為止,我們對Covid-19變體了解多少?": "cmn",                          // true
  "Covid-19バリアントについてこれまでに何を知っていますか?": "jpn",            // true
  "हम कोविड -19 वेरिएंट के बारे में अब तक क्या जानते हैं?": "hin",                    // true
  "ما الذي نعرفه حتى الآن عن بدائل Covid-19؟": "arb",                    // true
  "Что мы знаем о вариантах Covid-19?": "rus"                            // true
}

Conclusion

The longer the phrase, the better the accuracy (preferbly at least 10 words?).

You can improve the accuracy if you could limit the languages to detect (e.g. detect 10 language only).

You could try guessLanguage.js with a demo.

You could use Google Cloud Translation (First 500,000 characters per month is Free)

You can also use RegExp for language detection like Chinese, Japanese, Hindi, Arabic, Russian, but it won’t work for English, French, German, Spanish, Indonesian.

Or you could try a hybrid solution.

This work is licensed under a
Creative Commons Attribution-NonCommercial 4.0 International License.