طريقة برمجة "تطبيقات OCR" باستخدام Java
تعرف على كيفية تسخير حلين من حلول API لتحويل الصور الممسوحة ضوئيًا أو
المصورة إلى نص عادي يمكن قراءته آليًا.
نظرًا لأن العديد من احتياجاتنا الأكثر إلحاحًا في العصر الرقمي نلبيها بنقرة زر واحدة
(أو ربما بشكل أكثر دقة ، لمسة الشاشة) ، فقد يفترض المرء بشكل معقول أن قيمة
وضع القلم على الورق قد تضاءلت إلى مستوى فقط خجول من عدم الصلة تماما.
ومع ذلك ، حتى مع استمرار عالم الأعمال في مسيرته الثابتة نحو الرقمنة الكاملة ،
ما زلنا نجد أنفسنا بطريقة ما نكتب مواد مكتوبة بخط اليد للعديد من المعاملات الأكثر
أهمية في حياتنا. على سبيل المثال ، بينما يختار الكثير منا تغطية التأمين الصحي من
خلال بوابة صاحب العمل على الإنترنت ، ما زلنا نحتاج عادةً إلى كتابة تفاصيل مهمة
مختلفة عند وصولنا إلى مكتب الطبيب - مثل الحساسية والأدوية وحالات التعرض
الأخيرة للأمراض وما إلى ذلك - ومن هناك ، نحتاج إلى تسليم هذه النماذج المعبأة
إلى موظف في المكتب لمعالجتها. بالإضافة إلى ذلك، بينما (على الأرجح) يقوم معظمنا
بالتحقق من الموارد المالية ودفع الفواتير من خلال التطبيقات المصرفية الآمنة ،
إلا أننا ما زلنا لا نستطيع الهروب من استخدام المواد المكتوبة بخط اليد شخصيًا في
عملية الحصول على قروض لمشاريعنا المستقبلية ، وما زلنا غالبًا ما تتلقى شيكات مكتوبة
بخط اليد للدفع. كل الأشياء التي تم أخذها في الاعتبار ، قد لا تموت أهمية
المواد المكتوبة بخط اليد بالسرعة المتوقعة.
ومع ذلك ، بغض النظر عن كيفية ملء معلوماتنا الطبية أو المالية ، هناك شيء واحد مؤكد:
تلك المعلومات ، بطريقة أو بأخرى ، سيتم تخزينها في شكل رقمي. السبب في
ذلك واضح - الاعتماد على أكوام من الورق في خزانات الملفات المزدحمة
لتخزين جميع البيانات المرجعية المهمة هو أمر غير مسؤول بشكل واضح في العصر الحديث.
حتى لو كانت خزانات الملفات الجبلية لا تزال موجودة في بعض المكاتب المثقلة بالأعباء
في العالم ، فلن يقبل أحد تخزين مثل هذه الملفات عن عمد بدون شكل من أشكال التكرار الرقمي.
إن احتمال فقدان البيانات الهامة المحتملة بسبب كارثة طبيعية - سواء كانت حالة قديمة
من الفوضى البشرية المعطلة ، أو حالة مأساوية لا يمكن التنبؤ بها حقًا مثل الزلزال أو
الحريق - أمر مدمر للغاية. بعد كل ذلك، رقمنة الشكل المادي هي عملية بسيطة ورخيصة.
كل ما تحتاجه هو كاميرا أو جهاز مسح ، وستكون جاهزًا على الفور لإنشاء نسخ
رقمية من أي مواد مغلفة بالورق يمكنك التفكير فيها.
بمجرد تخزينها في شكل رقمي ، يتم تحديد جودة البيانات الورقية وقابليتها للاستخدام
من خلال مقياس جديد: إلى أي مدى يمكن الآن الاستعلام عن هذه البيانات والوصول
إليها ومعالجتها؟ بمجرد تصوير المستند ، يوجد المستند كملف نقطي ثنائي الأبعاد
يتكون بالكامل من وحدات البكسل. على هذا النحو ، فإن البيانات المعروضة داخل
تلك الصورة ليست قابلة للقراءة آليًا: لا يمكن الاستعلام عنها مباشرة من تلقاء نفسها.
لكي تصبح هذه البيانات قابلة للوصول رقميًا ، يجب ترجمة نصها المنقسم إلى سلسلة
نصية عادية ، وهي شكل من أشكال البيانات وأجهزة الكمبيوتر مجهزة جيدًا للقراءة.
لإنجاز هذا الانتقال من التناظرية إلى الرقمية ، فإن التعرف الضوئي على الأحرف
(OCR) هو الحل الأمثل. OCR هي عملية بسيطة لتحويل صورة نص إلى
نص يمكن قراءته آليًا ، وهناك طريقتان رئيسيتان يمكن تحقيقهما - أي عبر مطابقة
الأنماط أو استخراج الميزات - لكنني سأؤجل مناقشة أعمق فيما يتعلق بهذه المنهجيات
إلى مقالة أكثر تركيزًا على هذا الموضوع. بمجرد أن يصبح النص قابلاً للقراءة آليًا ،
يمكن تخزينه بشكل مستقل عن الملف ثنائي الأبعاد الذي وصل إليه. وهذا يعني
أنه يمكن الآن الاستعلام عن النص المهم ومعالجته وتخزينه بالشكل الذي نراه مناسبًا.
البرهنة "Demonstration"
الغرض الرئيسي من هذه المقالة هو توضيح حلين لواجهة برمجة تطبيقات OCR
التي يمكنك استخدامها لتحويل الصور الممسوحة ضوئيًا والمصورة إلى نص عادي يمكن قراءته آليًا.
تقدم كلتا الخدمتين إعدادات قابلة للتخصيص للتسامح مع الأخطاء
(أساسية ، عادية ، ومتقدمة ؛ تزيد هذه الإعدادات على التوالي من عدد
مكالمات واجهة برمجة التطبيقات المستهلكة لكل تحويل) وتوفر مرونة ممتازة
مع دعم لعشرات اللغات الشائعة ، بما في ذلك الإنجليزية ، والصينية ، والهولندية ، والفرنسية ، و أكثر.
بينما تؤدي واجهات برمجة التطبيقات هذه وظيفة متشابهة جدًا من وجهة نظر عين الطائر ،
فإن الاختلاف الأساسي بينهما هو درجة تحمل الأخطاء المضمنة. في حين أن أي
خدمة OCR مضبوطة بشكل مناسب يجب أن تقوم أولاً بالمعالجة المسبقة
(أي إزالة العيوب من) صورة قبل أداء وظيفة التعرف على النص ،
يمكن استخدام كل من حلول API التالية مع حساب Cloudmersive مجاني
(ينتج 800 مكالمة لواجهة برمجة التطبيقات شهريًا) ، واستخدام أمثلة كود Java
الجاهزة للتشغيل الواردة في هذه المقالة لهيكلة مكالمات API الخاصة بك.
قبل الاتصال بواجهة برمجة التطبيقات (API) ، فإن خطوتنا الأولى هي تثبيت
عميل Cloudmersive OCR API. يمكننا القيام بذلك مع Maven عن
طريق إضافة مرجع Jitpack أولاً إلى المستودع في pom.xml :
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
بعد ذلك ، نحتاج إلى إضافة مرجع إلى التبعية في pom.xml:
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
بدلاً من ذلك ، يمكننا التثبيت باستخدام Gradle عن طريق إضافة مرجع أولاً في
بنية الجذر الخاصة بنا في نهاية المستودعات:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
ثم إضافة تبعية في build.gradle:
dependencies {
implementation 'com.github.Cloudmersive:Cloudmersive.APIClient.Java:v4.25'
}
بعد انتهاء التثبيت ، يمكننا تحويل انتباهنا إلى هيكل استدعاء API أكبر.
لتحويل صورة ممسوحة ضوئيًا لمستند إلى نص ، نحتاج أولاً إلى نسخ ولصق
الواردات أعلى ملفنا ، ثم استدعاء الوظيفة ، بما في ذلك مفتاح API
وصورة المستند الممسوحة ضوئيًا في الحقول المخصصة :
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ImageOcrApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
ImageOcrApi apiInstance = new ImageOcrApi();
File imageFile = new File("/path/to/inputfile"); // File | Image file to perform OCR on. Common file formats such as PNG, JPEG are supported.
String recognitionMode = "recognitionMode_example"; // String | Optional; possible values are 'Basic' which provides basic recognition and is not resillient to page rotation, skew or low quality images uses 1-2 API calls; 'Normal' which provides highly fault tolerant OCR recognition uses 26-30 API calls; and 'Advanced' which provides the highest quality and most fault-tolerant recognition uses 28-30 API calls. Default recognition mode is 'Advanced'
String language = "language_example"; // String | Optional, language of the input document, default is English (ENG). Possible values are ENG (English), ARA (Arabic), ZHO (Chinese - Simplified), ZHO-HANT (Chinese - Traditional), ASM (Assamese), AFR (Afrikaans), AMH (Amharic), AZE (Azerbaijani), AZE-CYRL (Azerbaijani - Cyrillic), BEL (Belarusian), BEN (Bengali), BOD (Tibetan), BOS (Bosnian), BUL (Bulgarian), CAT (Catalan; Valencian), CEB (Cebuano), CES (Czech), CHR (Cherokee), CYM (Welsh), DAN (Danish), DEU (German), DZO (Dzongkha), ELL (Greek), ENM (Archaic/Middle English), EPO (Esperanto), EST (Estonian), EUS (Basque), FAS (Persian), FIN (Finnish), FRA (French), FRK (Frankish), FRM (Middle-French), GLE (Irish), GLG (Galician), GRC (Ancient Greek), HAT (Hatian), HEB (Hebrew), HIN (Hindi), HRV (Croatian), HUN (Hungarian), IKU (Inuktitut), IND (Indonesian), ISL (Icelandic), ITA (Italian), ITA-OLD (Old - Italian), JAV (Javanese), JPN (Japanese), KAN (Kannada), KAT (Georgian), KAT-OLD (Old-Georgian), KAZ (Kazakh), KHM (Central Khmer), KIR (Kirghiz), KOR (Korean), KUR (Kurdish), LAO (Lao), LAT (Latin), LAV (Latvian), LIT (Lithuanian), MAL (Malayalam), MAR (Marathi), MKD (Macedonian), MLT (Maltese), MSA (Malay), MYA (Burmese), NEP (Nepali), NLD (Dutch), NOR (Norwegian), ORI (Oriya), PAN (Panjabi), POL (Polish), POR (Portuguese), PUS (Pushto), RON (Romanian), RUS (Russian), SAN (Sanskrit), SIN (Sinhala), SLK (Slovak), SLV (Slovenian), SPA (Spanish), SPA-OLD (Old Spanish), SQI (Albanian), SRP (Serbian), SRP-LAT (Latin Serbian), SWA (Swahili), SWE (Swedish), SYR (Syriac), TAM (Tamil), TEL (Telugu), TGK (Tajik), TGL (Tagalog), THA (Thai), TIR (Tigrinya), TUR (Turkish), UIG (Uighur), UKR (Ukrainian), URD (Urdu), UZB (Uzbek), UZB-CYR (Cyrillic Uzbek), VIE (Vietnamese), YID (Yiddish)
String preprocessing = "preprocessing_example"; // String | Optional, preprocessing mode, default is 'Auto'. Possible values are None (no preprocessing of the image), and Auto (automatic image enhancement of the image before OCR is applied; this is recommended).
try {
ImageToTextResponse result = apiInstance.imageOcrPost(imageFile, recognitionMode, language, preprocessing);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling ImageOcrApi#imageOcrPost");
e.printStackTrace();
}
لتحويل صورة مستند إلى نص ، سنقوم بدلاً من ذلك بإجراء نفس العملية
لجسم مختلف قليلاً من التعليمات البرمجية.
مرة أخرى ، سنقوم أولاً
بنسخ عمليات الاستيراد إلى أعلى ملفنا ، ثم سنقوم بتضمين الوظيفة ، بإضافة
مفتاح API الخاص بنا وصورة المستند المحمولة في نفس الحقول كما في السابق:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ImageOcrApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
ImageOcrApi apiInstance = new ImageOcrApi();
File imageFile = new File("/path/to/inputfile"); // File | Image file to perform OCR on. Common file formats such as PNG, JPEG are supported.
String recognitionMode = "recognitionMode_example"; // String | Optional; possible values are 'Basic' which provides basic recognition and is not resillient to page rotation, skew or low quality images uses 1-2 API calls; 'Normal' which provides highly fault tolerant OCR recognition uses 26-30 API calls; and 'Advanced' which provides the highest quality and most fault-tolerant recognition uses 28-30 API calls. Default recognition mode is 'Advanced'
String language = "language_example"; // String | Optional, language of the input document, default is English (ENG). Possible values are ENG (English), ARA (Arabic), ZHO (Chinese - Simplified), ZHO-HANT (Chinese - Traditional), ASM (Assamese), AFR (Afrikaans), AMH (Amharic), AZE (Azerbaijani), AZE-CYRL (Azerbaijani - Cyrillic), BEL (Belarusian), BEN (Bengali), BOD (Tibetan), BOS (Bosnian), BUL (Bulgarian), CAT (Catalan; Valencian), CEB (Cebuano), CES (Czech), CHR (Cherokee), CYM (Welsh), DAN (Danish), DEU (German), DZO (Dzongkha), ELL (Greek), ENM (Archaic/Middle English), EPO (Esperanto), EST (Estonian), EUS (Basque), FAS (Persian), FIN (Finnish), FRA (French), FRK (Frankish), FRM (Middle-French), GLE (Irish), GLG (Galician), GRC (Ancient Greek), HAT (Hatian), HEB (Hebrew), HIN (Hindi), HRV (Croatian), HUN (Hungarian), IKU (Inuktitut), IND (Indonesian), ISL (Icelandic), ITA (Italian), ITA-OLD (Old - Italian), JAV (Javanese), JPN (Japanese), KAN (Kannada), KAT (Georgian), KAT-OLD (Old-Georgian), KAZ (Kazakh), KHM (Central Khmer), KIR (Kirghiz), KOR (Korean), KUR (Kurdish), LAO (Lao), LAT (Latin), LAV (Latvian), LIT (Lithuanian), MAL (Malayalam), MAR (Marathi), MKD (Macedonian), MLT (Maltese), MSA (Malay), MYA (Burmese), NEP (Nepali), NLD (Dutch), NOR (Norwegian), ORI (Oriya), PAN (Panjabi), POL (Polish), POR (Portuguese), PUS (Pushto), RON (Romanian), RUS (Russian), SAN (Sanskrit), SIN (Sinhala), SLK (Slovak), SLV (Slovenian), SPA (Spanish), SPA-OLD (Old Spanish), SQI (Albanian), SRP (Serbian), SRP-LAT (Latin Serbian), SWA (Swahili), SWE (Swedish), SYR (Syriac), TAM (Tamil), TEL (Telugu), TGK (Tajik), TGL (Tagalog), THA (Thai), TIR (Tigrinya), TUR (Turkish), UIG (Uighur), UKR (Ukrainian), URD (Urdu), UZB (Uzbek), UZB-CYR (Cyrillic Uzbek), VIE (Vietnamese), YID (Yiddish)
try {
ImageToTextResponse result = apiInstance.imageOcrPhotoToText(imageFile, recognitionMode, language);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling ImageOcrApi#imageOcrPhotoToText");
e.printStackTrace();
}
للتذكير ، يمكنك تعيين واجهة برمجة التطبيقات (API) لاكتشاف اللغة
التي تختارها من خلال تضمين الاختصار المكون من ثلاثة أحرف للغة المفضلة
لديك في حقل "لغة السلسلة" (يتم سرد كل لغة قابلة للتطبيق في تعليقات
التعليمات البرمجية المجاورة لهذا الحقل). بالإضافة إلى ذلك ، إذا كنت ترغب في
التعرف بشكل أفضل على الفرق بين التسامح الأساسي والعادي والمتقدم مع الخطأ لكل حل ،
فإنني أوصي باختبار نفس المستند مرة واحدة مع كل قيمة مختلفة.
الإعداد الافتراضي - والأكثر كثافة للموارد - هو "متقدم"
(يستهلك هذا حوالي 28-30 استدعاء API لكل مستند).
يرجى الرجوع إلى ما يلي للحصول على قائمة شاملة للغات التي
تدعمها كل من واجهات برمجة التطبيقات المذكورة أعلاه:
ENG (الإنجليزية) ، ARA (العربية) ، ZHO (الصينية - المبسطة) ،
ZHO-HANT (الصينية - التقليدية) ، ASM (الأسامية) ، AFR (الأفريكانية) ، AMH (الأمهرية) ، AZE (الأذربيجانية) ، AZE-CYRL ( الأذربيجانية - السيريلية) ، BEL (البيلاروسية) ، BEN (البنغالية) ، BOD (التبتية) ، BOS (البوسنية) ، BUL (البلغارية) ، CAT (الكاتالانية ، الفالنسية) ، CEB (Cebuano) ، CES (التشيكية) ، CHR (شيروكي) ) ، CYM (الويلزية) ، DAN (الدنماركية) ، DEU (الألمانية) ، DZO (Dzongkha) ، ELL (اليونانية) ، ENM (اللغة الإنجليزية القديمة / الوسطى) ، EPO (الإسبرانتو) ، EST (الإستونية) ، EUS (الباسك) ، FAS (الفارسية) ، FIN (الفنلندية) ، FRA (الفرنسية) ، FRK (الفرنجة) ، FRM (الفرنسية الوسطى) ، GLE (الأيرلندية) ، GLG (الجاليكية) ، GRC (اليونانية القديمة) ، HAT (الهاتية) ، HEB ( عبري) ، HIN (هندي) ، HRV (كرواتي) ، HUN (مجري) ، IKU (Inuktitut) ، IND (إندونيسي) ، ISL (أيسلندي) ، ITA (إيطالي) ، ITA-OLD (قديم - إيطالي) ، JAV (جافاني) ) ، JPN (ياباني) ، KAN (كانادا) ، KAT (جورجي) ،KAT-OLD (الجورجية القديمة) ، KAZ (الكازاخستانية) ، KHM (الخمير الوسطى) ، KIR (القرغيزية) ، KOR (الكورية) ، KUR (الكردية) ، لاو (لاو) ، لات (اللاتينية) ، LAV (اللاتفية) ، LIT (الليتوانية) ، MAL (المالايالامية) ، MAR (المهاراتية) ، MKD (المقدونية) ، MLT (المالطية) ، MSA (الملايو) ، MYA (البورمية) ، النيبالية (النيبالية) ، NLD (الهولندية) ، NOR (النرويجية) ، ORI (Oriya) ، PAN (Panjabi) ، POL (البولندية) ، POR (البرتغالية) ، PUS (البشتو) ، RON (الرومانية) ، RUS (الروسية) ، SAN (السنسكريتية) ، SIN (السنهالية) ، SLK (السلوفاكية) ، SLV (السلوفينية) ، SPA (الإسبانية) ، SPA-OLD (الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (الصربية اللاتينية) ، SWA (السواحيلية) ، SWE (السويدية) ، SYR (السريانية) ، TAM (التاميلية)، TEL (Telugu)، TGK (Tajik)، TGL (Tagalog)، THA (التايلاندية)، TIR (التيغرينية)، TUR (التركية)، UIG (الأويغور)، UKR (الأوكرانية)، URD (الأردية) ، UZB (أوزبكي) ، UZB-CYR (أوزبكي سيريلي) ، VIE (فيتنامي) ، YID (يديش)KHM (الخمير الوسطى) ، KIR (القرغيزية) ، KOR (الكورية) ، KUR (الكردية) ، LAO (اللاوية) ، LAT (اللاتينية) ، LAV (اللاتفية) ، LIT (الليتوانية) ، MAL (المالايالامية) ، MAR (المهاراتية) ، MKD (المقدونية) ، MLT (المالطية) ، MSA (الملايو) ، MYA (البورمية) ، النيبالية (النيبالية) ، NLD (الهولندية) ، NOR (النرويجية) ، ORI (الأوريا) ، PAN (البنجابية) ، بولندا (البولندية) ، POR (البرتغالية)، PUS (Pushto)، RON (الرومانية)، RUS (الروسية)، SAN (السنسكريتية)، SIN (السنهالية)، SLK (السلوفاكية)، SLV (السلوفينية)، SPA (الإسبانية)، SPA-OLD ( الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (الصربية اللاتينية) ، SWA (السواحيلية) ، SWE (السويدية) ، SYR (السريانية) ، التاميل (التاميلية) ، TEL (التيلجو) ، TGK (الطاجيكية ) ، TGL (التغالوغ) ، THA (التايلاندية) ، TIR (التيغرينيا) ، TUR (التركية) ، UIG (الأويغور) ، UKR (الأوكرانية) ، URD (الأردية) ، UZB (الأوزبكية) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)KHM (الخمير الوسطى) ، KIR (القرغيزية) ، KOR (الكورية) ، KUR (الكردية) ، LAO (اللاوية) ، LAT (اللاتينية) ، LAV (اللاتفية) ، LIT (الليتوانية) ، MAL (المالايالامية) ، MAR (المهاراتية) ، MKD (المقدونية) ، MLT (المالطية) ، MSA (الملايو) ، MYA (البورمية) ، النيبالية (النيبالية) ، NLD (الهولندية) ، NOR (النرويجية) ، ORI (الأوريا) ، PAN (البنجابية) ، بولندا (البولندية) ، POR (البرتغالية)، PUS (Pushto)، RON (الرومانية)، RUS (الروسية)، SAN (السنسكريتية)، SIN (السنهالية)، SLK (السلوفاكية)، SLV (السلوفينية)، SPA (الإسبانية)، SPA-OLD ( الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (الصربية اللاتينية) ، SWA (السواحيلية) ، SWE (السويدية) ، SYR (السريانية) ، التاميل (التاميلية) ، TEL (التيلجو) ، TGK (الطاجيكية ) ، TGL (التغالوغ) ، THA (التايلاندية) ، TIR (التيغرينيا) ، TUR (التركية) ، UIG (الأويغور) ، UKR (الأوكرانية) ، URD (الأردية) ، UZB (الأوزبكية) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)LAV (اللاتفية) ، LIT (الليتوانية) ، MAL (المالايالامية) ، MAR (المهاراتية) ، MKD (المقدونية) ، MLT (المالطية) ، MSA (الملايو) ، MYA (البورمية) ، النيبالية (النيبالية) ، NLD (الهولندية) ، NOR (النرويجية) ، ORI (Oriya) ، PAN (Panjabi) ، POL (البولندية) ، POR (البرتغالية) ، PUS (Pushto) ، RON (الرومانية) ، RUS (الروسية) ، SAN (السنسكريتية) ، SIN (السنهالية) ، SLK (السلوفاكية) ، SLV (السلوفينية) ، SPA (الإسبانية) ، SPA-OLD (الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (اللاتينية الصربية) ، SWA (السواحيلية) ، SWE (السويدية) ، SYR (السريانية) ، TAM (التاميل) ، TEL (التيلجو) ، TGK (الطاجيكية) ، TGL (التاجالوج) ، THA (التايلاندية) ، TIR (التيغرينيا) ، TUR (التركية) ، UIG (الأويغور) ، المملكة المتحدة (الأوكرانية) ، URD (الأردية) ، UZB (أوزبكي) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)LAV (اللاتفية) ، LIT (الليتوانية) ، MAL (المالايالامية) ، MAR (المهاراتية) ، MKD (المقدونية) ، MLT (المالطية) ، MSA (الملايو) ، MYA (البورمية) ، النيبالية (النيبالية) ، NLD (الهولندية) ، NOR (النرويجية) ، ORI (Oriya) ، PAN (Panjabi) ، POL (البولندية) ، POR (البرتغالية) ، PUS (Pushto) ، RON (الرومانية) ، RUS (الروسية) ، SAN (السنسكريتية) ، SIN (السنهالية) ، SLK (السلوفاكية) ، SLV (السلوفينية) ، SPA (الإسبانية) ، SPA-OLD (الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (اللاتينية الصربية) ، SWA (السواحيلية) ، SWE (السويدية) ، SYR (السريانية) ، TAM (التاميل) ، TEL (التيلجو) ، TGK (الطاجيكية) ، TGL (التاجالوج) ، THA (التايلاندية) ، TIR (التيغرينيا) ، TUR (التركية) ، UIG (الأويغور) ، المملكة المتحدة (الأوكرانية) ، URD (الأردية) ، UZB (أوزبكي) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)PAN (بنجابي) ، POL (البولندية) ، POR (البرتغالية) ، PUS (البشتو) ، RON (الرومانية) ، RUS (الروسية) ، SAN (السنسكريتية) ، SIN (السنهالية) ، SLK (السلوفاكية) ، SLV (السلوفينية) ، SPA (الإسبانية) ، SPA-OLD (الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (الصربية اللاتينية) ، SWA (السواحيلية) ، السويدية (السويدية) ، SYR (السريانية) ، التاميل (التاميل) ، TEL (Telugu)، TGK (Tajik)، TGL (Tagalog)، THA (Thai)، TIR (Tigrinya)، TUR (التركية)، UIG (Uighur)، UKR (الأوكرانية)، URD (Urdu)، UZB (أوزبكي) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)PAN (بنجابي) ، POL (البولندية) ، POR (البرتغالية) ، PUS (البشتو) ، RON (الرومانية) ، RUS (الروسية) ، SAN (السنسكريتية) ، SIN (السنهالية) ، SLK (السلوفاكية) ، SLV (السلوفينية) ، SPA (الإسبانية) ، SPA-OLD (الإسبانية القديمة) ، SQI (الألبانية) ، SRP (الصربية) ، SRP-LAT (الصربية اللاتينية) ، SWA (السواحيلية) ، السويدية (السويدية) ، SYR (السريانية) ، التاميل (التاميل) ، TEL (Telugu)، TGK (Tajik)، TGL (Tagalog)، THA (Thai)، TIR (Tigrinya)، TUR (التركية)، UIG (Uighur)، UKR (الأوكرانية)، URD (Urdu)، UZB (أوزبكي) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)TIR (التيغرينية) ، TUR (التركية) ، UIG (الأويغور) ، UKR (الأوكرانية) ، URD (الأردية) ، UZB (الأوزبكية) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)TIR (التيغرينية) ، TUR (التركية) ، UIG (الأويغور) ، UKR (الأوكرانية) ، URD (الأردية) ، UZB (الأوزبكية) ، UZB-CYR (الأوزبكية السيريلية) ، VIE (الفيتنامية) ، YID (اليديشية)