تحليل آليات توطين واجهة التطبيق في Splunk


في هذه المقالة ، سننظر في الآلية الرئيسية لترجمة واجهة تطبيقات Splunk (بما في ذلك العناصر القياسية لتطبيق البحث) - تدويل gettext والتعريب (i18n).

الفرص المتاحة للترجمة:

  • واجهة سبانك
  • لوحات المعلومات (عناوين اللوحات وحقول الإدخال) ؛
  • اختيار الموارد الثابتة (الصور ، CSS ، وما إلى ذلك) بناءً على الإعدادات المحلية الحالية ، على سبيل المثال: logo-en_RU.gif أو logo-en_GB.gif.

للترجمة ، يجب عليك القيام ببعض الخطوات:

  1. إنشاء لغة جديدة في Splunk (إذا لزم الأمر).
  2. توليد ملفات قاموس الترجمة.
  3. باستخدام جافا سكريبت ، قم بتحميل الحقول المترجمة.

سنقوم أيضًا بترجمة نتائج البحث من خلال مثال ثغرات OpenVAS ، والتي على الرغم من أنها لا تنطبق على نظام الترجمة نفسه ، إلا أنها تكمل الصورة العامة جيدًا.

كل من يهتم بالمشكلات الحالية على Splunk ، ندعوك للانضمام إلى قناتنا في Telegram (SplunkRU).

لذلك ، دعنا ننتقل إلى الممارسة.

إنشاء لغة جديدة في Splunk


اسمح لي أن أذكرك أن الإعداد الافتراضي هو استخدام اللغة المحلية في الولايات المتحدة في Splunk ، يمكنك التحقق من ذلك في سطر المتصفح: MYSERVER: 8000 / ar-US / app / search ( تلميح: إذا قمت بتغيير en-US يدويًا إلى en-GB ، فسيتم تحديد الوقت والتاريخ تظهر في شكل أكثر دراية).

أولاً ، سنقوم بإنشاء لغة جديدة لروسيا. انسخ الإعدادات المحلية الحالية:

sudo cp /opt/splunk/lib/python2.7/site-packages/splunk/appserver/mrsparkle/locale/en_GB /opt/splunk/lib/python2.7/site-packages/splunk/appserver/mrsparkle/locale/ru_RU -ru 

إعادة تشغيل Splunk:

 sudo /opt/splunk/bin/splunk restart 

وتحقق:

 MYSERVER:8000/ru-RU/app/launcher/home 

إنشاء تطبيق جديد


إنشاء تطبيق جديد يسمى testapp (اسم \ اسم المجلد: testapp):

 MYSERVER:8000/ru-RU/manager/launcher/apps/local/_new?action=edit&ns=launcher 

إنشاء ملفات الترجمة


الآن ننتقل مباشرة إلى تشكيل ملفات الترجمة.

يمكننا ترجمة التطبيق الحالي ، وسنفعل ذلك للتطبيق المنشأ حديثًا:

 sudo /opt/splunk/bin/splunk extract i18n -app testapp 

بعد ذلك ، لدينا الملف /opt/splunk/etc/apps/testapp/locale/messages.pot ، والذي يحتوي على جميع الحقول المستخدمة في التطبيق ، لأن لدينا تطبيق جديد ، سيكون هناك عنصر واحد فقط - رابط لاسم التطبيق.

نحن نسجل على موقع poeditor.com .

إضافة اللغة الروسية (إضافة اللغة):



قم بإنشاء مشروع جديد واستيراد (شروط الاستيراد) /opt/splunk/etc/apps/testapp/locale/messages.pot :



أضف بعض الحقول باستخدام زر "إضافة مصطلح":



يوجد على يمين كل منهم زر لإضافة ترجمة:



سنستخدم وترجمة مجالاتنا:



نذهب إلى المشروع ، واختر اللغة الروسية وتصديرها إلى صيغتين: .po و .mo:



قم بإنشاء مجلد بالإعدادات المحلية المناسبة وانسخ ملفاتنا هناك ، وأعد تسميتها message.po و messages.mo ، على التوالي:

 sudo mkdir /opt/splunk/etc/apps/testapp/locale/ru_RU/LC_MESSAGES suco cp messages.* /opt/splunk/etc/apps/testapp/locale/ru_RU/LC_MESSAGES 

إعادة تشغيل Splunk:

 sudo /opt/splunk/bin/splunk restart. 

نذهب إلى طلبنا ونتأكد من ترجمة اسم العرض الخاص بالتطبيق:
المضيف المحلي: 8000 / en-us / app / testapp / search



شبيبة النصي


