]> git.mxchange.org Git - friendica-addons.git/blob - cld/cld.php
CLD: Keep the original detected language array
[friendica-addons.git] / cld / cld.php
1 <?php
2 /**
3  * Name: Compact Language Detector
4  * Description: Improved language detection
5  * Version: 0.1
6  * Author: Michael Vogel <heluecht@pirati.ca>
7  */
8
9 use Friendica\Core\Hook;
10 use Friendica\Core\Logger;
11 use Friendica\DI;
12
13 function cld_install()
14 {
15         Hook::register('detect_languages', __FILE__, 'cld_detect_languages');
16 }
17
18 function cld_detect_languages(array &$data)
19 {
20         if (!in_array('cld2', get_loaded_extensions())) {
21                 Logger::warning('CLD2 is not installed.');
22                 return;
23         }
24
25         $cld2 = new \CLD2Detector();
26
27         $cld2->setEncodingHint(CLD2Encoding::UTF8); // optional, hints about text encoding
28         $cld2->setPlainText(true);
29
30         $result = $cld2->detect($data['text']);
31
32         if ($data['detected']) {
33                 $original = array_key_first($data['detected']);
34         } else {
35                 $original = '';
36         }
37
38         $detected = $result['language_code'];
39         if ($detected == 'pt') {
40                 $detected = 'pt-PT';
41         } elseif ($detected == 'az') {
42                 $detected = 'az-Latn';
43         } elseif ($detected == 'bs') {
44                 $detected = 'bs-Latn';
45         } elseif ($detected == 'el') {
46                 $detected = 'el-monoton';
47         } elseif ($detected == 'ht') {
48                 $detected = 'fr';
49         } elseif ($detected == 'iw') {
50                 $detected = 'he';
51         } elseif ($detected == 'jw') {
52                 $detected = 'jv';
53         } elseif ($detected == 'ms') {
54                 $detected = 'ms-Latn';
55         } elseif ($detected == 'no') {
56                 $detected = 'nb';
57         } elseif ($detected == 'sr') {
58                 $detected = 'sr-Cyrl';
59         } elseif ($detected == 'zh') {
60                 $detected = 'zh-Hans';
61         } elseif ($detected == 'zh-Hant') {
62                 $detected = 'zh-hant';
63         }
64
65         // languages that aren't supported via the base language detection
66         if (in_array($detected, ['ceb', 'hmn', 'ht', 'kk', 'ky', 'mg', 'mk', 'ml', 'ny', 'or', 'pa', 'rw', 'su', 'st', 'tg', 'ts', 'xx-Qaai'])) {
67                 return;
68         }
69
70         if (!$result['is_reliable']) {
71                 Logger::debug('Unreliable detection', ['uri-id' => $data['uri-id'], 'original' => $original, 'detected' => $detected, 'name' => $result['language_name'], 'probability' => $result['language_probability'], 'text' => $data['text']]);
72                 if (($original == $detected) && ($data['detected'][$original] < $result['language_probability'] / 100)) {
73                         $data['detected'][$original] = $result['language_probability'] / 100;
74                 }
75                 return;
76         }
77
78         $available = array_keys(DI::l10n()->convertForLanguageDetection(DI::l10n()->getAvailableLanguages(true)));
79         
80         if (!in_array($detected, $available)) {
81                 Logger::debug('Unsupported language', ['uri-id' => $data['uri-id'], 'original' => $original, 'detected' => $detected, 'name' => $result['language_name'], 'probability' => $result['language_probability'], 'text' => $data['text']]);
82                 return;
83         }
84
85         if ($original != $detected) {
86                 Logger::debug('Detected different language', ['uri-id' => $data['uri-id'], 'original' => $original, 'detected' => $detected, 'name' => $result['language_name'], 'probability' => $result['language_probability'], 'text' => $data['text']]);
87         }
88
89         $length = count($data['detected']);
90         if ($length > 0) {
91                 unset($data['detected'][$detected]);
92                 $data['detected'] = array_merge([$detected => $result['language_probability'] / 100], array_slice($data['detected'], 0, $length - 1));
93         } else {
94                 $data['detected'] = [$detected => $result['language_probability'] / 100];
95         }
96 }