PluginProbe
Translation with DeepL API / 2.4.5
Translation with DeepL API v2.4.5
trunk 0.1.20180323 1.0 1.2.5.1 1.5.2.5 1.7.5 2.4.3.12 2.4.3.9 2.4.5
← All changes | deepl-configuration.class.php +155 -64 1.7.52.4.5 View file →
@@ -5,14 +5,14 @@
5 5 return apply_filters( __METHOD__, trim( get_option( 'wpdeepl_api_key' ) ) );
6 6 }
7 7 static function getAPIServer() {
8 8 $choice = get_option( 'wpdeepl_api_server');
9 - if( !$choice ) {
9 + if ( !$choice ) {
10 10 $choice = 'paid_api';
11 11 }
12 12 $possibilities = self::getDeepLAPIServers();
13 13
14 - if( isset( $possibilities[$choice] ) ) {
14 + if ( isset( $possibilities[$choice] ) ) {
15 15 return apply_filters( __METHOD__, $possibilities[$choice]['server'], $choice, $possibilities );
16 16 }
17 17 else {
18 18 return apply_filters( __METHOD__, false, $choice, $possibilities );
@@ -20,28 +20,66 @@
20 20 }
21 21
22 22 static function getDeeplAPIServers() {
23 23 $array = array(
24 - 'paid_api' => array(
25 - 'server' => 'https://api.deepl.com/v2/',
24 + 'paid_api' => array(
25 + 'server' => 'https://api.deepl.com/v2/',
26 26 'description' => __('Regular paid API Plan (https://api.deepl.com/v2/)', 'wpdeepl')
27 27 ),
28 28 'free_plan' => array(
29 29 'server' => 'https://api-free.deepl.com/v2/',
30 - 'description' => __('New (2021) free API plan (https://api-free.deepl.com)', 'wpdeepl' )
30 + 'description' => __('Free API plan (https://api-free.deepl.com)', 'wpdeepl' )
31 31 ),
32 32 );
33 33 return $array;
34 34 }
35 35
36 + static function getLocaleNameForLn( $ln, $type = 'source ' ) {
37 + $wp_locale = get_locale();
38 + $languages_data = self::DefaultsAllLanguages();
39 + foreach( $languages_data as $locale => $locale_data ) {
40 + $compare = $type == 'target' ? 'astarget' : 'assource';
41 + if( strtolower( $locale_data[$compare] ) == $ln ) {
42 + return $locale_data['labels'][$wp_locale];
43 + }
44 + }
45 + return false;
46 + }
47 +
48 + static function usingGlossaries() {
49 + return get_option('wpdeepl_glossaries') && is_array( get_option('wpdeepl_glossaries') );
50 + }
51 +
52 + static function getLocaleNameForIsoCode2( $isocode2, $type = 'source ' ) {
53 + $wp_locale = get_locale();
54 + $languages_data = self::DefaultsAllLanguages();
55 + foreach( $languages_data as $locale => $locale_data ) {
56 + if( strtolower( $locale_data['isocode'] ) == $isocode2 ) {
57 + $label = $locale_data['labels'][$wp_locale];
58 + $label = preg_replace('#\(.*?\)#ism', '', $label );
59 + return trim( $label );
60 + }
61 + }
62 + return false;
63 + }
64 +
36 65 static function getLogLevel() {
37 66 return apply_filters( __METHOD__, get_option( 'wpdeepl_log_level') );
38 67 }
39 -
68 +
69 + static function getActivePostTypes() {
70 + $return = get_option( 'wpdeepl_metabox_post_types' ) ? get_option( 'wpdeepl_metabox_post_types' ) : array();
71 + $return = get_option( 'wpdeepl_pro_post_types' ) ? array_merge( $return, get_option( 'wpdeepl_pro_post_types' ) ) : $return;
72 +
73 + $return = array_unique( $return );
74 + return apply_filters( __METHOD__, $return );
75 +
76 + }
40 77 static function getMetaBoxPostTypes() {
41 78 return apply_filters( __METHOD__, get_option( 'wpdeepl_metabox_post_types' ) );
42 79 }
43 80 static function getMetaBoxDefaultBehaviour() {
81 + return 'replace';
44 82 return apply_filters( __METHOD__, get_option( 'wpdeepl_metabox_behaviour' ) );
45 83 }
46 84 static function getDefaultTargetLanguage() {
47 85 return apply_filters( __METHOD__, get_option( 'wpdeepl_default_language' ) );
@@ -61,24 +99,33 @@
61 99 static function usingMultilingualPlugins() {
62 100 return false;
63 101 }
64 102
103 + static function getNonceAction() {
104 + return apply_filters( __METHOD__, 'deepl_translate_post' );
105 + }
65 106
107 + static function getActiveGlossaryFor( $source_language, $target_language) {
108 + $source = !empty( $source_language ) ? strtolower( substr( $source_language, 0, 2 ) ) : false;
109 + $target = !empty( $target_language ) ? strtolower( substr( $target_language, 0, 2 ) ) : false;
110 + $active_glossary_id = false;
111 + if( $source && $target) $active_glossary_id = get_option( 'wpdeepl_glossary_' . $source. '_' . $target );
112 + return apply_filters( __METHOD__, $active_glossary_id );
113 + }
66 114
67 115
68 116
117 +
69 118 /**
70 119 * 0 = activated
71 120 * 1 = activated and setup
72 121 */
73 122 static function isPluginInstalled() {
74 -
75 -
76 123 return get_option( 'wpdeepl_plugin_installed' );
77 124 }
78 125
79 126 static function execWorks() {
80 - if( exec( 'echo EXEC' ) == 'EXEC' ){
127 + if ( exec( 'echo EXEC' ) == 'EXEC' ){
81 128 return true;
82 129 }
83 130 return false;
84 131 }
@@ -86,51 +133,76 @@
86 133 static function validateLang( $language_string, $output = 'assource' ) {
87 134 // output source will return 2 characters
88 135 // output source will return AA(-AA)
89 136
90 - $language_string = filter_var( $language_string, FILTER_SANITIZE_STRING );
137 + $language_string = htmlspecialchars( $language_string );
91 138 $language_string = str_replace( '-', '_', $language_string );
92 139
140 + if( $language_string == 'NB' ) {
141 + $language_string = 'NO';
142 + }
143 +
93 144 $all_languages = DeepLConfiguration::DefaultsAllLanguages();
94 145 $locale = get_locale();
146 + //plouf( $locale, "\n locale" );
95 147
148 +
149 + //if( $language_string == 'nn_NO' ) $language_string = 'no_NO';
150 +
151 + if( strpos( $locale, '_formal' ) != false ) {
152 + $locale = str_replace( '_formal', '', $locale );
153 + }
154 + if( strpos( $locale, '_informal' ) != false ) {
155 + $locale = str_replace( '_informal', '', $locale );
156 + }
157 +
96 158 $language = false;
97 - if( isset( $all_languages[$language_string] ) ) {
159 + if( $output == 'astarget' ) {
160 + //plouf( $all_languages[$language_string]," lang $language_string locale $locale"); plouf( $all_languages);
161 + }
162 + if ( isset( $all_languages[$language_string] ) ) {
98 163 $language = $all_languages[$language_string];
99 164 }
100 165 else {
101 - foreach( $all_languages as $locale => $try_language ) {
102 - if( $try_language['allcaps'] == strtoupper( $language_string ) ) {
166 + foreach ( $all_languages as $try_locale => $try_language ) {
167 + if ( $try_language['allcaps'] == strtoupper( $language_string ) ) {
103 168 $language = $try_language;
104 169 break;
105 170 }
106 - if( $try_language['isocode'] == strtoupper( $language_string ) ) {
171 + if ( $try_language['isocode'] == strtoupper( $language_string ) ) {
107 172 $language = $try_language;
108 173 break;
109 174 }
175 + if( $output == 'astarget' && $try_language['astarget'] == strtoupper( $language_string ) ) {
176 + $language = $try_language;
177 + break;
178 + }
110 179 }
111 180 }
112 181
113 - if( !$language ) {
182 + if ( !$language ) {
114 183 return false;
115 184 }
116 185
117 - $language['label'] = $language['labels'][$locale];
186 + if( $output == 'astarget' ) {
187 + //plouf( $language, "language, locale $locale");
188 + }
189 + $language['label'] = isset( $language['labels'][$locale] ) ? $language['labels'][$locale] : false;
118 190
119 - if( $output == 'assource' ) {
191 + if ( $output == 'assource' ) {
120 192 return $language['assource'];
121 193 }
122 - elseif( $output == 'astarget' ) {
194 + elseif ( $output == 'astarget' ) {
123 195 return $language['astarget'];
124 196 }
125 - elseif( $output == 'isocode' ) {
197 + elseif ( $output == 'isocode' ) {
126 198 return $language['isocode'];
127 199 }
128 - elseif( $output == 'full' ) {
200 + elseif ( $output == 'full' ) {
129 201 return $language;
130 202 }
131 - elseif( $output == 'label' ) {
132 -
203 + elseif ( $output == 'label' ) {
204 +
133 205 return $language['label'];
134 206 }
135 207 else {
136 208 return $language['isocode'];
@@ -143,80 +215,99 @@
143 215 );
144 216 return apply_filters( __METHOD__ , $array );
145 217 }
146 218
147 - static function getFormalityLevel() {
148 - return apply_filters( __METHOD__, get_option( 'wpdeepl_default_formality' ) );
219 + static function getFormalityLevel( $target_lang = false ) {
220 + if ( $target_lang ) {
221 + $formality_level = get_option('wpdeepl_formality_' . $target_lang );
222 + }
223 + if( !$formality_level || $formality_level == 'default' ) {
224 + $formality_level = get_option( 'wpdeepl_default_formality' );
225 + }
226 +
227 + /**
228 + * . This feature currently only works for target languages DE (German), FR (French), IT (Italian), ES (Spanish), NL (Dutch), PL (Polish), PT-PT, PT-BR (Portuguese) and RU (Russian). Setting this parameter with a target language that does not support formality will fail, unless one of the prefer_... options are used. Possible options are:
229 + * default (default)
230 +more - for a more formal language
231 +less - for a more informal language
232 +prefer_more - for a more formal language if available, otherwise fallback to default formality
233 +prefer_less - for a more informal language if available, otherwise fallback to default formality
234 + * */
235 +
236 + if( $formality_level != 'default' ) {
237 + $formality_level = 'prefer_' . $formality_level;
238 + }
239 +
240 + return apply_filters( __METHOD__, $formality_level, $target_lang );
149 241 }
150 242
243 + static function getLanguagesAllowingFormality() {
244 + // This feature currently only works for target languages DE (German), FR (French), IT (Italian), ES (Spanish), NL (Dutch), PL (Polish), PT-PT, PT-BR (Portuguese) and RU (Russian).
245 + return array('de_DE', 'fr_FR', 'it_IT', 'es_SP', 'nl_NL', 'pt_PT', 'pt_BR', 'ru_RU' );
246 + }
247 +
151 248 static function DefaultsISOCodes() {
152 249 $locale = get_locale();
250 + $locale = str_replace( '_formal', '', $locale );
251 + $locale = str_replace( '_informal', '', $locale );
153 252 $all_languages = DeepLConfiguration::DefaultsAllLanguages();
154 253 $languages = array();
155 - foreach( $all_languages as $isocode => $labels ) {
254 + foreach ( $all_languages as $isocode => $labels ) {
156 255 $languages[$isocode] = isset( $labels['labels']) && isset( $labels['labels'][$locale] ) ? $labels['labels'][$locale] : false;
157 256 }
158 257 return apply_filters( __METHOD__ , $languages );
159 258 }
160 259
260 + static function getLanguageFromIsoCode2( $isocode2, $context = 'target' ) {
261 + $isocode2 = strtolower( $isocode2 );
262 + $all_languages = self::DefaultsAllLanguages();
263 + $key = ( $context == 'source' ) ? 'assource' : 'astarget';
264 + foreach( $all_languages as $lang => $language ) {
265 + $short = substr( strtolower( $language[$key] ), 0, 2 );
266 + if( $short == $isocode2 ) {
267 + return $lang;
268 + }
269 + }
270 + return false;
271 + }
272 +
161 273 static function DefaultsAllLanguages() {
162 274 $languages = array();
163 275
164 - $csv_labels = 'locale,allcaps,isocode,assource,astarget,bg_BG,cs_CZ,da_DA,de_DE,el_GR,en_US,en_GB,es_ES,et_EE,fi_FI,fr_FR,hu_HU,it_IT,ja_JP,lt_LT,lv_LV,nl_NL,pl_PL,pt_PT,pt_BR,ro_RO,ru_RU,sk_SK,sl_SI,sv_SE,zh_CN
165 -bg_BG,BG_BG,BG,BG,BG,Български,Bulharský,Bulgarsk,Bulgarisch,Βουλγαρική,Bulgarian,Bulgarian,Búlgaro,Bulgaaria,Bulgarian,Bulgare,Bolgár,Bulgaro,ブルガリア語,Bulgarų,Bulgāru,Bulgaars,Bułgarski,Búlgaro,Búlgaro,Bulgară,Болгарский,Bulharský,Bolgarski,Bulgariska,保加利亚人
166 -cs_CZ,CS_CZ,CS,CS,CS,Чешки,Čeština,Tjekkisk,Tschechisch,Τσεχική,Czech,Czech,Checo,Tšehhi,Tšekki,Tchèque,Cseh,Ceco,チェコ語,čekų kalba,Čehu,Tsjechisch,czeski,Checo,Tcheco,Cehă,чешский,Český,Češčina,Tjeckiska,捷克
167 -da_DA,DA_DA,DA,DA,DA,Датски,Dánština,dansk,Dänisch,Δανικά,Danish,Danish,Danés,Taani,tanska,Danois,dán,Danese,デンマーク語,Danų kalba,Dāņu,Deens,duński,Dinamarquês,Dinamarquês,Daneză,датский,Dánsky,danski,Danska,丹麦语
168 -de_DE,DE_DE,DE,DE,DE,Немски,Němčina,tysk,Deutsch,Γερμανικά,German,German,Alemán,Saksa,saksa,Allemand,német,Tedesco,ドイツ語,Vokiečių kalba,Vācu,Duits,Niemiecki,Alemão,Alemão,Germană,немецкий язык,Nemčina,nemščina,Tyska,德国
169 -el_GR,EL_GR,EL,EL,EL,Гръцки,Řečtina,Græsk,Griechisch,Ελληνικά,Greek,Greek,Griego,Kreeka,kreikka,Grec,görög,Greco,ギリシャ語,Graikų kalba,grieķu,Grieks,grecki,Grego,Grego,Greacă,греческий,Gréčtina,grščina,Grekiska,希腊语
170 -en_US,EN_US,EN,EN,EN-US,Английски,Angličtina,engelsk,Englisch,Αγγλικά,English,English,Inglés,inglise,Englanti,Anglais,angol,Inglese,英語,Anglų,Angļu,Engels,angielski,Inglês,Inglês,Engleză,английский язык,Angličtina,angleščina,Engelska,英文
171 -en_GB,EN_GB,EN,EN,EN-GB,Английски,Angličtina,engelsk,Englisch,Αγγλικά,English,English,Inglés,inglise,Englanti,Anglais,angol,Inglese,英語,Anglų,Angļu,Engels,angielski,Inglês,Inglês,Engleză,английский язык,Angličtina,angleščina,Engelska,英文
172 -es_ES,ES_ES,ES,ES,ES,Испански,Španělština,spansk,Spanisch,Ισπανικά,Spanish,Spanish,Español,Hispaania,Espanja,Espagnol,Spanyol,Spagnolo,スペイン語,Ispanų kalba,Spāņu,Spaans,hiszpański,Espanhol,Espanhol,Spaniolă,испанский,Španielčina,Španščina,Spanska,西班牙语
173 -et_EE,ET_EE,ET,ET,ET,Естонски,Estonština,Estisk,Estnisch,Εσθονικά,Estonian,Estonian,Estonio,Eesti keel,Viro,Estonien,Észt,Estone,エストニア語,Estų kalba,Igauņu,Ests,estoński,Estónio,Estoniano,Estoniană,эстонский,Estónčina,Estonščina,Estniska,爱沙尼亚语
174 -fi_FI,FI_FI,FI,FI,FI,Финландски,Finština,finsk,Finnisch,Φινλανδικά,Finnish,Finnish,Finlandés,Soome,suomi,Finnois,finn,Finlandese,フィンランド語,Suomių kalba,Somu,Fins,fiński,Finlandês,Finlandês,Finlandeză,финский,Fínsky,finščina,Finska,芬兰
175 -fr_FR,FR_FR,FR,FR,FR,Френски,Francouzština,Fransk,Französisch,Γαλλικά,French,French,Francés,prantsuse,ranska,Français,francia,Francese,フランス語,Prancūzų,Franču,Frans,Francuski,Francês,Francês,Franceză,французский,Francúzština,Francoski,Franska,法国人
176 -hu_HU,HU_HU,HU,HU,HU,Унгарски,Maďarština,Ungarsk,Ungarisch,Ουγγρικά,Hungarian,Hungarian,Húngaro,Ungari,unkari,Hongrois,Magyar,Ungherese,ハンガリー語,vengrų,Ungāru,Hongaars,Węgierski,Húngaro,Húngaro,Maghiară,венгерский,Maďarčina,madžarski,Ungerska,匈牙利语
177 -it_IT,IT_IT,IT,IT,IT,Италиански,italština,Italiensk,Italienisch,Ιταλικά,Italian,Italian,Italiano,Itaalia,italia,Italien,olasz,Italiano,イタリア語,italų kalba,Itāļu,Italiaans,włoski,Italiano,Italiano,Italiană,итальянский,taliansky,italijanščina,Italienska,意大利
178 -ja_JP,JA_JP,JA,JA,JA,Японски,japonština,japansk,Japanisch,Ιαπωνικά,Japanese,Japanese,Japonés,jaapani,japani,Japonais,japán,Giapponese,日本語,japonų,japāņu,Japans,japoński,Japonês,Japonês,Japoneză,Японский,Japončina,japonščina,Japanska,日文
179 -lt_LT,LT_LT,LT,LT,LT,Литовски,Litevština,Litauisk,Litauisch,Λιθουανικά,Lithuanian,Lithuanian,Lituano,Leedu,liettuan kieli,Lituanien,litván,Lituano,リトアニア語,Lietuvių,Lietuviešu,Litouws,Litewski,Lituano,Lituano,lituaniană,литовский,Litovčina,litovščina,Litauiska,立陶宛语
180 -lv_LV,LV_LV,LV,LV,LV,Латвийски,lotyština,lettisk,Lettisch,Λετονία,Latvian,Latvian,Letón,Läti,Latvian,Letton,lett,Lettone,ラトビア語,Latvių,Latviešu,Lets,łotewski,Letão,Letão,Letonă,латышский язык,lotyština,latvijski,Lettiska,拉脱维亚人
181 -nl_NL,NL_NL,NL,NL,NL,Нидерландски,nizozemština,hollandsk,Niederländisch,Ολλανδικά,Dutch,Dutch,Holandés,Hollandi,Hollanti,Néerlandais,holland,Olandese,オランダ語,Olandų,Holandiešu,Nederlands,niderlandzki,Holandês,Holandês,olandeză,голландский,Holandský,nizozemščina,Nederländska,荷兰语
182 -pl_PL,PL_PL,PL,PL,PL,Полски,Polština,polsk,Polnisch,Πολωνικά,Polish,Polish,Polaco,Poola,Puola,Polonais,Lengyel,Polacco,ポーランド語,Lenkų kalba,Poļu,Pools,Polski,Polaco,Polonês,Poloneză,польский,Poľština,poljščina,Polska,波兰语
183 -pt_PT,PT_PT,PT,PT,PT-PT,Португалски,Portugalština,portugisisk,Portugiesisch,Πορτογαλικά,Portuguese,Portuguese,Portugués,Portugali,Portugali,Portugais,Portugál,Portoghese,ポルトガル語,Portugalų,Portugāļu,Portugees,portugalski,Português,Português,Portugheză,Португальский,Portugalčina,portugalščina,Portugisiska,葡萄牙语
184 -pt_BR,PT_BR,PT,PT,PT-BR,Португалски,Portugalština,portugisisk,Portugiesisch,Πορτογαλικά,Portuguese,Portuguese,Portugués,Portugali,Portugali,Portugais,Portugál,Portoghese,ポルトガル語,Portugalų,Portugāļu,Portugees,portugalski,Português,Português,Portugheză,Португальский,Portugalčina,portugalščina,Portugisiska,葡萄牙语
185 -ro_RO,RO_RO,RO,RO,RO,Румънски,Rumunština,rumænsk,Rumänisch,Ρουμανικά,Romanian,Romanian,Rumano,Rumeenia,Romanian,Roumain,Román,Rumeno,ルーマニア語,Rumunų,Rumāņu,Roemeens,rumuński,Romeno,Romeno,Română,румынский язык,Rumunčina,romunščina,Rumänska,罗马尼亚语
186 -ru_RU,RU_RU,RU,RU,RU,Руски,ruština,russisk,Russisch,Ρωσικά,Russian,Russian,Ruso,Vene,Venäjä,Russe,orosz,Russo,ロシア語,rusų,Krievu,Russisch,rosyjski,Russo,Russo,Rusă,русский,Ruský,ruščina,Ryska,俄语
187 -sk_SK,SK_SK,SK,SK,SK,Словашки,Slovenština,Slovakisk,Slowakisch,Σλοβάκικα,Slovak,Slovak,Eslovaco,slovaki keel,slovakki,Slovaque,szlovák,Slovacco,スロバキア語,Slovakų,slovāku,Slowaaks,słowacki,Eslovaco,Eslovaco,Slovacă,словацкий,Slovensky,slovaščina,Slovakiska,斯洛伐克
188 -sl_SI,SL_SI,SL,SL,SL,Словенски,slovinština,slovensk,Slowenisch,Σλοβένικα,Slovenian,Slovenian,Esloveno,Sloveenia,Slovenian,Slovène,szlovén,Sloveno,スロベニア語,slovėnų,slovēņu,Sloveens,słoweński,Esloveno,Esloveno,Slovenă,словенский,slovinčina,slovenski,Slovenska,斯洛文尼亚语
189 -sv_SE,SV_SE,SV,SV,SV,Шведски,švédština,svensk,Schwedisch,Σουηδικά,Swedish,Swedish,Sueco,Rootsi,Ruotsi,Suédois,Svéd,Svedese,スウェーデン語,švedų,zviedru,Zweeds,szwedzki,Sueco,Sueco,Suedeză,шведский язык,švédsky,švedski,Svenska,瑞典语
190 -zh_CN,ZH_CN,ZH,ZH,ZH,Китайски,Čínština,Kinesisk,Chinesisch,Κινέζικα,Chinese,Chinese,Chino,Hiina,Kiina,Chinois,Kínai,Cinese,中国語,Kinų kalba,Ķīniešu,Chinees,chiński,Chinês,Chinês,Chineză,китайский язык,Čínština,kitajščina,Kinesiska,中文';
191 - $csv_labels = explode( "\n", $csv_labels );
192 - $headers = explode(',', array_shift( $csv_labels ) );
193 - foreach( $csv_labels as $ligne ) {
194 - $labels = explode(',', $ligne );
276 + $handle = fopen( trailingslashit( WPDEEPL_PATH ) . 'languages.csv', 'r' );
277 + $csv_data = array();
278 + if ( $handle ) {
279 + while( $data = fgetcsv( $handle, null, ',', '"' ) ) {
280 + $csv_data[] = $data;
281 + }
282 + }
283 + //plouf( $csv_data, " alors data");
284 + $headers = array_shift( $csv_data );
285 + if( $csv_data ) foreach ( $csv_data as $labels ) {
195 286 $labels = array_combine( $headers, $labels );
196 -
287 +
197 288 $locale = $labels['locale'];
198 289 unset( $labels['locale'] );
199 -
290 +
200 291 $extra_country = false;
201 - if( strlen( $labels['astarget'] ) > 2 ) {
292 + if ( strlen( $labels['astarget'] ) > 2 ) {
202 293 $extra_country = substr( $labels['astarget'], 3, 2 );
203 294 }
204 295
205 296 $languages[$locale] = array();
206 - foreach( array('allcaps', 'assource', 'astarget', 'isocode' ) as $key ) {
297 + foreach ( array('allcaps', 'assource', 'astarget', 'isocode' ) as $key ) {
207 298 $languages[$locale][$key] = $labels[$key];
208 299 unset( $labels[$key] );
209 300 }
210 301
211 302
212 - if( $extra_country ) {
213 - foreach( $labels as $code => $label ) {
303 + if ( $extra_country ) {
304 + foreach ( $labels as $code => $label ) {
214 305 $labels[$code] = $label . ' (' . $extra_country . ')';
215 306 }
216 307 }
217 308 $languages[$locale]['labels'] = $labels;
218 - }
309 + }
219 310
220 311 return apply_filters( __METHOD__, $languages );
221 312
222 313 // used for.. something else
@@ -243,7 +334,7 @@
243 334 }
244 335
245 336 static function getBulkTargetLanguages() {
246 337 return apply_filters( __METHOD__, get_option( 'wpdeepl_bulk_target_locales' ) );
247 - }
338 + }
248 339 }
249 340