
在本文中,我们将考虑本地化Splunk应用程序(包括Search应用程序的标准元素)的接口的主要机制-gettext国际化和本地化(i18n)。
翻译的机会:
- Splunk界面
- 仪表板(面板标题和输入字段);
- 根据当前语言环境选择静态资源(图像,CSS等),例如:logo-en_RU.gif或logo-en_GB.gif。
对于本地化,您需要执行一些步骤:
- 在Splunk中创建新的语言环境(如有必要)。
- 生成翻译词典文件。
- 使用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");
制作仪表板
创建一个新的仪表板并添加到其中(最后是懒惰的仪表板源):
- 输入文字-名称: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。

结果,我们有了一个仪表板

局限性
有两个限制要注意:
- 您无法翻译仪表板标题。
- 您不能在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/TranslateSplunkdocs.splunk.com/Documentation/Splunk/7.2.6/Viz/tokenssplunkonbigdata.com/2018/11/01/creating-a-splunk-localeanswers.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>