Splunk中的应用程序接口本地化机制分析


在本文中,我们将考虑本地化Splunk应用程序(包括Search应用程序的标准元素)的接口的主要机制-gettext国际化和本地化(i18n)。

翻译的机会:

  • Splunk界面
  • 仪表板(面板标题和输入字段);
  • 根据当前语言环境选择静态资源(图像,CSS等),例如:logo-en_RU.gif或logo-en_GB.gif。

对于本地化,您需要执行一些步骤:

  1. 在Splunk中创建新的语言环境(如有必要)。
  2. 生成翻译词典文件。
  3. 使用JavaScript,加载翻译后的字段。

我们还将另外以OpenVAS漏洞为例翻译搜索结果,该漏洞虽然不适用于翻译系统本身,但却可以很好地补充总体情况。

每个对Splunk当前问题感兴趣的人,我们邀请您加入Telegram (@SplunkRU)中的频道。

因此,让我们继续练习。

在Splunk中创建新的语言环境


让我提醒您,默认是在Splunk中使用en-US语言环境,您可以在浏览器行中进行验证:MYSERVER:8000 / en-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:



创建一个具有适当语言环境的文件夹,然后将我们的文件复制到此处,分别将它们重命名为messages.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 / zh-cn / app / testapp / search



js脚本


下一步是编写一个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")); }); 

制作仪表板


创建一个新的仪表板并添加到其中(最后是懒惰的仪表板源):

  • 输入文字-名称:count,令牌:t_count
  • 输入文字-名称:openvasTitle,令牌:t_openvasTitle
  • 输入文字-名称:签名,令牌:t_signature
  • 输入文字-名称:说明,令牌:t_description

表格*令牌在没有输入的情况下将无法使用,这将不允许将仪表板的完整状态传输到URL。 为了使它们不会出现残酷的眼睛,请为每个变量添加“ depends =“ $ none $”。

面板,统计表-标题:$ 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或description),则文本(“ 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-DE:



标准Splunk界面的翻译


Splunk界面的翻译方式相同-您需要将$ SPLUNK_HOME / lib / python2.7 / site-packages / splunk / appserver / mrsparkle / locale / messages.pot文件传输到poeditor,然后将两个结果文件(messages.mo和messages.po)复制到文件夹:$ SPLUNK_HOME / lib / python2.7 / site-packages / splunk / appserver / mrsparkle /语言环境/ 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

创建人: Dmitry 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/zh-CN464675/


All Articles