والخطوة التالية هي كتابة برنامج نصي JS يستبدل الرموز المميزة بلغات الحقول المقابلة. ضع على الفور إمكانية الترجمة إلى عدة لغات: الروسية والألمانية.

قم بإنشاء مجلد حيث سيتم تحميل البرنامج النصي من:

 sudo mkdir /opt/splunk/etc/apps/testapp/appserver sudo mkdir /opt/splunk/etc/apps/testapp/appserver/static 

نكتب النص نفسه في /opt/splunk/etc/apps/testapp/appserver/static/dashTranslate.js:

 require([ 'jquery', 'underscore', 'splunk.i18n', 'splunkjs/mvc', 'splunkjs/mvc/simplexml/ready!' ], function ($, _, i18n, mvc) { var defaultTokens = mvc.Components.get("default"); var envTokenModel = mvc.Components.getInstance("env"); if (envTokenModel.get("locale") != "ru-RU" || envTokenModel.get("locale") != "de-DE") { defaultTokens.set("form.t_locale", "ru-RU"); //       ,      (),        ( , ,       lookup ,       ,       $env::locale$ ) } else { defaultTokens.set("form.t_locale", envTokenModel.get("locale")); // set locale token } //      ,      if (i18n._("openvasTitle") == "openvasTitle") { defaultTokens.set("form.t_openvasTitle", "OpenVAS Events"); // default value } else { defaultTokens.set("form.t_openvasTitle", i18n._("openvasTitle")); // translated value } //  .           ,       defaultTokens.set("form.t_signature", i18n._("signature")); defaultTokens.set("form.t_description", i18n._("description")); defaultTokens.set("form.t_count", i18n._("count")); }); 

صنع لوحة القيادة


قم بإنشاء لوحة معلومات جديدة وإضافتها إليها (مصادر لوحة المعلومات للكسول في النهاية):

  • نص الإدخال - الاسم: العد ، الرمز: t_count
  • نص الإدخال - الاسم: openvasTitle ، الرمز المميز: t_openvasTitle
  • نص الإدخال - الاسم: التوقيع ، الرمز المميز: t_signature
  • نص الإدخال - الاسم: الوصف ، الرمز: t_description

النموذج. * الرموز لن تعمل بدون إدخال ، مما لن يسمح بنقل الحالة الكاملة للوحة القيادة إلى عنوان URL. حتى لا تكون عيونًا قاسية ، أضف "يعتمد =" لا شيء على الإطلاق $ "" إلى كل منها.

لوحة ، جدول إحصائي - العنوان: $ t_openvasTitle $

 index=openvas | stats count by "NVT Name" Summary | rename "NVT Name" AS $form.t_signature$ Summary AS $form.t_description$ count AS $form.t_count$ 

لوحة ، مخطط دائري - العنوان: $ t_openvasTitle $

 index=openvas | stats count by "NVT Name" | rename "NVT Name" AS $form.t_signature$ count AS $form.t_count$ 

أضف نص لوحة القيادة - غيّر السطر الأول إلى:

 <form script="dashTranslate.js"> 

هناك ميزة صغيرة هنا - تقوم Splunk بترجمة الحقول المعروفة لها (العد والتوقيع في حالتنا) في حقول نص الإدخال أو الرؤوس.

وضع التحرير:





الوضع العادي:





ومع ذلك ، يجب ألا يغيب عن البال أنه عند تحرير اللوحة مرة أخرى ، سيتم عرض ترجمة ، وإذا قمت ، عن طريق الصدفة ، على سبيل المثال ، بوضع مسافة ، في المصادر بدلاً من المتغير (openvasTitle أو الوصف في مثالنا) ، سيتم حفظ النص ("OpenVAS_ Events" أو "Description_") في مثالنا). بالإضافة إلى ذلك ، عند التحرير ، ليس من الواضح أن هذه الترجمة هي في الواقع ، لذلك من الأفضل استخدام الرموز ($ form.t_openvasTitle $ و $ form.t_description $ في مثالنا).

في وضع إعادة التحرير: الرأس العلوي هو الرمز المميز $ form.t_openvasTitle $ ، الجزء السفلي هو النص openvasTitle.



نتيجة لذلك ، حصلنا على لوحة القيادة



قيود


هناك اثنين من القيود التي يجب أن تكون على دراية بها:

  1. لا يمكنك ترجمة رؤوس لوحة المعلومات.
  2. لا يمكنك تعيين القيم الأولية للرموز في init \ set ، لأن يتم تنفيذها بعد البرنامج النصي للترجمة (يمكنك نقل JS إلى تنزيل لاحق ، ولكن بعد ذلك يجب عليك التحويل إلى HTML).

ترجمة نتائج البحث


لعرض البيانات النصية للمستخدمين النهائيين ، يُقترح استخدام البحث مع الترجمة إلى أي عدد من اللغات. في هذا المثال ، نستخدم الرمز المميز Splunk $ env :: local $ فقط. معرف الضعف هو التجزئة التي نربط بها الترجمة. وألاحظ أيضًا أنه إذا كانت الترجمة فارغة ، فسيتم استخدام القيمة الأولية. أضف جدولًا ثابتًا جديدًا إلى لوحة المعلومات:

 index="openvas" | eval signature=replace(signature, "[\n\r]", " ") | eval description=replace(description, "[\n\r]", " ") | eval hash=md5(signature.description) | stats count by signature description hash | lookup OpenVAS_translate hash AS hash OUTPUT signature_$env:locale$ AS signature_$env:locale$ description_$env:locale$ AS description_$env:locale$ | eval signature=coalesce('signature_$env:locale$', signature) | eval description=coalesce('description_$env:locale$', description) | fields - signature_$env:locale$ description_$env:locale$ count hash | rename signature AS $form.t_signature$ description AS $form.t_description$ 

يبدو ملف OpenVAS_translate.csv كما يلي (أنصحك باستخدام تطبيق Lookup Editor للتعامل مع عمليات البحث):



وبالتالي ، إذا كانت هناك ترجمة ، فستتم على أساس اللغة الحالية.
RU-RU:



دي-DE:



ترجمة واجهة Splunk القياسية


تتم ترجمة واجهة Splunk بالطريقة نفسها - تحتاج إلى نقل $ SPLUNK_HOME / lib / python2.7 / site-package / splunk / appserver / mrsparkle / locale / messages.pot file إلى poeditor ونسخ الملفين الناتجين (messages.mo و messages.po) إلى المجلد: $ SPLUNK_HOME / lib / python2.7 / حزم الموقع / splunk / appserver / mrsparkle / locale / ru_RU / LC_MESSAGES /

قائمة المصادر المستخدمة:

docs.splunk.com/Documentation/Splunk/6.4.1/AdvancedDev/TranslateSplunk
docs.splunk.com/Documentation/Splunk/7.2.6/Viz/tokens
splunkonbigdata.com/2018/11/01/creating-a-splunk-locale
answers.splunk.com

بقلم: ديمتري Golovnya tg:GolovnyaD

كود لوحة القيادة النهائية:

 <form script="d.js"> <label>i18n description</label> <description>description</description> <fieldset submitButton="false" autoRun="false"> <input type="text" token="t_count" depends="$nothing$"> <label>count</label> </input> <input type="text" token="t_openvasTitle" depends="$nothing$"> <label>openvasTitle</label> </input> <input type="text" token="t_signature" depends="$nothing$"> <label>signature</label> </input> <input type="text" token="t_description" depends="$nothing$"> <label>description</label> </input> </fieldset> <row> <panel> <title>$form.t_openvasTitle$</title> <table> <title>openvasTitle</title> <search> <query>index=openvas | stats count by "NVT Name" Summary | rename "NVT Name" AS $form.t_signature$ Summary AS $form.t_description$ count AS $form.t_count$</query> <earliest>0</earliest> <latest></latest> </search> <option name="drilldown">none</option> <option name="refresh.display">progressbar</option> </table> </panel> </row> <row> <panel> <chart> <title>$form.t_openvasTitle$</title> <search> <query>index=openvas | stats count by "NVT Name" | rename "NVT Name" AS $form.t_signature$ count AS $form.t_count$</query> <earliest>0</earliest> <latest></latest> </search> <option name="charting.chart">pie</option> <option name="charting.drilldown">none</option> <option name="refresh.display">progressbar</option> </chart> </panel> </row> <row> <panel> <table> <search> <query>index="openvas" | eval signature=replace(signature, "[\n\r]", " ") | eval description=replace(description, "[\n\r]", " ") | eval hash=md5(signature.description) | stats count by signature description hash | lookup OpenVAS_translate hash AS hash OUTPUT signature_$env:locale$ AS signature_$env:locale$ description_$env:locale$ AS description_$env:locale$ | eval signature=coalesce('signature_$env:locale$', signature) | eval description=coalesce('description_$env:locale$', description) | fields - signature_$env:locale$ description_$env:locale$ count hash | rename signature AS $form.t_signature$ description AS $form.t_description$</query> <earliest>0</earliest> <latest></latest> </search> <option name="count">10</option> <option name="drilldown">none</option> <option name="refresh.display">progressbar</option> </table> </panel> </row> </form> 

Source: https://habr.com/ru/post/ar464675/


All Articles