Browse Source

Update luci

NYNEX 6 years ago
parent
commit
b12f8eef88
100 changed files with 7625 additions and 638 deletions
  1. 5 0
      package/luci/.buildpath
  2. 221 0
      package/luci/.cproject
  3. 78 0
      package/luci/.project
  4. 4 6
      package/luci/applications/luci-app-adblock/Makefile
  5. 45 3
      package/luci/applications/luci-app-adblock/luasrc/controller/adblock.lua
  6. 0 63
      package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock.lua
  7. 52 0
      package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
  8. 39 0
      package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
  9. 237 0
      package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
  10. 51 0
      package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
  11. 10 0
      package/luci/applications/luci-app-adblock/luasrc/view/adblock/config_css.htm
  12. 14 0
      package/luci/applications/luci-app-adblock/luasrc/view/adblock/logread.htm
  13. 65 0
      package/luci/applications/luci-app-adblock/luasrc/view/adblock/query.htm
  14. 10 0
      package/luci/applications/luci-app-adblock/luasrc/view/adblock/runtime.htm
  15. 337 0
      package/luci/applications/luci-app-adblock/po/it/adblock.po
  16. 273 76
      package/luci/applications/luci-app-adblock/po/ja/adblock.po
  17. 338 35
      package/luci/applications/luci-app-adblock/po/pt-br/adblock.po
  18. 301 29
      package/luci/applications/luci-app-adblock/po/sv/adblock.po
  19. 226 19
      package/luci/applications/luci-app-adblock/po/templates/adblock.pot
  20. 297 31
      package/luci/applications/luci-app-adblock/po/zh-cn/adblock.po
  21. 20 0
      package/luci/applications/luci-app-advanced-reboot/Makefile
  22. 35 0
      package/luci/applications/luci-app-advanced-reboot/README.md
  23. 120 0
      package/luci/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua
  24. 92 0
      package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm
  25. 29 0
      package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/alternative_reboot.htm
  26. 25 0
      package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/power_off.htm
  27. 108 0
      package/luci/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po
  28. 102 0
      package/luci/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot
  29. 5 1
      package/luci/applications/luci-app-ahcp/po/sv/ahcp.po
  30. 208 0
      package/luci/applications/luci-app-aria2/po/sv/aria2.po
  31. 11 0
      package/luci/applications/luci-app-attendedsysupgrade/Makefile
  32. 5 0
      package/luci/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua
  33. 376 0
      package/luci/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
  34. 18 0
      package/luci/applications/luci-app-bcp38/Makefile
  35. 7 0
      package/luci/applications/luci-app-bcp38/luasrc/controller/bcp38.lua
  36. 60 0
      package/luci/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua
  37. 45 0
      package/luci/applications/luci-app-bcp38/po/sv/bcp38.po
  38. 45 0
      package/luci/applications/luci-app-bcp38/po/templates/bcp38.pot
  39. 52 0
      package/luci/applications/luci-app-bcp38/po/zh-cn/bcp38.po
  40. 11 0
      package/luci/applications/luci-app-bcp38/root/etc/uci-defaults/60_luci-bcp38
  41. 18 0
      package/luci/applications/luci-app-clamav/Makefile
  42. 22 0
      package/luci/applications/luci-app-clamav/luasrc/controller/clamav.lua
  43. 178 0
      package/luci/applications/luci-app-clamav/luasrc/model/cbi/clamav.lua
  44. 130 0
      package/luci/applications/luci-app-clamav/po/ja/clamav.po
  45. 119 0
      package/luci/applications/luci-app-clamav/po/sv/clamav.po
  46. 119 0
      package/luci/applications/luci-app-clamav/po/templates/clamav.pot
  47. 131 0
      package/luci/applications/luci-app-clamav/po/zh-cn/clamav.po
  48. 2 0
      package/luci/applications/luci-app-commands/Makefile
  49. 55 14
      package/luci/applications/luci-app-commands/luasrc/controller/commands.lua
  50. 9 6
      package/luci/applications/luci-app-commands/luasrc/view/commands.htm
  51. 50 0
      package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm
  52. 21 3
      package/luci/applications/luci-app-commands/po/ca/commands.po
  53. 18 3
      package/luci/applications/luci-app-commands/po/cs/commands.po
  54. 21 3
      package/luci/applications/luci-app-commands/po/de/commands.po
  55. 18 3
      package/luci/applications/luci-app-commands/po/el/commands.po
  56. 27 5
      package/luci/applications/luci-app-commands/po/en/commands.po
  57. 21 3
      package/luci/applications/luci-app-commands/po/es/commands.po
  58. 21 3
      package/luci/applications/luci-app-commands/po/fr/commands.po
  59. 18 3
      package/luci/applications/luci-app-commands/po/he/commands.po
  60. 21 3
      package/luci/applications/luci-app-commands/po/hu/commands.po
  61. 21 3
      package/luci/applications/luci-app-commands/po/it/commands.po
  62. 22 4
      package/luci/applications/luci-app-commands/po/ja/commands.po
  63. 18 3
      package/luci/applications/luci-app-commands/po/ms/commands.po
  64. 21 3
      package/luci/applications/luci-app-commands/po/no/commands.po
  65. 21 3
      package/luci/applications/luci-app-commands/po/pl/commands.po
  66. 20 20
      package/luci/applications/luci-app-commands/po/pt-br/commands.po
  67. 21 3
      package/luci/applications/luci-app-commands/po/pt/commands.po
  68. 21 3
      package/luci/applications/luci-app-commands/po/ro/commands.po
  69. 21 3
      package/luci/applications/luci-app-commands/po/ru/commands.po
  70. 18 3
      package/luci/applications/luci-app-commands/po/sk/commands.po
  71. 45 26
      package/luci/applications/luci-app-commands/po/sv/commands.po
  72. 18 3
      package/luci/applications/luci-app-commands/po/templates/commands.pot
  73. 18 3
      package/luci/applications/luci-app-commands/po/tr/commands.po
  74. 18 3
      package/luci/applications/luci-app-commands/po/uk/commands.po
  75. 18 3
      package/luci/applications/luci-app-commands/po/vi/commands.po
  76. 26 7
      package/luci/applications/luci-app-commands/po/zh-cn/commands.po
  77. 21 3
      package/luci/applications/luci-app-commands/po/zh-tw/commands.po
  78. 1 1
      package/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po
  79. 17 0
      package/luci/applications/luci-app-cshark/Makefile
  80. 125 0
      package/luci/applications/luci-app-cshark/luasrc/controller/cshark.lua
  81. 30 0
      package/luci/applications/luci-app-cshark/luasrc/model/cbi/admin_network/cshark.lua
  82. 291 0
      package/luci/applications/luci-app-cshark/luasrc/view/cshark.htm
  83. 2 2
      package/luci/applications/luci-app-ddns/Makefile
  84. 5 7
      package/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua
  85. 233 174
      package/luci/applications/luci-app-ddns/po/it/ddns.po
  86. 724 0
      package/luci/applications/luci-app-ddns/po/sv/ddns.po
  87. 4 2
      package/luci/applications/luci-app-diag-core/po/sv/diag_core.po
  88. 44 44
      package/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po
  89. 13 0
      package/luci/applications/luci-app-dnscrypt-proxy/Makefile
  90. 32 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/controller/dnscrypt-proxy.lua
  91. 37 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/cfg_dnsmasq_tab.lua
  92. 39 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/configuration_tab.lua
  93. 177 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/overview_tab.lua
  94. 13 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/config_css.htm
  95. 15 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/logread.htm
  96. 10 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/res_options.htm
  97. 15 0
      package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/view_reslist.htm
  98. 232 0
      package/luci/applications/luci-app-dnscrypt-proxy/po/ja/dnscrypt-proxy.po
  99. 191 0
      package/luci/applications/luci-app-dnscrypt-proxy/po/templates/dnscrypt-proxy.pot
  100. 11 0
      package/luci/applications/luci-app-dnscrypt-proxy/root/etc/uci-defaults/60_luci-dnscrypt-proxy

+ 5 - 0
package/luci/.buildpath

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<buildpath>
+	<buildpathentry kind="src" path="src"/>
+	<buildpathentry kind="con" path="org.eclipse.dltk.launching.INTERPRETER_CONTAINER"/>
+</buildpath>

+ 221 - 0
package/luci/.cproject

@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject>
+<storageModule moduleId="org.eclipse.cdt.core.settings">
+<cconfiguration id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341">
+<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+<configuration artifactName="luci" buildProperties="" description="" id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341" name="Preference Configuration" parent="org.eclipse.cdt.build.core.prefbase.cfg">
+<folderInfo id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341." name="/" resourcePath="">
+<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.407447051" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
+<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.407447051.1470931541" name=""/>
+<builder id="org.eclipse.cdt.build.core.settings.default.builder.823611263" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
+<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1685234798" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
+<tool id="org.eclipse.cdt.build.core.settings.holder.570824141" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.491129717" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
+</option>
+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.858094059" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+</tool>
+<tool id="org.eclipse.cdt.build.core.settings.holder.344617955" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.564526987" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
+</option>
+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1426860237" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+</tool>
+<tool id="org.eclipse.cdt.build.core.settings.holder.869454750" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.838425449" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
+</option>
+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1755775295" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+</tool>
+</toolChain>
+</folderInfo>
+</configuration>
+</storageModule>
+<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341" moduleId="org.eclipse.cdt.core.settings" name="Preference Configuration">
+<externalSettings/>
+<extensions>
+<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+</extensions>
+</storageModule>
+<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+<storageModule moduleId="scannerConfiguration">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<scannerConfigBuildInfo instanceId="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+</scannerConfigBuildInfo>
+</storageModule>
+</cconfiguration>
+</storageModule>
+<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+<project id="luci.null.949486034" name="luci"/>
+</storageModule>
+</cproject>

+ 78 - 0
package/luci/.project

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>luci</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>?name?</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildArguments</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.contents</key>
+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.dltk.lua.core.nature</nature>
+	</natures>
+</projectDescription>

+ 4 - 6
package/luci/applications/luci-app-adblock/Makefile

@@ -1,14 +1,12 @@
-# Copyright (C) 2016 Openwrt.org
-#
-# This is free software, licensed under the Apache License, Version 2.0 .
-#
+# Copyright 2017 Dirk Brenken (dev@brenken.org)
+# This is free software, licensed under the Apache License, Version 2.0
 
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI support for Adblock
-LUCI_DEPENDS:=+adblock
+LUCI_DEPENDS:=+adblock +luci-lib-jsonc
 LUCI_PKGARCH:=all
 
 include ../../luci.mk
 
-# call BuildPackage - OpenWrt buildroot signature
+# call BuildPackage - OpenWrt buildroot signature

+ 45 - 3
package/luci/applications/luci-app-adblock/luasrc/controller/adblock.lua

@@ -1,12 +1,54 @@
--- Copyright 2016 Openwrt.org
--- Licensed to the public under the Apache License 2.0.
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
 
 module("luci.controller.adblock", package.seeall)
 
+local fs    = require("nixio.fs")
+local util  = require("luci.util")
+local templ = require("luci.template")
+local i18n  = require("luci.i18n")
+
 function index()
 	if not nixio.fs.access("/etc/config/adblock") then
 		return
 	end
+	entry({"admin", "services", "adblock"}, firstchild(), _("Adblock"), 30).dependent = false
+	entry({"admin", "services", "adblock", "tab_from_cbi"}, cbi("adblock/overview_tab", {hideresetbtn=true, hidesavebtn=true}), _("Overview"), 10).leaf = true
+	entry({"admin", "services", "adblock", "logfile"}, call("logread"), _("View Logfile"), 20).leaf = true
+	entry({"admin", "services", "adblock", "advanced"}, firstchild(), _("Advanced"), 100)
+	entry({"admin", "services", "adblock", "advanced", "blacklist"}, cbi("adblock/blacklist_tab"), _("Edit Blacklist"), 110).leaf = true
+	entry({"admin", "services", "adblock", "advanced", "whitelist"}, cbi("adblock/whitelist_tab"), _("Edit Whitelist"), 120).leaf = true
+	entry({"admin", "services", "adblock", "advanced", "configuration"}, cbi("adblock/configuration_tab"), _("Edit Configuration"), 130).leaf = true
+	entry({"admin", "services", "adblock", "advanced", "query"}, template("adblock/query"), _("Query domains"), 140).leaf = true
+	entry({"admin", "services", "adblock", "advanced", "result"}, call("queryData"), nil, 150).leaf = true
+end
 
-	entry({"admin", "services", "adblock"}, cbi("adblock"), _("Adblock"), 40)
+function logread()
+	local logfile
+
+	if nixio.fs.access("/var/log/messages") then
+		logfile = util.trim(util.exec("cat /var/log/messages | grep 'adblock'"))
+	else
+		logfile = util.trim(util.exec("logread -e 'adblock'"))
+	end
+	templ.render("adblock/logread", {title = i18n.translate("Adblock Logfile"), content = logfile})
+end
+
+function queryData(domain)
+	if domain and domain:match("^[a-zA-Z0-9%-%._]+$") then
+		luci.http.prepare_content("text/plain")
+		local cmd = "/etc/init.d/adblock query %q 2>&1"
+		local util = io.popen(cmd % domain)
+		if util then
+			while true do
+				local line = util:read("*l")
+				if not line then
+					break
+				end
+				luci.http.write(line)
+				luci.http.write("\n")
+			end
+			util:close()
+		end
+	end
 end

+ 0 - 63
package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock.lua

@@ -1,63 +0,0 @@
--- Copyright 2016 Hannu Nyman
--- Licensed to the public under the Apache License 2.0.
-
-m = Map("adblock", translate("Adblock"),
-	translate("Configuration of the adblock package to block ad/abuse domains by using DNS."))
-
--- General options
-
-s = m:section(NamedSection, "global", "adblock", translate("Global options"))
-
-o1 = s:option(Flag, "adb_enabled", translate("Enable adblock"))
-o1.rmempty = false
-o1.default = 0
-
-o3 = s:option(Value, "adb_whitelist", translate("Whitelist file"),
-     translate("File with whitelisted hosts/domains that are allowed despite being on a blocklist."))
-o3.rmempty = false
-o3.datatype = "file"
-
--- Blocklist options
-
-bl = m:section(TypedSection, "source", translate("Blocklist sources"),
-	translate("Available blocklist sources (")
-	.. [[<a href="https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md" target="_blank">]]
-	.. translate("see list details")
-	.. [[</a>]]
-	.. translate("). Note that list URLs and Shallalist category selections are not configurable via Luci."))
-bl.template = "cbi/tblsection"
-
-name = bl:option(Flag, "enabled", translate("Enabled"))
-name.rmempty  = false
-
-des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
-
--- Additional options
-
-s2 = m:section(NamedSection, "global", "adblock", translate("Backup options"))
-
-o4 = s2:option(Flag, "adb_backup", translate("Enable blocklist backup"))
-o4.rmempty = false
-o4.default = 0
-
-o5 = s2:option(Value, "adb_backupdir", translate("Backup directory"))
-o5.rmempty = false
-o5.datatype = "directory"
-
--- Extra options
-
-e = m:section(NamedSection, "global", "adblock", translate("Extra options"),
-	translate("Options for further tweaking in case the defaults are not suitable for you."))
-
-a = e:option(Flag, "adb_debug", translate("Enable verbose debug logging"))
-a.default = a.disabled
-a.rmempty = false
-
-a = e:option(Value, "adb_iface", translate("Restrict reload trigger to certain interface(s)"),
-	translate("Space separated list of wan interfaces that trigger reload action. " ..
-		"To disable reload trigger set it to 'false'. Default: empty"))
-a.datatype = "network"
-a.rmempty = true
-
-return m
-

+ 52 - 0
package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua

@@ -0,0 +1,52 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local uci = require("uci")
+local adbinput = uci.get("adblock", "blacklist", "adb_src" or "/etc/adblock/adblock.blacklist")
+
+if not nixio.fs.access(adbinput) then
+	m = SimpleForm("error", nil,
+		translate("Input file not found, please check your configuration."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+if nixio.fs.stat(adbinput).size > 524288 then
+	m = SimpleForm("error", nil,
+		translate("The file size is too large for online editing in LuCI (&gt; 512 KB). ")
+		.. translate("Please edit this file directly in a terminal session."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+	translatef("This form allows you to modify the content of the adblock blacklist (%s).<br />", adbinput)
+	.. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
+
+f = s:option(TextValue, "data")
+f.datatype = "string"
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+	return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+	return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+	return true
+end
+
+return m

+ 39 - 0
package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua

@@ -0,0 +1,39 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local adbinput = "/etc/config/adblock"
+
+if not nixio.fs.access(adbinput) then
+	m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+	translate("This form allows you to modify the content of the main adblock configuration file (/etc/config/adblock)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+	return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+	return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+	return true
+end
+
+return m

+ 237 - 0
package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua

@@ -0,0 +1,237 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs       = require("nixio.fs")
+local uci      = require("luci.model.uci").cursor()
+local sys      = require("luci.sys")
+local util     = require("luci.util")
+local dump     = util.ubus("network.interface", "dump", {})
+local json     = require("luci.jsonc")
+local adbinput = uci.get("adblock", "global", "adb_rtfile") or "/tmp/adb_runtime.json"
+
+if not uci:get_first("adblock", "adblock", "adb_trigger") then
+	m = SimpleForm("error", nil, translate("Please update your adblock config file to use this package. ")
+	.. translatef("In OPKG use the '--force-maintainer' option to overwrite the pre-existing config file or download a fresh default config from "
+	.. "<a href=\"%s\" target=\"_blank\">"
+	.. "here</a>", "https://raw.githubusercontent.com/openwrt/packages/master/net/adblock/files/adblock.conf"))
+	m.submit = false
+	m.reset = false
+	return m
+end
+
+m = Map("adblock", translate("Adblock"),
+	translate("Configuration of the adblock package to block ad/abuse domains by using DNS. ")
+	.. translatef("For further information "
+	.. "<a href=\"%s\" target=\"_blank\">"
+	.. "see online documentation</a>", "https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md"))
+
+function m.on_after_commit(self)
+	function e4.validate(self, value)
+		if value == "0" then
+			luci.sys.call("/etc/init.d/adblock reload >/dev/null 2>&1")
+		else
+			luci.sys.call("/etc/init.d/adblock start >/dev/null 2>&1")
+		end
+	end
+	luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
+end
+
+-- Main adblock options
+
+s = m:section(NamedSection, "global", "adblock")
+
+local parse = json.parse(fs.readfile(adbinput) or "")
+if parse then
+	status  = parse.data.adblock_status
+	version = parse.data.adblock_version
+	domains = parse.data.blocked_domains
+	fetch   = parse.data.fetch_utility
+	backend = parse.data.dns_backend
+	rundate = parse.data.last_rundate
+end
+
+o1 = s:option(Flag, "adb_enabled", translate("Enable Adblock"))
+o1.default = o1.disabled
+o1.rmempty = false
+
+btn = s:option(Button, "", translate("Suspend / Resume Adblock"))
+if parse and status == "enabled" then
+	btn.inputtitle = translate("Suspend")
+	btn.inputstyle = "reset"
+	btn.disabled = false
+	function btn.write()
+		luci.sys.call("/etc/init.d/adblock suspend >/dev/null 2>&1")
+		luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
+	end
+elseif parse and status == "paused" then
+	btn.inputtitle = translate("Resume")
+	btn.inputstyle = "apply"
+	btn.disabled = false
+	function btn.write()
+		luci.sys.call("/etc/init.d/adblock resume >/dev/null 2>&1")
+		luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
+	end
+else
+	btn.inputtitle = translate("-------")
+	btn.inputstyle = "button"
+	btn.disabled = true
+end
+
+o2 = s:option(ListValue, "adb_dns", translate("DNS Backend (DNS Directory)"),
+	translate("List of supported DNS backends with their default list export directory.<br />")
+	.. translate("To overwrite the default path use the 'DNS Directory' option in the extra section below."))
+o2:value("dnsmasq", "dnsmasq (/tmp/dnsmasq.d)")
+o2:value("unbound", "unbound (/var/lib/unbound)")
+o2:value("named", "bind (/var/lib/bind)")
+o2:value("kresd", "kresd (/etc/kresd)")
+o2:value("dnscrypt-proxy","dnscrypt-proxy (/tmp)")
+o2.default = "dnsmasq"
+o2.rmempty = false
+
+o3 = s:option(ListValue, "adb_trigger", translate("Startup Trigger"),
+	translate("List of available network interfaces. By default the startup will be triggered by the 'wan' interface.<br />")
+	.. translate("Choose 'none' to disable automatic startups, 'timed' to use a classic timeout (default 30 sec.) or select another trigger interface."))
+o3:value("none")
+o3:value("timed")
+if dump then
+	local i, v
+	for i, v in ipairs(dump.interface) do
+		if v.interface ~= "loopback" then
+			o3:value(v.interface)
+		end
+	end
+end
+o3.rmempty = false
+
+-- Runtime information
+
+ds = s:option(DummyValue, "", translate("Runtime Information"))
+ds.template = "cbi/nullsection"
+
+dv1 = s:option(DummyValue, "", translate("Adblock Status"))
+dv1.template = "adblock/runtime"
+if parse == nil then
+	dv1.value = translate("n/a")
+else
+	if status == "error" then
+		dv1.value = translate("error")
+	elseif status == "disabled" then
+		dv1.value = translate("disabled")
+	elseif status == "paused" then
+		dv1.value = translate("paused")
+	else
+		dv1.value = translate("enabled")
+	end
+end
+
+dv2 = s:option(DummyValue, "", translate("Adblock Version"))
+dv2.template = "adblock/runtime"
+if parse == nil then
+	dv2.value = translate("n/a")
+else
+	dv2.value = version
+end
+
+dv3 = s:option(DummyValue, "", translate("Download Utility (SSL Library)"),
+	translate("For SSL protected blocklist sources you need a suitable SSL library, e.g. 'libustream-ssl' or the wget 'built-in'."))
+dv3.template = "adblock/runtime"
+if parse == nil then
+	dv3.value = translate("n/a")
+else
+	dv3.value = fetch
+end
+
+dv4 = s:option(DummyValue, "", translate("DNS Backend (DNS Directory)"))
+dv4.template = "adblock/runtime"
+if parse == nil then
+	dv4.value = translate("n/a")
+else
+	dv4.value = backend
+end
+
+dv5 = s:option(DummyValue, "", translate("Overall Blocked Domains"))
+dv5.template = "adblock/runtime"
+if parse == nil then
+	dv5.value = translate("n/a")
+else
+	dv5.value = domains
+end
+
+dv6 = s:option(DummyValue, "", translate("Last Run"))
+dv6.template = "adblock/runtime"
+if parse == nil then
+	dv6.value = translate("n/a")
+else
+	dv6.value = rundate
+end
+
+-- Blocklist table
+
+bl = m:section(TypedSection, "source", translate("Blocklist Sources"),
+	translate("Available blocklist sources. ")
+	.. translate("List URLs and Shallalist category selections are configurable in the 'Advanced' section.<br />")
+	.. translate("Caution: Please don't select big lists or many lists at once on low memory devices to prevent OOM exceptions!"))
+bl.template = "cbi/tblsection"
+
+name = bl:option(Flag, "enabled", translate("Enabled"))
+name.rmempty = false
+
+ssl = bl:option(DummyValue, "adb_src", translate("SSL req."))
+function ssl.cfgvalue(self, section)
+	local source = self.map:get(section, "adb_src")
+	if source and source:match("https://") then
+		return translate("Yes")
+	else
+		return translate("No")
+	end
+end
+
+des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
+
+-- Extra options
+
+e = m:section(NamedSection, "global", "adblock", translate("Extra Options"),
+	translate("Options for further tweaking in case the defaults are not suitable for you."))
+
+e1 = e:option(Flag, "adb_debug", translate("Verbose Debug Logging"),
+	translate("Enable verbose debug logging in case of any processing error."))
+e1.default = e1.disabled
+e1.rmempty = false
+
+e2 = e:option(Flag, "adb_forcedns", translate("Force Local DNS"),
+	translate("Redirect all DNS queries from 'lan' zone to the local resolver."))
+e2.default = e2.disabled
+e2.rmempty = false
+
+e3 = e:option(Flag, "adb_forcesrt", translate("Force Overall Sort"),
+	translate("Enable memory intense overall sort / duplicate removal on low memory devices (&lt; 64 MB RAM)"))
+e3.default = e3.disabled
+e3.rmempty = false
+
+e4 = e:option(Flag, "adb_manmode", translate("Manual / Backup mode"),
+	translate("Do not automatically update blocklists during startup, use blocklist backups instead."))
+e4.default = e4.disabled
+e4.rmempty = false
+
+e5 = e:option(Flag, "adb_backup", translate("Enable Blocklist Backup"),
+	translate("Create compressed blocklist backups, they will be used in case of download errors or during startup in manual mode."))
+e5.default = e5.disabled
+e5.rmempty = false
+
+e6 = e:option(Value, "adb_backupdir", translate("Backup Directory"),
+	translate("Target directory for adblock backups. Please use only non-volatile disks, no ram/tmpfs drives."))
+e6.datatype = "directory"
+e6.default = "/mnt"
+e6.rmempty = false
+
+e7 = e:option(Value, "adb_dnsdir", translate("DNS Directory"),
+	translate("Target directory for the generated blocklist 'adb_list.overall'."))
+e7.datatype = "directory"
+e7.optional = true
+
+e8 = e:option(Value, "adb_triggerdelay", translate("Trigger Delay"),
+	translate("Additional trigger delay in seconds before adblock processing begins."))
+e8.datatype = "range(1,60)"
+e8.optional = true
+
+return m

+ 51 - 0
package/luci/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua

@@ -0,0 +1,51 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local uci = require("uci")
+local adbinput = uci.get("adblock", "global", "adb_whitelist") or "/etc/adblock/adblock.whitelist"
+
+if not nixio.fs.access(adbinput) then
+	m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+if nixio.fs.stat(adbinput).size > 524288 then
+	m = SimpleForm("error", nil,
+	translate("The file size is too large for online editing in LuCI (&gt; 512 KB). ")
+	.. translate("Please edit this file directly in a terminal session."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+	translatef("This form allows you to modify the content of the adblock whitelist (%s).<br />", adbinput)
+	.. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
+
+f = s:option(TextValue, "data")
+f.datatype = "string"
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+	return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+	return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+	return true
+end
+
+return m

+ 10 - 0
package/luci/applications/luci-app-adblock/luasrc/view/adblock/config_css.htm

@@ -0,0 +1,10 @@
+<style type="text/css">
+	textarea
+	{
+		border: 1px solid #cccccc;
+		padding: 5px;
+		font-size: 12px;
+		font-family: monospace;
+		resize: none;
+	}
+</style>

+ 14 - 0
package/luci/applications/luci-app-adblock/luasrc/view/adblock/logread.htm

@@ -0,0 +1,14 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+	<fieldset class="cbi-section">
+		<div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for adblock related messages only.%></div>
+		<textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
+	</fieldset>
+</div>
+<%+footer%>

+ 65 - 0
package/luci/applications/luci-app-adblock/luasrc/view/adblock/query.htm

@@ -0,0 +1,65 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+	var stxhr = new XHR();
+
+	function update_status(data)
+	{
+		var domain = data.value;
+		var input = document.getElementById('query_input');
+		var output = document.getElementById('query_output');
+
+		if (input && output)
+		{
+			output.innerHTML =
+				'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
+				'<%:Waiting for command to complete...%>'
+			;
+			input.parentNode.style.display = 'block';
+			input.style.display = 'inline';
+			stxhr.post('<%=luci.dispatcher.build_url('admin/services/adblock/advanced/result/')%>' + domain, { token: '<%=token%>' },
+				function(x)
+				{
+					if (x.responseText)
+					{
+						input.style.display = 'none';
+						output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
+					}
+					else
+					{
+						input.style.display = 'none';
+						output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>';
+					}
+				}
+			);
+		}
+	}
+//]]>
+</script>
+
+<form method="post" action="<%=REQUEST_URI%>">
+	<div class="cbi-map">
+		<fieldset class="cbi-section">
+			<div class="cbi-section-descr"><%:This form allows you to query active block lists for certain domains, e.g. for whitelisting.%></div>
+			<div style="width:33%; float:left;">
+				<input style="margin: 5px 0" type="text" value="www.lede-project.org" name="input" />
+				<input type="button" value="<%:Query%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.input)" />
+			</div>
+			<br style="clear:both" />
+			<br />
+		</fieldset>
+	</div>
+	<fieldset class="cbi-section" style="display:none">
+		<legend id="query_input"><%:Collecting data...%></legend>
+		<span id="query_output"></span>
+	</fieldset>
+</form>
+
+<%+footer%>

+ 10 - 0
package/luci/applications/luci-app-adblock/luasrc/view/adblock/runtime.htm

@@ -0,0 +1,10 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+cbi/valueheader%>
+
+<input name="runtime" id="runtime" type="text" class="cbi-input-text" style="border:none;box-shadow:none;background:transparent;color:#0069d6;" value="<%=self:cfgvalue(section)%>" disabled="disabled" />
+
+<%+cbi/valuefooter%>

+ 337 - 0
package/luci/applications/luci-app-adblock/po/it/adblock.po

@@ -0,0 +1,337 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 17/09/2017\n"
+"Last-Translator: Bubu83 <bubu83@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.3\n"
+"Language: it\n"
+
+msgid "-------"
+msgstr ""
+
+msgid "Adblock"
+msgstr "Adblock"
+
+msgid "Adblock Logfile"
+msgstr "Registro Adblock"
+
+msgid "Adblock Status"
+msgstr "Status Adblock"
+
+msgid "Adblock Version"
+msgstr "Versione Adblock"
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr "Tempo addizionale in secondi di attesa prima che adblock si avvii."
+
+msgid "Advanced"
+msgstr "Avanzato"
+
+msgid "Available blocklist sources."
+msgstr "Fonti lista di blocco disponibili."
+
+msgid "Backup Directory"
+msgstr "Directory del Backup"
+
+msgid "Blocklist Sources"
+msgstr "Fonti lista di Blocco"
+
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+"Attenzione: Per favore non selezionare grandi liste o molte liste alla volta "
+"su dispositivi con poca memoria per prevenire errori OOM!"
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
+msgstr ""
+"Scegli 'none' per disabilitare l'avvio automatico, 'timed' per usare un "
+"classico timeout (default 30 sec.) o seleziona un'altra interfaccia di avvio."
+
+msgid "Collecting data..."
+msgstr "Raccogliendo dati..."
+
+msgid ""
+"Configuration of the adblock package to block ad/abuse domains by using DNS."
+msgstr ""
+"Configurazione del pacchetto adblock per bloccare domini pubblicità/abuso "
+"usando i DNS."
+
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+"Crea i backup compressi delle liste di blocco, saranno usati in caso di "
+"errori di download o durante l'avvio in modalità manuale."
+
+msgid "DNS Backend (DNS Directory)"
+msgstr ""
+
+msgid "DNS Directory"
+msgstr "Directory DNS"
+
+msgid "Description"
+msgstr "Descrizione"
+
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
+msgstr ""
+"Non aggiornare automaticamente le liste durante l'avvio, usa invece i backup "
+"della lista di blocco."
+
+msgid "Download Utility (SSL Library)"
+msgstr ""
+
+msgid "Edit Blacklist"
+msgstr "Modifica Lista Nera"
+
+msgid "Edit Configuration"
+msgstr "Modifica Configurazione"
+
+msgid "Edit Whitelist"
+msgstr "Modifica Lista Bianca"
+
+msgid "Enable Adblock"
+msgstr "Attiva Adblock"
+
+msgid "Enable Blocklist Backup"
+msgstr "Attiva Backup Lista di Blocco"
+
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+"Attiva l'ordinamento globale / rimozione duplicati stressante per la memoria "
+"su dispositivi con poca memoria (&lt; 64 MB RAM)"
+
+msgid "Enable verbose debug logging in case of any processing error."
+msgstr ""
+"Abilita il registro dettagliato in caso di qualsiasi errore di processo."
+
+msgid "Enabled"
+msgstr "Abilitato"
+
+msgid "Extra Options"
+msgstr "Opzioni Extra"
+
+msgid ""
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
+msgstr ""
+"Per le fonti delle liste protette da SSL hai bisogno di una libreria SSL "
+"adatta, p.e. 'libustream-ssl' o wget 'built-in'."
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"Per ulteriori informazioni <a href=\"%s\" target=\"_blank\">vedi "
+"documentazione online</a>"
+
+msgid "Force Local DNS"
+msgstr "Forza DNS Locale"
+
+msgid "Force Overall Sort"
+msgstr "Forza Ordinamento Globale"
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+"In OPKG usa l'opzione '--force-maintainer' per sovrascrivere il pre-"
+"esistente file di configurazione o scarica una nuova configurazione di "
+"default da <a href=\"%s\" target=\"_blank\">qui</a>"
+
+msgid "Input file not found, please check your configuration."
+msgstr "File di input non trovato, per favore controlla la tua configurazione."
+
+msgid "Invalid domain specified!"
+msgstr "Dominio invalido specificato!"
+
+msgid "Last Run"
+msgstr "Ultimo Avvio"
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+"Le selezioni degli URL delle liste e categorie Shallalist sono configurabili "
+"nella sezione 'Avanzato'.<br />"
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+"Lista delle interfacce di rete disponibili. Per default l'avvio sarà "
+"innescato dall'interfaccia 'wan'.<br />"
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+"Lista dei backend DNS supportati con la loro directory di default di esporto "
+"della lista.<br />"
+
+msgid "Loading"
+msgstr "Caricando"
+
+msgid "Manual / Backup mode"
+msgstr "Modalità Manuale / Backup"
+
+msgid "No"
+msgstr "No"
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr ""
+"Opzioni per ulteriori modifiche in caso che quelle di default non ti sono "
+"adatte."
+
+msgid "Overall Blocked Domains"
+msgstr "Totale Domini Bloccati"
+
+msgid "Overview"
+msgstr "Riassunto"
+
+msgid ""
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+"Per favore aggiungi solo un dominio per linea. I commenti introdotti con '#' "
+"sono consentiti - indirizzi ip , jolly e regex non lo sono."
+
+msgid "Please edit this file directly in a terminal session."
+msgstr ""
+"Per favore modifica questo file direttamente in una sessione al terminale."
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+"Per favore aggiorna il tuo file configurazione di adblock per usare questo "
+"pacchetto."
+
+msgid "Query"
+msgstr "Interrogazione"
+
+msgid "Query domains"
+msgstr "Interrogazione domini"
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+"Reindirizza tutte le richieste DNS dalla zona 'lan' al risolvitore locale."
+
+msgid "Resume"
+msgstr "Riprendi"
+
+msgid "Runtime Information"
+msgstr "Informazione di Runtime"
+
+msgid "SSL req."
+msgstr "Ric. SSL"
+
+msgid "Save"
+msgstr "Salva"
+
+msgid "Startup Trigger"
+msgstr "Innesco d'Avvio"
+
+msgid "Suspend"
+msgstr "Sospendi"
+
+msgid "Suspend / Resume Adblock"
+msgstr "Sospendi / Riprendi Adblock"
+
+msgid ""
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
+msgstr ""
+"Directory per i backup di adblock. Per favore usa solo dischi non volatili, "
+"non dischi ram/tmpfs."
+
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr "Directory per la lista di blocco generata 'adb_list.overall'."
+
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr ""
+"La grandezza del file è troppo grande per modificarla online in LuCI (&gt; "
+"512 KB)."
+
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+"Questo form ti consente di modificare il contenuto della lista nera di "
+"adblock (%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+"Questo form ti consente di modificare il contenuto della lista bianca di "
+"adblock (%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+"Questo form ti consente di modificare il contenuto del file principale di "
+"configurazione di adblock (/etc/config/adblock)."
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+"Questo form ti consente di interrogare le liste di blocco attive per "
+"determinati domini, p.e. per metterli nella lista bianca."
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
+msgstr ""
+"Questo form mostra l'output del registro, prefiltrato per messaggi relativi "
+"solo ad adblock."
+
+msgid ""
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+"Per sovrascrivere il percorso di default usa l'opzione 'Directory DNS' nella "
+"sezione aggiuntiva sotto."
+
+msgid "Trigger Delay"
+msgstr "Ritardo Innesco"
+
+msgid "Verbose Debug Logging"
+msgstr "Registro di Debug Dettagliato"
+
+msgid "View Logfile"
+msgstr "Vedi Registro"
+
+msgid "Waiting for command to complete..."
+msgstr "Aspettando che il comando venga completato..."
+
+msgid "Yes"
+msgstr "Sì"
+
+msgid "disabled"
+msgstr "disabilitato"
+
+msgid "enabled"
+msgstr "abilitato"
+
+msgid "error"
+msgstr "errore"
+
+msgid "n/a"
+msgstr "n/d"
+
+msgid "paused"
+msgstr "in pausa"

+ 273 - 76
package/luci/applications/luci-app-adblock/po/ja/adblock.po

@@ -8,132 +8,329 @@ msgstr ""
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.11\n"
+"X-Generator: Poedit 2.0.3\n"
 "Language: ja\n"
 
-msgid ""
-"). Note that list URLs and Shallalist category selections are not "
-"configurable via Luci."
-msgstr ""
-")。これらのリストのURLおよびshallaリストのカテゴリー選択は、Luciによって設定"
-"できないことに注意します。"
+msgid "-------"
+msgstr "(利用不可)"
 
 msgid "Adblock"
 msgstr "Adblock"
 
-msgid "Available blocklist sources ("
-msgstr "利用可能なブロックリスト提供元です("
+msgid "Adblock Logfile"
+msgstr "Adblock ログファイル"
+
+msgid "Adblock Status"
+msgstr "Adblock ステータス"
+
+msgid "Adblock Version"
+msgstr "Adblock バージョン"
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr "Adblock の処理が開始されるまでの、追加の遅延時間(秒)です。"
+
+msgid "Advanced"
+msgstr "詳細設定"
 
-msgid "Backup directory"
-msgstr "バックアップ ディレクトリ"
+msgid "Available blocklist sources."
+msgstr "利用可能なブロックリスト提供元です。"
 
-msgid "Backup options"
-msgstr "バックアップ オプション"
+msgid "Backup Directory"
+msgstr "バックアップ先 ディレクトリ"
 
-msgid "Blocklist sources"
+msgid "Blocklist Sources"
 msgstr "ブロックリスト提供元"
 
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+"警告: メモリー容量の小さいデバイスでは OutOfMemory (OOM) 例外を防ぐため、大き"
+"いリストや一度にたくさんのリストを選択しないでください。"
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
+msgstr ""
+"自動スタートアップを無効にするには 'none' を、従来のタイムアウト(既定値: 30"
+"秒)を使用するには 'timed' を選択してください。または、他のトリガとなるイン"
+"ターフェースを選択してください。"
+
+msgid "Collecting data..."
+msgstr "データ収集中です..."
+
 msgid ""
 "Configuration of the adblock package to block ad/abuse domains by using DNS."
 msgstr ""
-"広告/不正ドメインをDNSを利用してブロックする、adblock パッケージの設定です。"
+"DNS の利用によって広告/不正ドメインをブロックする、Adblock パッケージの設定で"
+"す。"
+
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+"圧縮されたブロックリストのバックアップを作成します。これは、リストのダウン"
+"ロードがエラーの場合、またはマニュアル モードでサービスを起動時に使用されま"
+"す。"
+
+msgid "DNS Backend (DNS Directory)"
+msgstr "DNS バックエンド(DNS ディレクトリ)"
+
+msgid "DNS Directory"
+msgstr "DNS ディレクトリ"
 
 msgid "Description"
 msgstr "説明"
 
-msgid "Enable adblock"
-msgstr "adblockの有効化"
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
+msgstr ""
+"サービス起動時にブロックリストを自動的に更新せず、代わりにバックアップされた"
+"ブロックリストを使用します。"
+
+msgid "Download Utility (SSL Library)"
+msgstr "ダウンロード ユーティリティ(SSL ライブラリ)"
+
+msgid "Edit Blacklist"
+msgstr "ブラックリストの編集"
 
-msgid "Enable blocklist backup"
+msgid "Edit Configuration"
+msgstr "設定の編集"
+
+msgid "Edit Whitelist"
+msgstr "ホワイトリストの編集"
+
+msgid "Enable Adblock"
+msgstr "Adblock の有効化"
+
+msgid "Enable Blocklist Backup"
 msgstr "ブロックリスト バックアップの有効化"
 
-msgid "Enable verbose debug logging"
-msgstr "詳細なデバッグ ログの有効化"
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+"メモリー容量の少ないデバイス(RAM 64MB 未満)において、一時ファイル内の全体的"
+"なソート及び重複の除去を有効にします。"
+
+msgid "Enable verbose debug logging in case of any processing error."
+msgstr ""
+"何らかの処理エラーが発生した場合に、詳細なデバッグ ログを有効にします。"
 
 msgid "Enabled"
 msgstr "有効"
 
-msgid "Extra options"
-msgstr "拡張設定"
+msgid "Extra Options"
+msgstr "拡張オプション"
 
 msgid ""
-"File with whitelisted hosts/domains that are allowed despite being on a "
-"blocklist."
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
 msgstr ""
-"ファイルのホワイトリスト ホスト/ドメインは、ブロックリストに登録されていても"
-"許可されます。"
+"SSLで保護されているブロックリストの取得には、適切なSSL ライブラリが必要です。"
+"例: 'libustream-ssl' または wget 'built-in'"
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"詳細な情報は<a href=\"%s\" target=\"_blank\">オンライン ドキュメント</a>を確"
+"認してください。"
+
+msgid "Force Local DNS"
+msgstr "ローカル DNS の強制"
 
-msgid "Global options"
-msgstr "一般設定"
+msgid "Force Overall Sort"
+msgstr "全体ソートの強制"
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+"OPKGで '--force-maintainer' オプションを使用して既存の設定ファイルを上書きす"
+"るか、 <a href=\"%s\" target=\"_blank\">ここ</a> からデフォルトの設定ファイル"
+"をダウンロードしてください。"
+
+msgid "Input file not found, please check your configuration."
+msgstr "入力ファイルが見つかりません。設定を確認してください。"
+
+msgid "Invalid domain specified!"
+msgstr "無効なドメインが指定されています!"
+
+msgid "Last Run"
+msgstr "最終実行"
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+"リストの URL 及び \"Shalla\" リストのカテゴリー設定は、'詳細設定' セクション"
+"で設定することができます。<br />"
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+"利用可能なネットワーク インターフェースの一覧です。デフォルトでは 'wan' イン"
+"ターフェースによりスタートアップがトリガされます。"
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+"サポートされる DNS バックエンドと、それぞれのデフォルトのリスト出力先ディレク"
+"トリのリストです<br />"
+
+msgid "Loading"
+msgstr "読込中"
+
+msgid "Manual / Backup mode"
+msgstr "手動 / バックアップ モード"
+
+msgid "No"
+msgstr "いいえ"
 
 msgid ""
 "Options for further tweaking in case the defaults are not suitable for you."
 msgstr "デフォルト設定が適切でない場合、追加で設定するためのオプションです。"
 
-msgid "Restrict reload trigger to certain interface(s)"
-msgstr "リロードトリガを特定のインターフェースに限定する"
+msgid "Overall Blocked Domains"
+msgstr "全体のブロック済みドメイン"
+
+msgid "Overview"
+msgstr "概要"
+
+msgid ""
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+"1行に1つのドメインを追加してください。'#' から始まるコメントを記述できます"
+"が、IP アドレスやワイルドカード、正規表現を設定値として使用することはできませ"
+"ん。"
+
+msgid "Please edit this file directly in a terminal session."
+msgstr "ターミナル セッションで直接このファイルを編集してください。"
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+"このパッケージを使用するには、既存の Adblock 設定ファイルを更新してください。"
+
+msgid "Query"
+msgstr "検索"
+
+msgid "Query domains"
+msgstr "ドメインの検索"
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+"'lan' ゾーンからの全 DNS クエリを、ローカル リゾルバにリダイレクトします。"
+
+msgid "Resume"
+msgstr "再開"
+
+msgid "Runtime Information"
+msgstr "実行情報"
+
+msgid "SSL req."
+msgstr "SSL 必須"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Startup Trigger"
+msgstr "スタートアップ トリガ"
+
+msgid "Suspend"
+msgstr "一時停止"
+
+msgid "Suspend / Resume Adblock"
+msgstr "Adblock の一時停止 / 再開"
 
 msgid ""
-"Space separated list of wan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
 msgstr ""
-"リロード実行のトリガとなる、スペースで区切られたWANインターフェースのリストで"
-"す。リロードトリガを無効にするには、 false を設定します。デフォルト:(空)"
+"Adblock バックアップの保存先ディレクトリです。 RAM/tmpfs ドライブではなく、不"
+"揮発性のドライブのみを使用してください。"
 
-msgid "Whitelist file"
-msgstr "ホワイトリスト ファイル"
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr "生成されたブロックリスト 'adb_list.overall' の保存先ディレクトリです。"
 
-msgid "see list details"
-msgstr "リストの詳細を見る"
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr ""
+"ファイル サイズが大きすぎる(512 KB超)ため、 LuCI 上でオンライン編集できませ"
+"ん。"
 
-#~ msgid "Count"
-#~ msgstr "カウント"
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+"このフォームでは、Adblock ブラックリスト (%s) の内容を変更することができま"
+"す。<br />"
 
-#~ msgid "Do not write status info to flash"
-#~ msgstr "ステータス情報をフラッシュに書き込まない"
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+"このフォームでは、Adblock ホワイトリスト (%s) の内容を変更することができま"
+"す。<br />"
 
-#~ msgid "Last update of the blocklists"
-#~ msgstr "ブロックリストの最終更新日時"
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+"このフォームでは、メインのAdblock 設定ファイル (/etc/config/adblock) の内容を"
+"変更することができます。"
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+"このフォームでは、現在有効なリスト内で特定のドメインを検索することができま"
+"す。例: ホワイトリスト内"
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
+msgstr ""
+"このフォームには、システムログ内の Adblock に関連するメッセージのみが表示され"
+"ます。"
 
-#~ msgid "List date/state"
-#~ msgstr "リスト日時/状態"
+msgid ""
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+"デフォルトのパスを上書きするには、下記拡張セクションの 'DNS ディレクトリ' オ"
+"プションを使用します。"
 
-#~ msgid "Name of the logical lan interface"
-#~ msgstr "論理LANインターフェース名"
+msgid "Trigger Delay"
+msgstr "トリガ遅延"
 
-#~ msgid "Percentage of blocked packets (before last update, IPv4/IPv6)"
-#~ msgstr "ブロック済みパケットの割合(最終更新以前、IPv4/IPv6)"
+msgid "Verbose Debug Logging"
+msgstr "詳細なデバッグ ログ"
 
-#~ msgid "Port of the adblock uhttpd instance"
-#~ msgstr "adblock uhttpdインスタンスのポート"
+msgid "View Logfile"
+msgstr "ログファイルを見る"
 
-#~ msgid "Port of the adblock uhttpd instance for https links"
-#~ msgstr "httpsリンク用adblock uhttpdインスタンスのポート"
+msgid "Waiting for command to complete..."
+msgstr "コマンド実行中です..."
 
-#~ msgid "Redirect all DNS queries to the local resolver"
-#~ msgstr "全てのDNSクエリをローカルリゾルバにリダイレクト"
+msgid "Yes"
+msgstr "はい"
 
-#~ msgid ""
-#~ "Skip writing update status information to the config file. Status fields "
-#~ "on this page will not be updated."
-#~ msgstr ""
-#~ "更新ステータス情報をコンフィグファイルに書き込まず、スキップします。この"
-#~ "ページのステータス画面は更新されなくなります。"
+msgid "disabled"
+msgstr "無効"
 
-#~ msgid "Statistics"
-#~ msgstr "ステータス"
+msgid "enabled"
+msgstr "有効"
 
-#~ msgid "Timeout for blocklist fetch (seconds)"
-#~ msgstr "ブロックリスト取得の制限時間(秒)"
+msgid "error"
+msgstr "エラー"
 
-#~ msgid "Total count of blocked domains"
-#~ msgstr "ブロック済みドメインの合計"
+msgid "n/a"
+msgstr "利用不可"
 
-#~ msgid ""
-#~ "When adblock is active, all DNS queries are redirected to the local "
-#~ "resolver in this server by default. You can disable that to allow queries "
-#~ "to external DNS servers."
-#~ msgstr ""
-#~ "adblockがアクティブである時、全てのDNSクエリは既定でこのサーバー上のリゾル"
-#~ "バにリダイレクトされます。外部DNSサーバーへのクエリを許可する場合、この設"
-#~ "定を無効にすることもできます。"
+msgid "paused"
+msgstr "一時停止"

+ 338 - 35
package/luci/applications/luci-app-adblock/po/pt-br/adblock.po

@@ -8,65 +8,176 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.8.11\n"
-"Last-Translator: Luiz Angelo Daros de Luca <luizluca@gmail.com>\n"
+"Last-Translator: Luís Gabriel Lima Silva <gabrielima.si@gmail.com>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Language: pt_BR\n"
 
-msgid ""
-"). Note that list URLs and Shallalist category selections are not "
-"configurable via Luci."
+msgid "-------"
 msgstr ""
-"). Note que a lista de URL e as seleções de categoria da Shallalist não são "
-"configuráveis pelo Luci."
 
 msgid "Adblock"
 msgstr "Adblock"
 
-msgid "Available blocklist sources ("
-msgstr "Fontes de listas de bloqueio disponíveis ("
+msgid "Adblock Logfile"
+msgstr "Arquivo de log do Adblock"
 
-msgid "Backup directory"
-msgstr "Diretório da cópia de segurança"
+msgid "Adblock Status"
+msgstr ""
 
-msgid "Backup options"
-msgstr "Opções da cópia de segurança"
+msgid "Adblock Version"
+msgstr "Versão do Adblock"
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr ""
+"Atraso de gatilho adicional em segundos antes do processamento do adblock "
+"começar."
+
+msgid "Advanced"
+msgstr "Avançado"
+
+msgid "Available blocklist sources."
+msgstr "Fontes de listas de bloqueio disponíveis."
+
+msgid "Backup Directory"
+msgstr "Diretório da cópia de segurança"
 
-msgid "Blocklist sources"
+msgid "Blocklist Sources"
 msgstr "Fontes de listas de bloqueio"
 
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
+msgstr ""
+
+msgid "Collecting data..."
+msgstr "Coletando dados..."
+
 msgid ""
 "Configuration of the adblock package to block ad/abuse domains by using DNS."
 msgstr ""
 "Configuração do pacote adblock para bloquear, usando o DNS, domínios que "
 "distribuem propagandas abusivas."
 
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+"Crie backups comprimidos das listas de bloqueio, eles serão usados em caso "
+"de erro dedownload ou durante o início em modo manual."
+
+msgid "DNS Backend (DNS Directory)"
+msgstr ""
+
+msgid "DNS Directory"
+msgstr ""
+
 msgid "Description"
 msgstr "Descrição"
 
-msgid "Enable adblock"
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
+msgstr ""
+"Não atualize as listas de bloqueio automaticamente durante o início, use o "
+"backup das listas como alternativa."
+
+msgid "Download Utility (SSL Library)"
+msgstr "Utilitário de Download (Biblioteca SSL)"
+
+msgid "Edit Blacklist"
+msgstr "Editar Lista de Bloqueio"
+
+msgid "Edit Configuration"
+msgstr "Editar Configuração"
+
+msgid "Edit Whitelist"
+msgstr "Editar Lista Permitida"
+
+msgid "Enable Adblock"
 msgstr "Habilitar adblock"
 
-msgid "Enable blocklist backup"
+msgid "Enable Blocklist Backup"
 msgstr "Habilitar cópia de segurança da lista de bloqueio"
 
-msgid "Enable verbose debug logging"
-msgstr "Habilite registros detalhados para depuração"
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+"Ativar tipo geral intenso de memória / duplicar remoção em dispositivos com "
+"pouca memória (&lt; 64 MB RAM)"
+
+msgid "Enable verbose debug logging in case of any processing error."
+msgstr ""
 
 msgid "Enabled"
 msgstr "Habilitado"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "Opções adicionais"
 
 msgid ""
-"File with whitelisted hosts/domains that are allowed despite being on a "
-"blocklist."
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
 msgstr ""
-"Arquivo com a lista branca dos equipamentos/domínios que serão autorizados "
-"mesmo estando na lista de bloqueio."
+"Para uma lista de bloqueio protegida por SSL você precisa de uma biblioteca "
+"SSL adequada, e.x. 'libustream-ssl' ou o wget 'built-in'."
 
-msgid "Global options"
-msgstr "Opções Globais"
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"Para outras informações <a href=\"%s\" target=\"_blank\">veja a documentação "
+"online</a>"
+
+msgid "Force Local DNS"
+msgstr "Force o DNS local"
+
+msgid "Force Overall Sort"
+msgstr "Force Tipo Geral"
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr "Arquivo de entrada não encontrado, por favor cheque sua configuração."
+
+msgid "Invalid domain specified!"
+msgstr "Domínio especificado inválido!"
+
+msgid "Last Run"
+msgstr ""
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+
+msgid "Loading"
+msgstr "Carregando"
+
+msgid "Manual / Backup mode"
+msgstr "Manual / Modo backup"
+
+msgid "No"
+msgstr "Não"
 
 msgid ""
 "Options for further tweaking in case the defaults are not suitable for you."
@@ -74,19 +185,211 @@ msgstr ""
 "Opções para aprimoramentos adicionais caso as opções padrão não sejam "
 "suficientes para você."
 
-msgid "Restrict reload trigger to certain interface(s)"
-msgstr "Restringir o gatilho de recarga para somente alguma(s) interface(s)"
+msgid "Overall Blocked Domains"
+msgstr ""
+
+msgid "Overview"
+msgstr "Visão geral"
 
 msgid ""
-"Space separated list of wan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+
+msgid "Please edit this file directly in a terminal session."
+msgstr "Por favor edite esse arquivo direto em uma sessão de terminal."
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+
+msgid "Query"
+msgstr "Consulta"
+
+msgid "Query domains"
+msgstr "Consulta de domínios"
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+
+msgid "Resume"
 msgstr ""
-"Lista das interfaces WAN, separadas por espaço, que podem disparar uma ação "
-"de recarga. Para desabilitar este gatilho, defina-o como 'false'. Padrão: em "
-"branco"
 
-msgid "Whitelist file"
-msgstr "Arquivo da lista branca"
+msgid "Runtime Information"
+msgstr "Informação de execução"
+
+msgid "SSL req."
+msgstr "req. de SSL"
+
+msgid "Save"
+msgstr "Salvar"
+
+msgid "Startup Trigger"
+msgstr ""
+
+msgid "Suspend"
+msgstr ""
+
+msgid "Suspend / Resume Adblock"
+msgstr "Suspender / Resumir adblock"
+
+msgid ""
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
+msgstr ""
+
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr ""
+
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr ""
+"O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 KB)."
+
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+"Esse formulário permite que você modifique o conteúdo das listas de bloqueio "
+"do adblock (%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+"Esse formulário permite que você modifique o conteúdo das listas de "
+"permissão do adblock (%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+"Esse formulário permite que você modifique o conteúdo das do arquivo de "
+"configuração principal (/etc/config/adblock)."
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+"Esse formulário permite que você consulte listas de blocos ativos para "
+"certos domínios, e.x. para listas de permissão."
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
+msgstr ""
+"Esse formulário mostra a saída do syslog, pré-filtrado para mensagens do "
+"adblock  apenas."
+
+msgid ""
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr "Atraso no gatilho"
+
+msgid "Verbose Debug Logging"
+msgstr ""
+
+msgid "View Logfile"
+msgstr "Ver arquivo de log"
+
+msgid "Waiting for command to complete..."
+msgstr "Aguardando por comando para completar..."
+
+msgid "Yes"
+msgstr "Sim"
+
+msgid "disabled"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "n/a"
+msgstr "n/d"
+
+msgid "paused"
+msgstr ""
+
+#~ msgid "Blocked domains (overall)"
+#~ msgstr "Domínios bloqueados (total)"
+
+#~ msgid "DNS backend"
+#~ msgstr "Porta dos fundos de DNS"
+
+#~ msgid "Enable verbose debug logging"
+#~ msgstr "Habilite registros detalhados para depuração"
+
+#~ msgid "Last rundate"
+#~ msgstr "Última data de execução"
+
+#~ msgid ""
+#~ "Note that list URLs and Shallalist category selections are configurable "
+#~ "in the 'Advanced' section."
+#~ msgstr ""
+#~ "Observe que as URLs da lista e as seleções da categoria Shallalist são "
+#~ "configuráveis na secção 'Avançada'."
+
+#~ msgid "Redirect all DNS queries to the local resolver."
+#~ msgstr "Redirecione todas as consultas de DNS para o resolvedor local."
+
+#~ msgid "Restrict interface trigger to certain interface(s)"
+#~ msgstr "Restingir o gatilho de interface para certas interface(s)"
+
+#~ msgid "Resume adblock"
+#~ msgstr "Resumir adblock"
+
+#~ msgid "Status"
+#~ msgstr "Estado"
+
+#~ msgid "active"
+#~ msgstr "ativo"
+
+#~ msgid "no domains blocked"
+#~ msgstr "nenhum domínio bloqueado"
+
+#~ msgid "suspended"
+#~ msgstr "suspenso"
+
+#~ msgid "Backup options"
+#~ msgstr "Opções da cópia de segurança"
+
+#~ msgid ""
+#~ "). Note that list URLs and Shallalist category selections are not "
+#~ "configurable via Luci."
+#~ msgstr ""
+#~ "). Note que a lista de URL e as seleções de categoria da Shallalist não "
+#~ "são configuráveis pelo Luci."
+
+#~ msgid "Available blocklist sources ("
+#~ msgstr "Fontes de listas de bloqueio disponíveis ("
+
+#~ msgid ""
+#~ "File with whitelisted hosts/domains that are allowed despite being on a "
+#~ "blocklist."
+#~ msgstr ""
+#~ "Arquivo com a lista branca dos equipamentos/domínios que serão "
+#~ "autorizados mesmo estando na lista de bloqueio."
+
+#~ msgid "Global options"
+#~ msgstr "Opções Globais"
+
+#~ msgid "Restrict reload trigger to certain interface(s)"
+#~ msgstr "Restringir o gatilho de recarga para somente alguma(s) interface(s)"
+
+#~ msgid ""
+#~ "Space separated list of wan interfaces that trigger reload action. To "
+#~ "disable reload trigger set it to 'false'. Default: empty"
+#~ msgstr ""
+#~ "Lista das interfaces WAN, separadas por espaço, que podem disparar uma "
+#~ "ação de recarga. Para desabilitar este gatilho, defina-o como 'false'. "
+#~ "Padrão: em branco"
+
+#~ msgid "Whitelist file"
+#~ msgstr "Arquivo da lista branca"
 
-msgid "see list details"
-msgstr "veja os detalhes da lista"
+#~ msgid "see list details"
+#~ msgstr "veja os detalhes da lista"

+ 301 - 29
package/luci/applications/luci-app-adblock/po/sv/adblock.po

@@ -1,75 +1,347 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8\n"
 
-msgid ""
-"). Note that list URLs and Shallalist category selections are not "
-"configurable via Luci."
+msgid "-------"
 msgstr ""
 
 msgid "Adblock"
-msgstr "Blockering av annonser"
+msgstr "Adblock"
 
-msgid "Available blocklist sources ("
-msgstr "Tillgängliga källor för blockeringslistor ("
+msgid "Adblock Logfile"
+msgstr "Adblock's loggfil"
 
-msgid "Backup directory"
-msgstr "Säkerhetskopiera mapp"
+msgid "Adblock Status"
+msgstr ""
 
-msgid "Backup options"
-msgstr "Alternativ för säkerhetskopiering"
+msgid "Adblock Version"
+msgstr "Version för Adblock"
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr ""
+
+msgid "Advanced"
+msgstr "Avancerat"
+
+msgid "Available blocklist sources."
+msgstr "Tillgängliga källor för blockeringslistor"
+
+msgid "Backup Directory"
+msgstr "Säkerhetskopiera mapp"
 
-msgid "Blocklist sources"
+msgid "Blocklist Sources"
 msgstr "Källor för blockeringslistor"
 
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
+msgstr ""
+
+msgid "Collecting data..."
+msgstr "Samlar in data..."
+
 msgid ""
 "Configuration of the adblock package to block ad/abuse domains by using DNS."
 msgstr ""
-"Konfiguration av paket adblock för att blockera annons/otillåtna domäner "
-"genom att användning DNS."
+"Konfiguration av paketet adblock för att blockera annons/otillåtna domäner "
+"genom att använda DNS."
+
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+
+msgid "DNS Backend (DNS Directory)"
+msgstr ""
+
+msgid "DNS Directory"
+msgstr ""
 
 msgid "Description"
 msgstr "Beskrivning"
 
-msgid "Enable adblock"
-msgstr "Aktivera abblock"
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
+msgstr ""
+"Uppdatera inte automatiskt blockeringlistor vid uppstarten, använd "
+"säkerhetskopierade blockeringslistor istället."
+
+msgid "Download Utility (SSL Library)"
+msgstr "Nerladdningsprogram (SSL-bibliotek)"
+
+msgid "Edit Blacklist"
+msgstr "Redigera svartlista"
+
+msgid "Edit Configuration"
+msgstr "Redigerar konfigurationen"
+
+msgid "Edit Whitelist"
+msgstr "Redigera vitlista"
 
-msgid "Enable blocklist backup"
+msgid "Enable Adblock"
+msgstr "Aktivera adblock"
+
+msgid "Enable Blocklist Backup"
 msgstr "Aktivera säkerhetskopiering av blockeringslistan"
 
-msgid "Enable verbose debug logging"
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+
+msgid "Enable verbose debug logging in case of any processing error."
 msgstr ""
 
 msgid "Enabled"
 msgstr "Aktiverad"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "Extra alternativ"
 
 msgid ""
-"File with whitelisted hosts/domains that are allowed despite being on a "
-"blocklist."
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
 msgstr ""
 
-msgid "Global options"
-msgstr "Globala alternativ"
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"För mer information <a href=\"%s\" target=\"_blank\">se dokumentationen på "
+"internet</a>"
+
+msgid "Force Local DNS"
+msgstr "Tvinga lokal DNS"
+
+msgid "Force Overall Sort"
+msgstr ""
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+"Inmatningsfilen kunde inte hittas, var vänlig kontrollera din konfiguration."
+
+msgid "Invalid domain specified!"
+msgstr "Ogiltig domän angiven!"
+
+msgid "Last Run"
+msgstr ""
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+
+msgid "Loading"
+msgstr "Laddar"
+
+msgid "Manual / Backup mode"
+msgstr "Manuell / Säkerhetskopieringsläge"
+
+msgid "No"
+msgstr "Nej"
 
 msgid ""
 "Options for further tweaking in case the defaults are not suitable for you."
 msgstr ""
 
-msgid "Restrict reload trigger to certain interface(s)"
+msgid "Overall Blocked Domains"
+msgstr ""
+
+msgid "Overview"
+msgstr "Översikt"
+
+msgid ""
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+
+msgid "Please edit this file directly in a terminal session."
+msgstr "Vänligen redigera den här filen direkt i en terminal-session."
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+
+msgid "Query"
+msgstr "Fråga"
+
+msgid "Query domains"
+msgstr "Fråga efter domäner"
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Runtime Information"
+msgstr "Information om körtid"
+
+msgid "SSL req."
+msgstr "SSL-rek."
+
+msgid "Save"
+msgstr "Spara"
+
+msgid "Startup Trigger"
+msgstr ""
+
+msgid "Suspend"
+msgstr ""
+
+msgid "Suspend / Resume Adblock"
+msgstr "Upphäv / Återuppta adblock"
+
+msgid ""
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
+msgstr ""
+
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr ""
+
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
+
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+"Det här formuläret tillåter dig att förändra innehållet i adblock's "
+"svartlista (%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+"Det här formuläret tillåter dig att förändra innehållet i adblock's vitlista "
+"(%s).<br />"
+
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+"Det här formuläret tillåter dig att förändra innehållet i adblock's "
+"huvudsakliga konfigurations fil (/etc/config/adblock)."
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
 msgstr ""
 
 msgid ""
-"Space separated list of wan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr ""
+
+msgid "Verbose Debug Logging"
+msgstr ""
+
+msgid "View Logfile"
+msgstr "Visa loggfil"
+
+msgid "Waiting for command to complete..."
+msgstr "Väntar på att kommandot ska slutföras..."
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "disabled"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "n/a"
+msgstr "n/a"
+
+msgid "paused"
 msgstr ""
 
-msgid "Whitelist file"
-msgstr "Vitlista fil"
+#~ msgid "Blocked domains (overall)"
+#~ msgstr "Blockerade domäner (övergripande)"
+
+#~ msgid "DNS backend"
+#~ msgstr "Bakände för DNS"
+
+#~ msgid "Enable verbose debug logging"
+#~ msgstr "Aktivera utförlig loggning för avlusning"
+
+#~ msgid "Last rundate"
+#~ msgstr "Senaste kördatum"
+
+#~ msgid "Redirect all DNS queries to the local resolver."
+#~ msgstr "Dirigera om alla DNS-förfrågningar till den lokala "
+
+#~ msgid "Resume adblock"
+#~ msgstr "Återuppta adblock"
+
+#~ msgid "Status"
+#~ msgstr "Status"
+
+#~ msgid "Suspend adblock"
+#~ msgstr "Upphäv adblock"
+
+#~ msgid "active"
+#~ msgstr "aktiv"
+
+#~ msgid "no domains blocked"
+#~ msgstr "inga domäner blockerades"
+
+#~ msgid "suspended"
+#~ msgstr "upphävd"
+
+#~ msgid "."
+#~ msgstr "."
+
+#~ msgid "For further information"
+#~ msgstr "För mer information"
+
+#~ msgid "Backup options"
+#~ msgstr "Alternativ för säkerhetskopiering"
+
+#~ msgid "Available blocklist sources ("
+#~ msgstr "Tillgängliga källor för blockeringslistor ("
+
+#~ msgid "Global options"
+#~ msgstr "Globala alternativ"
+
+#~ msgid "Whitelist file"
+#~ msgstr "Vitlista fil"
 
-msgid "see list details"
-msgstr "se listans detaljer"
+#~ msgid "see list details"
+#~ msgstr "se listans detaljer"
 
 #~ msgid "Count"
 #~ msgstr "Räkna"

+ 226 - 19
package/luci/applications/luci-app-adblock/po/templates/adblock.pot

@@ -1,70 +1,277 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-msgid ""
-"). Note that list URLs and Shallalist category selections are not "
-"configurable via Luci."
+msgid "-------"
 msgstr ""
 
 msgid "Adblock"
 msgstr ""
 
-msgid "Available blocklist sources ("
+msgid "Adblock Logfile"
+msgstr ""
+
+msgid "Adblock Status"
+msgstr ""
+
+msgid "Adblock Version"
+msgstr ""
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr ""
+
+msgid "Advanced"
 msgstr ""
 
-msgid "Backup directory"
+msgid "Available blocklist sources."
 msgstr ""
 
-msgid "Backup options"
+msgid "Backup Directory"
+msgstr ""
+
+msgid "Blocklist Sources"
+msgstr ""
+
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
 msgstr ""
 
-msgid "Blocklist sources"
+msgid "Collecting data..."
 msgstr ""
 
 msgid ""
 "Configuration of the adblock package to block ad/abuse domains by using DNS."
 msgstr ""
 
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+
+msgid "DNS Backend (DNS Directory)"
+msgstr ""
+
+msgid "DNS Directory"
+msgstr ""
+
 msgid "Description"
 msgstr ""
 
-msgid "Enable adblock"
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
 msgstr ""
 
-msgid "Enable blocklist backup"
+msgid "Download Utility (SSL Library)"
 msgstr ""
 
-msgid "Enable verbose debug logging"
+msgid "Edit Blacklist"
+msgstr ""
+
+msgid "Edit Configuration"
+msgstr ""
+
+msgid "Edit Whitelist"
+msgstr ""
+
+msgid "Enable Adblock"
+msgstr ""
+
+msgid "Enable Blocklist Backup"
+msgstr ""
+
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+
+msgid "Enable verbose debug logging in case of any processing error."
 msgstr ""
 
 msgid "Enabled"
 msgstr ""
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr ""
 
 msgid ""
-"File with whitelisted hosts/domains that are allowed despite being on a "
-"blocklist."
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
+msgstr ""
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+
+msgid "Force Local DNS"
+msgstr ""
+
+msgid "Force Overall Sort"
+msgstr ""
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+
+msgid "Invalid domain specified!"
+msgstr ""
+
+msgid "Last Run"
+msgstr ""
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+
+msgid "Loading"
+msgstr ""
+
+msgid "Manual / Backup mode"
 msgstr ""
 
-msgid "Global options"
+msgid "No"
 msgstr ""
 
 msgid ""
 "Options for further tweaking in case the defaults are not suitable for you."
 msgstr ""
 
-msgid "Restrict reload trigger to certain interface(s)"
+msgid "Overall Blocked Domains"
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid ""
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+
+msgid "Please edit this file directly in a terminal session."
+msgstr ""
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+
+msgid "Query"
+msgstr ""
+
+msgid "Query domains"
+msgstr ""
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Runtime Information"
+msgstr ""
+
+msgid "SSL req."
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Startup Trigger"
+msgstr ""
+
+msgid "Suspend"
+msgstr ""
+
+msgid "Suspend / Resume Adblock"
 msgstr ""
 
 msgid ""
-"Space separated list of wan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
+msgstr ""
+
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr ""
+
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
+msgstr ""
+
+msgid ""
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr ""
+
+msgid "Verbose Debug Logging"
+msgstr ""
+
+msgid "View Logfile"
+msgstr ""
+
+msgid "Waiting for command to complete..."
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "disabled"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "error"
 msgstr ""
 
-msgid "Whitelist file"
+msgid "n/a"
 msgstr ""
 
-msgid "see list details"
+msgid "paused"
 msgstr ""

+ 297 - 31
package/luci/applications/luci-app-adblock/po/zh-cn/adblock.po

@@ -1,84 +1,350 @@
+# liushuyu <liushuyu_011@163.com>, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: kuoruan@gmail.com\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2017-04-15 21:35-0600\n"
+"Last-Translator: liushuyu <liushuyu011@gmail.com>\n"
+"Language-Team: Chinese <kde-i18n-doc@kde.org>\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.5\n"
+"X-Generator: Poedit 2.0.1\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-msgid ""
-"). Note that list URLs and Shallalist category selections are not "
-"configurable via Luci."
-msgstr ")。需要注意的是列表URL和列表类别选项无法通过Luci设置。"
+msgid "-------"
+msgstr ""
 
 msgid "Adblock"
 msgstr "Adblock"
 
-msgid "Available blocklist sources ("
-msgstr "可用拦截列表来源("
+msgid "Adblock Logfile"
+msgstr "Adblock 日志文件"
 
-msgid "Backup directory"
-msgstr "备份目录"
+msgid "Adblock Status"
+msgstr ""
+
+msgid "Adblock Version"
+msgstr "Adblock 版本"
+
+msgid "Additional trigger delay in seconds before adblock processing begins."
+msgstr ""
+
+msgid "Advanced"
+msgstr "高级"
+
+msgid "Available blocklist sources."
+msgstr "可用的 blocklist 来源"
 
-msgid "Backup options"
-msgstr "备份选项"
+msgid "Backup Directory"
+msgstr "备份目录"
 
-msgid "Blocklist sources"
+msgid "Blocklist Sources"
 msgstr "拦截列表来源"
 
+msgid ""
+"Caution: Please don't select big lists or many lists at once on low memory "
+"devices to prevent OOM exceptions!"
+msgstr ""
+
+msgid ""
+"Choose 'none' to disable automatic startups, 'timed' to use a classic "
+"timeout (default 30 sec.) or select another trigger interface."
+msgstr ""
+
+msgid "Collecting data..."
+msgstr "正在收集数据..."
+
 msgid ""
 "Configuration of the adblock package to block ad/abuse domains by using DNS."
 msgstr "Adblock 配置工具,通过 DNS 来拦截广告和阻止域名。"
 
+msgid ""
+"Create compressed blocklist backups, they will be used in case of download "
+"errors or during startup in manual mode."
+msgstr ""
+
+msgid "DNS Backend (DNS Directory)"
+msgstr ""
+
+msgid "DNS Directory"
+msgstr ""
+
 msgid "Description"
 msgstr "描述"
 
-msgid "Enable adblock"
+msgid ""
+"Do not automatically update blocklists during startup, use blocklist backups "
+"instead."
+msgstr ""
+
+msgid "Download Utility (SSL Library)"
+msgstr ""
+
+msgid "Edit Blacklist"
+msgstr "编辑黑名单"
+
+msgid "Edit Configuration"
+msgstr "编辑设置"
+
+msgid "Edit Whitelist"
+msgstr "编辑白名单"
+
+msgid "Enable Adblock"
 msgstr "启用Adblock"
 
-msgid "Enable blocklist backup"
+msgid "Enable Blocklist Backup"
 msgstr "启用拦截规则备份"
 
-msgid "Enable verbose debug logging"
+msgid ""
+"Enable memory intense overall sort / duplicate removal on low memory devices "
+"(&lt; 64 MB RAM)"
+msgstr ""
+
+msgid "Enable verbose debug logging in case of any processing error."
 msgstr ""
 
 msgid "Enabled"
 msgstr "启用"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "额外选项"
 
 msgid ""
-"File with whitelisted hosts/domains that are allowed despite being on a "
-"blocklist."
-msgstr "允许的主机/域名列表"
+"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
+"'libustream-ssl' or the wget 'built-in'."
+msgstr ""
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+
+msgid "Force Local DNS"
+msgstr ""
+
+msgid "Force Overall Sort"
+msgstr ""
+
+msgid ""
+"In OPKG use the '--force-maintainer' option to overwrite the pre-existing "
+"config file or download a fresh default config from <a href=\"%s\" target="
+"\"_blank\">here</a>"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+
+msgid "Invalid domain specified!"
+msgstr "无效域名!"
+
+msgid "Last Run"
+msgstr ""
+
+msgid ""
+"List URLs and Shallalist category selections are configurable in the "
+"'Advanced' section.<br />"
+msgstr ""
+
+msgid ""
+"List of available network interfaces. By default the startup will be "
+"triggered by the 'wan' interface.<br />"
+msgstr ""
+
+msgid ""
+"List of supported DNS backends with their default list export directory.<br /"
+">"
+msgstr ""
+
+msgid "Loading"
+msgstr "加载中"
+
+msgid "Manual / Backup mode"
+msgstr ""
 
-msgid "Global options"
-msgstr "全局选项"
+msgid "No"
+msgstr ""
 
 msgid ""
 "Options for further tweaking in case the defaults are not suitable for you."
 msgstr "在默认设置并不适合你时的额外选项。"
 
-msgid "Restrict reload trigger to certain interface(s)"
+msgid "Overall Blocked Domains"
+msgstr ""
+
+msgid "Overview"
+msgstr "总览"
+
+msgid ""
+"Please add only one domain per line. Comments introduced with '#' are "
+"allowed - ip addresses, wildcards and regex are not."
+msgstr ""
+
+msgid "Please edit this file directly in a terminal session."
+msgstr ""
+
+msgid "Please update your adblock config file to use this package."
+msgstr ""
+
+msgid "Query"
+msgstr "查询"
+
+msgid "Query domains"
+msgstr ""
+
+msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Runtime Information"
+msgstr "运行信息"
+
+msgid "SSL req."
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Startup Trigger"
+msgstr ""
+
+msgid "Suspend"
+msgstr ""
+
+msgid "Suspend / Resume Adblock"
+msgstr "暂停/恢复 Adblock"
+
+msgid ""
+"Target directory for adblock backups. Please use only non-volatile disks, no "
+"ram/tmpfs drives."
+msgstr ""
+
+msgid "Target directory for the generated blocklist 'adb_list.overall'."
+msgstr ""
+
+msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the adblock blacklist (%s)."
+"<br />"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the adblock whitelist (%s)."
+"<br />"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main adblock configuration "
+"file (/etc/config/adblock)."
+msgstr ""
+
+msgid ""
+"This form allows you to query active block lists for certain domains, e.g. "
+"for whitelisting."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for adblock related messages "
+"only."
 msgstr ""
 
 msgid ""
-"Space separated list of wan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"To overwrite the default path use the 'DNS Directory' option in the extra "
+"section below."
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr "触发延迟"
+
+msgid "Verbose Debug Logging"
+msgstr ""
+
+msgid "View Logfile"
+msgstr "查看日志文件"
+
+msgid "Waiting for command to complete..."
+msgstr "正在执行命令..."
+
+msgid "Yes"
+msgstr "是"
+
+msgid "disabled"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "n/a"
+msgstr ""
+
+msgid "paused"
 msgstr ""
 
-msgid "Whitelist file"
-msgstr "白名单文件"
+#~ msgid "DNS backend"
+#~ msgstr "DNS 后端"
+
+#~ msgid "Enable verbose debug logging"
+#~ msgstr "启用详细调试输出"
+
+#~ msgid "Resume adblock"
+#~ msgstr "恢复 Adblock"
+
+#~ msgid "Status"
+#~ msgstr "状态"
+
+#~ msgid "Suspend adblock"
+#~ msgstr "暂停 Adblock"
+
+#~ msgid "active"
+#~ msgstr "已启用"
+
+#~ msgid "no domains blocked"
+#~ msgstr "没有被拦截的域名"
+
+#~ msgid "suspended"
+#~ msgstr "已暂停"
+
+#~ msgid "."
+#~ msgstr "."
+
+#~ msgid "For further information"
+#~ msgstr "更多信息"
+
+#~ msgid "see online documentation"
+#~ msgstr "查看在线文档"
+
+#~ msgid "Backup options"
+#~ msgstr "备份选项"
+
+#~ msgid ""
+#~ "). Note that list URLs and Shallalist category selections are not "
+#~ "configurable via Luci."
+#~ msgstr ")。需要注意的是列表URL和列表类别选项无法通过Luci设置。"
+
+#~ msgid "Available blocklist sources ("
+#~ msgstr "可用拦截列表来源("
+
+#~ msgid ""
+#~ "File with whitelisted hosts/domains that are allowed despite being on a "
+#~ "blocklist."
+#~ msgstr "允许的主机/域名列表"
+
+#~ msgid "Global options"
+#~ msgstr "全局选项"
+
+#~ msgid "Whitelist file"
+#~ msgstr "白名单文件"
 
-msgid "see list details"
-msgstr "查看列表详情"
+#~ msgid "see list details"
+#~ msgstr "查看列表详情"
 
 #~ msgid "Count"
 #~ msgstr "数量"

+ 20 - 0
package/luci/applications/luci-app-advanced-reboot/Makefile

@@ -0,0 +1,20 @@
+# Copyright (c) 2017 Stan Grishin (stangri@melmac.net)
+# This is free software, licensed under the GNU General Public License v3.
+
+include $(TOPDIR)/rules.mk
+
+PKG_LICENSE:=GPL-3.0+
+PKG_MAINTAINER:=Stan Grishin <stangri@melmac.net>
+
+LUCI_TITLE:=Advanced Linksys Reboot Web UI
+LUCI_DESCRIPTION:=Provides Web UI (found under System/Advanced Reboot) to reboot supported Linksys routers to\
+	an altnerative partition. Also provides Web UI to shut down (power off) your device. 	Supported dual-partition\
+	routers are listed at https://github.com/stangri/openwrt-luci/blob/luci-app-advanced-reboot/applications/luci-app-advanced-reboot/README.md
+
+LUCI_DEPENDS:=+luci
+LUCI_PKGARCH:=all
+PKG_RELEASE:=23
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 35 - 0
package/luci/applications/luci-app-advanced-reboot/README.md

@@ -0,0 +1,35 @@
+# Advanced Reboot Web UI (luci-app-advanced-reboot)
+
+## Description
+This package allows you to reboot to an alternative partition on supported (dual-partition) routers and to power off (power down) your OpenWrt/LEDE Project device.
+
+## Supported Devices
+Currently supported dual-partition devices include:
+- Linksys WRT1200AC
+- Linksys WRT1900AC
+- Linksys WRT1900ACv2
+- Linksys WRT1900ACS
+- Linksys WRT3200ACM
+- Linksys E4200v2
+- Linksys EA4500
+- Linksys EA8500
+
+If you're interested in having your device supported, please post in [LEDE Project Forum Support Thread](https://forum.lede-project.org/t/web-ui-to-reboot-to-another-partition-dual-partition-routers/3423).
+
+## Screenshot (luci-app-advanced-reboot)
+![screenshot](https://raw.githubusercontent.com/stangri/screenshots/master/luci-app-advanced-reboot/screenshot01.png "screenshot")
+
+## How to install
+Install ```luci-app-advanced-reboot``` from Web UI or connect to your router via ssh and run the following commands:
+```sh
+opkg update
+opkg install luci-app-advanced-reboot
+```
+
+## Notes/Known Issues
+- When you reboot to a different partition, your current settings (WiFi SSID/password, etc.) will not apply to a different partition. Different partitions might have completely different settings and even firmware.
+- If you reboot to a partition which doesn't allow you to switch boot partitions (like stock Linksys firmware), you might not be able to boot back to OpenWrt/LEDE Project unless you reflash it, loosing all the settings.
+- Some devices allow you to trigger reboot to alternative partition by interrupting boot 3 times in a row (by resetting/switching off the device or pulling power). As these methods might be different for different devices, do your own homework.
+
+## Thanks
+I'd like to thank everyone who helped create, test and troubleshoot this package. Without contributions from [@hnyman](https://github.com/hnyman) and [@jpstyves](https://github.com/jpstyves) it wouldn't have been possible.

+ 120 - 0
package/luci/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua

@@ -0,0 +1,120 @@
+-- Copyright 2017 Stan Grishin <stangri@melmac.net>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.controller.advanced_reboot", package.seeall)
+
+-- device, board_name, part1, part2, offset, env_var_1, value_1_1, value_1_2, env_var_2, value_2_1, value_2_2
+devices = {
+  {"Linksys WRT1200AC", "armada-385-linksys-caiman", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys WRT1900AC", "armada-xp-linksys-mamba", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys WRT1900ACv2", "armada-385-linksys-cobra", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys WRT1900ACS", "armada-385-linksys-shelby", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys WRT3200ACM", "armada-385-linksys-rango", "mtd5", "mtd7", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys E4200v2/EA4500", "linksys-viper", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
+  {"Linksys EA8500", "ea8500", "mtd13", "mtd15", 32, "boot_part", 1, 2}
+}
+
+board_name = luci.util.trim(luci.sys.exec("cat /tmp/sysinfo/board_name"))
+for i=1, #devices do
+  if board_name and devices[i][2] == board_name then
+    device_name = devices[i][1]
+    partition_one_mtd = devices[i][3] or nil
+    partition_two_mtd = devices[i][4] or nil
+    partition_skip = devices[i][5] or nil
+    boot_envvar1 = devices[i][6] or nil
+    boot_envvar1_partition_one = tonumber(devices[i][7]) or nil
+    boot_envvar1_partition_two = tonumber(devices[i][8]) or nil
+    boot_envvar2 = devices[i][9] or nil
+    boot_envvar2_partition_one = devices[i][10] or nil
+    boot_envvar2_partition_two = devices[i][11] or nil
+    if partition_one_mtd and partition_skip then
+      partition_one_label = luci.util.trim(luci.sys.exec("dd if=/dev/" .. partition_one_mtd .. " bs=1 skip=" .. partition_skip .. " count=25" .. "  2>/dev/null"))
+      n, partition_one_version = string.match(partition_one_label, '(Linux)-([%d|.]+)')
+    end
+    if partition_two_mtd and partition_skip then
+      partition_two_label = luci.util.trim(luci.sys.exec("dd if=/dev/" .. partition_two_mtd .. " bs=1 skip=" .. partition_skip .. " count=25" .. "  2>/dev/null"))
+      n, partition_two_version = string.match(partition_two_label, '(Linux)-([%d|.]+)')
+    end
+    if string.find(partition_one_label, "LEDE") then partition_one_os = "LEDE" end
+    if string.find(partition_one_label, "OpenWrt") then partition_one_os = "OpenWrt" end
+    if string.find(partition_one_label, "Linksys") then partition_one_os = "Linksys" end
+    if string.find(partition_two_label, "LEDE") then partition_two_os = "LEDE" end
+    if string.find(partition_two_label, "OpenWrt") then partition_two_os = "OpenWrt" end
+    if string.find(partition_two_label, "Linksys") then partition_two_os = "Linksys" end
+    if not partition_one_os then partition_one_os = "Unknown" end
+    if not partition_two_os then partition_two_os = "Unknown" end
+    if partition_one_os and partition_one_version then partition_one_os = partition_one_os .. " (Linux " .. partition_one_version .. ")" end
+    if partition_two_os and partition_two_version then partition_two_os = partition_two_os .. " (Linux " .. partition_two_version .. ")" end
+    if nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then
+      current_partition = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1)))
+      other_partition = current_partition == boot_envvar1_partition_one and boot_envvar1_partition_two or boot_envvar1_partition_one
+    end
+  end
+end
+
+function index()
+  entry({"admin", "system", "advanced_reboot"}, template("advanced_reboot/advanced_reboot"), _("Advanced Reboot"), 90)
+  entry({"admin", "system", "advanced_reboot", "reboot"}, post("action_reboot"))
+--  if device_name then entry({"admin", "system", "advanced_reboot", "altreboot"}, post("action_altreboot")) end
+  entry({"admin", "system", "advanced_reboot", "alternative_reboot"}, post("action_altreboot"))
+  entry({"admin", "system", "advanced_reboot", "power_off"}, post("action_poweroff"))
+end
+
+function action_reboot()
+  luci.template.render("admin_system/applyreboot", {
+        title = luci.i18n.translate("Rebooting..."),
+        msg   = luci.i18n.translate("The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
+        addr  = luci.ip.new(uci.cursor():get("network", "lan", "ipaddr")) or "192.168.1.1"
+      })
+  luci.sys.reboot()
+end
+
+function action_altreboot()
+  if luci.http.formvalue("cancel") then
+    luci.http.redirect(luci.dispatcher.build_url('admin/system/advanced_reboot'))
+    return
+  end
+  local step = tonumber(luci.http.formvalue("step") or 1)
+  if step == 1 then
+    if device_name and nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then
+      luci.template.render("advanced_reboot/alternative_reboot",{})
+    else
+      luci.template.render("advanced_reboot/advanced_reboot",{})
+    end
+  elseif step == 2 then
+    luci.template.render("admin_system/applyreboot", {
+          title = luci.i18n.translate("Rebooting..."),
+          msg   = luci.i18n.translate("The system is rebooting to an alternative partition now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
+          addr  = luci.ip.new(uci.cursor():get("network", "lan", "ipaddr")) or "192.168.1.1"
+        })
+    if boot_envvar1 then env1 = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1))) end
+    if boot_envvar2 then env2 = luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar2)) end
+    if env1 and env1 == boot_envvar1_partition_one then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. boot_envvar1_partition_two) end
+    if env1 and env1 == boot_envvar1_partition_two then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. boot_envvar1_partition_one) end
+    if env2 and env2 == boot_envvar2_partition_one then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. boot_envvar2_partition_two .. "'") end
+    if env2 and env2 == boot_envvar2_partition_two then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. boot_envvar2_partition_one .. "'") end
+    luci.sys.reboot()
+  end
+end
+
+function action_poweroff()
+  if luci.http.formvalue("cancel") then
+    luci.http.redirect(luci.dispatcher.build_url('admin/system/advanced_reboot'))
+    return
+  end
+  local step = tonumber(luci.http.formvalue("step") or 1)
+  if step == 1 then
+    if nixio.fs.access("/sbin/poweroff") then
+      luci.template.render("advanced_reboot/power_off",{})
+    else
+      luci.template.render("advanced_reboot/advanced_reboot",{})
+    end
+  elseif step == 2 then
+    luci.template.render("admin_system/applyreboot", {
+          title = luci.i18n.translate("Shutting down..."),
+          msg   = luci.i18n.translate("The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
+          addr  = luci.ip.new(uci.cursor():get("network", "lan", "ipaddr")) or "192.168.1.1"
+        })
+    luci.sys.call("/sbin/poweroff")
+  end
+end

+ 92 - 0
package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm

@@ -0,0 +1,92 @@
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2017 Stan Grishin <stangri@melmac.net>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<h2 name="content"><%:Advanced Reboot%></h2>
+<br />
+
+<%- local c = require("luci.model.uci").cursor():changes(); if c and next(c) then -%>
+	<p class="alert-message warning"><%:Warning: There are unsaved changes that will get lost on reboot!%></p>
+<%- end -%>
+
+<%- if device_name then -%>
+<fieldset class="cbi-section">
+  <legend><%=device_name%><%: Partitions%></legend>
+  <table class="cbi-section-table" id="partitions">
+    <tr class="cbi-section-table-titles">
+      <th class="cbi-section-table-cell"><%:Partition%></th>
+      <th class="cbi-section-table-cell"><%:Status%></th>
+      <th class="cbi-section-table-cell"><%:Firmware/OS (Kernel)%></th>
+      <th class="cbi-section-table-cell"><%:Action%></th>
+    </tr>
+    <tr class="cbi-section-table-row">
+      <td>
+        <%=boot_envvar1_partition_one%>
+      </td>
+      <td>
+        <%- if boot_envvar1_partition_one == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
+      </td>
+      <td>
+        <%=partition_one_os%>
+      </td>
+      <td>
+        <%- if boot_envvar1_partition_one == current_partition then -%>
+        <form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
+          <input type="hidden" name="token" value="<%=token%>" />
+          <input id="reboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to current partition%>" />
+        </form>
+      <%- else -%>
+      <form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
+        <input type="hidden" name="token" value="<%=token%>" />
+        <input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
+      </form>
+        <%- end -%>
+      </td>
+    </tr>
+    <tr class="cbi-section-table-row">
+      <td>
+        <%=boot_envvar1_partition_two%>
+      </td>
+      <td>
+        <%- if boot_envvar1_partition_two == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
+      </td>
+      <td>
+        <%=partition_two_os%>
+      </td>
+      <td>
+        <%- if boot_envvar1_partition_two == current_partition then -%>
+          <form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
+          	<input type="hidden" name="token" value="<%=token%>" />
+            <input id="reboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to current partition%>" />
+          </form>
+        <%- else -%>
+        <form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
+          <input type="hidden" name="token" value="<%=token%>" />
+          <input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
+        </form>
+        <%- end -%>
+      </td>
+    </tr>
+  </table>
+</fieldset>
+<%- else -%>
+  <p class="alert-message warning"><%:Warning: This system does not have two partitions!%></p>
+<%- end -%>
+
+<hr />
+
+<%- if nixio.fs.access("/sbin/poweroff") then -%>
+<form method="post" action="<%=url('admin/system/advanced_reboot/power_off')%>">
+	<input type="hidden" name="token" value="<%=token%>" />
+  <input id="poweroff-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Perform power off...%>" />
+</form>
+<%- else -%>
+  <p class="alert-message warning"><%:Warning: This system does not support powering off!%></p>
+<%- end -%>
+
+<%+footer%>

+ 29 - 0
package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/alternative_reboot.htm

@@ -0,0 +1,29 @@
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2017 Stan Grishin <stangri@melmac.net>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<h2 name="content"><%:Reboot Device to an Alternative Partition%> - <%:Confirm%></h2>
+<p>
+	<%_ WARNING: An alternative partition might have its own settings and completely different firmware.<br /><br />
+    As your network configuration and WiFi SSID/password on alternative partition might be different,
+      you might have to adjust your computer settings to be able to access your device once it reboots.<br /><br />
+    Please also be aware that alternative partition firmware might not provide an easy way to switch active partition
+      and boot back to the currently active partition.<br /><br />
+		Click "Proceed" below to reboot device to an alternative partition. %>
+</p>
+
+<div class="cbi-page-actions right">
+	<form class="inline" action="<%=REQUEST_URI%>" method="post">
+		<input type="hidden" name="token" value="<%=token%>" />
+		<input type="hidden" name="step" value="2" />
+		<input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
+		<input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
+	</form>
+</div>
+
+<%+footer%>

+ 25 - 0
package/luci/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/power_off.htm

@@ -0,0 +1,25 @@
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2017 Stan Grishin <stangri@melmac.net>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<h2 name="content"><%:Power Off Device%> - <%:Confirm%></h2>
+<p>
+	<%_ WARNING: Power off might result in a reboot on a device which doesn't support power off.<br /><br />
+		Click "Proceed" below to power off your device. %>
+</p>
+
+<div class="cbi-page-actions right">
+	<form class="inline" action="<%=REQUEST_URI%>" method="post">
+		<input type="hidden" name="token" value="<%=token%>" />
+		<input type="hidden" name="step" value="2" />
+		<input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
+		<input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
+	</form>
+</div>
+
+<%+footer%>

+ 108 - 0
package/luci/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po

@@ -0,0 +1,108 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Action"
+msgstr "Åtgärd"
+
+msgid "Advanced Reboot"
+msgstr "Avancerad omstart"
+
+msgid "Alternative"
+msgstr "Alternativ"
+
+msgid "Cancel"
+msgstr "Avbryt"
+
+msgid "Confirm"
+msgstr "Bekräfta"
+
+msgid "Current"
+msgstr "Nuvarande"
+
+msgid "Firmware/OS (Kernel)"
+msgstr "Inre mjukvara/OS (Kärna)"
+
+msgid "Partition"
+msgstr "Partition"
+
+msgid "Partitions"
+msgstr "Partitioner"
+
+msgid "Perform power off..."
+msgstr "Utför avstängning..."
+
+msgid "Power Off Device"
+msgstr "Stäng av enhet"
+
+msgid "Proceed"
+msgstr "Fortsätt"
+
+msgid "Reboot Device to an Alternative Partition"
+msgstr "Starta om enheten till en alternativ partition"
+
+msgid "Reboot to alternative partition..."
+msgstr "Starta om till alternativ partition..."
+
+msgid "Reboot to current partition"
+msgstr "Starta om till nuvarande partition"
+
+msgid "Rebooting..."
+msgstr "Startar om..."
+
+msgid "Shutting down..."
+msgstr "Stänger av..."
+
+msgid "Status"
+msgstr "Status"
+
+msgid ""
+"The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
+"few minutes before you try to reconnect. It might be necessary to renew the "
+"address of your computer to reach the device again, depending on your "
+"settings."
+msgstr ""
+
+msgid ""
+"The system is rebooting to an alternative partition now.<br /> DO NOT POWER "
+"OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It "
+"might be necessary to renew the address of your computer to reach the device "
+"again, depending on your settings."
+msgstr ""
+
+msgid ""
+"The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It "
+"might be necessary to renew the address of your computer to reach the device "
+"again, depending on your settings."
+msgstr ""
+"Systemet stänger ner nu.<br /> STÄNG INTE AV ENHETEN!<br /> Beroende 
+"på dina inställningar så kan det vara nödvändigt att förnya din dators adress "
+"för att nå enheten igen."
+
+msgid ""
+"WARNING: An alternative partition might have its own settings and completely "
+"different firmware.<br /><br /> As your network configuration and WiFi SSID/"
+"password on alternative partition might be different, you might have to "
+"adjust your computer settings to be able to access your device once it "
+"reboots.<br /><br /> Please also be aware that alternative partition "
+"firmware might not provide an easy way to switch active partition and boot "
+"back to the currently active partition.<br /><br /> Click \"Proceed\" below "
+"to reboot device to an alternative partition."
+msgstr ""
+
+msgid ""
+"WARNING: Power off might result in a reboot on a device which doesn't "
+"support power off.<br /><br /> Click \"Proceed\" below to power off your "
+"device."
+msgstr ""
+"VARNING: Att stänga av kan resultera i en omstart i en enhet som inte "
+"har stöd för avstängning.<br /><br /> Klicka på \"Fortsätt\" nedanför för att stänga av din "
+"enhet."
+
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr "Varning: Det finns osparade ändringar som kommer att förloras vid omstart!"
+
+msgid "Warning: This system does not have two partitions!"
+msgstr "Varning: Det här systemet har inte två partitioner!"
+
+msgid "Warning: This system does not support powering off!"
+msgstr "Varning: Det här systemet har inte stöd för avstängning!"

+ 102 - 0
package/luci/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot

@@ -0,0 +1,102 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Action"
+msgstr ""
+
+msgid "Advanced Reboot"
+msgstr ""
+
+msgid "Alternative"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Firmware/OS (Kernel)"
+msgstr ""
+
+msgid "Partition"
+msgstr ""
+
+msgid "Partitions"
+msgstr ""
+
+msgid "Perform power off..."
+msgstr ""
+
+msgid "Power Off Device"
+msgstr ""
+
+msgid "Proceed"
+msgstr ""
+
+msgid "Reboot Device to an Alternative Partition"
+msgstr ""
+
+msgid "Reboot to alternative partition..."
+msgstr ""
+
+msgid "Reboot to current partition"
+msgstr ""
+
+msgid "Rebooting..."
+msgstr ""
+
+msgid "Shutting down..."
+msgstr ""
+
+msgid "Status"
+msgstr ""
+
+msgid ""
+"The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
+"few minutes before you try to reconnect. It might be necessary to renew the "
+"address of your computer to reach the device again, depending on your "
+"settings."
+msgstr ""
+
+msgid ""
+"The system is rebooting to an alternative partition now.<br /> DO NOT POWER "
+"OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It "
+"might be necessary to renew the address of your computer to reach the device "
+"again, depending on your settings."
+msgstr ""
+
+msgid ""
+"The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It "
+"might be necessary to renew the address of your computer to reach the device "
+"again, depending on your settings."
+msgstr ""
+
+msgid ""
+"WARNING: An alternative partition might have its own settings and completely "
+"different firmware.<br /><br /> As your network configuration and WiFi SSID/"
+"password on alternative partition might be different, you might have to "
+"adjust your computer settings to be able to access your device once it "
+"reboots.<br /><br /> Please also be aware that alternative partition "
+"firmware might not provide an easy way to switch active partition and boot "
+"back to the currently active partition.<br /><br /> Click \"Proceed\" below "
+"to reboot device to an alternative partition."
+msgstr ""
+
+msgid ""
+"WARNING: Power off might result in a reboot on a device which doesn't "
+"support power off.<br /><br /> Click \"Proceed\" below to power off your "
+"device."
+msgstr ""
+
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
+
+msgid "Warning: This system does not have two partitions!"
+msgstr ""
+
+msgid "Warning: This system does not support powering off!"
+msgstr ""

+ 5 - 1
package/luci/applications/luci-app-ahcp/po/sv/ahcp.po

@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "PO-Revision-Date: 2014-04-27 22:52+0200\n"
-"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
+"Last-Translator: Umeaboy <hamnisdude@gmail.com>\n"
 "Language-Team: none\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
@@ -20,6 +20,10 @@ msgid ""
 "networks where it is difficult or impossible to configure a server within "
 "every link-layer broadcast domain, for example mobile ad-hoc networks."
 msgstr ""
+"AHCP är ett autokonfigurationsprotokoll för IPv6 och dual-stack IPv6/IPv4- "
+"nätverk designade för att användas vid upptäckt av router eller DHCP på "
+"nätverk där det är svårt eller omöjligt att ställa in en server inom "
+"varje sändningslänkslags-domän, till exempel mobila ad-hocnätverk."
 
 msgid "Active AHCP Leases"
 msgstr "Aktiva AHCP-hyror"

+ 208 - 0
package/luci/applications/luci-app-aria2/po/sv/aria2.po

@@ -0,0 +1,208 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "\"Falloc\" is not available in all cases."
+msgstr ""
+
+msgid "<abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"
+msgstr ""
+
+msgid "<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled"
+msgstr ""
+
+msgid "Additional Bt tracker enabled"
+msgstr ""
+
+msgid "Aria2"
+msgstr "Aria2"
+
+msgid "Aria2 Settings"
+msgstr "Inställningar för Aria2"
+
+msgid "Aria2 Status"
+msgstr "Status för Aria2"
+
+msgid ""
+"Aria2 is a multi-protocol &amp; multi-source download utility, here you can "
+"configure the settings."
+msgstr ""
+
+msgid "Autosave session interval"
+msgstr "Autospara sessionintervall"
+
+msgid "BitTorrent Settings"
+msgstr "Inställningar för BitTorrent"
+
+msgid "BitTorrent listen port"
+msgstr "Lyssningsport för BitTorrent"
+
+msgid "Collecting data..."
+msgstr "Samlar in data..."
+
+msgid "Config file directory"
+msgstr "Ställ in fil-mapp"
+
+msgid "Debug"
+msgstr "Avlusa"
+
+msgid "Default download directory"
+msgstr "Standard nerladdningsmapp"
+
+msgid "Disk cache"
+msgstr "Disk-cache"
+
+msgid "Enable log"
+msgstr "Aktivera logg"
+
+msgid "Enabled"
+msgstr "Aktiverad"
+
+msgid "Error"
+msgstr "Fel"
+
+msgid "Extra Settings"
+msgstr "Extra inställningar"
+
+msgid "Falloc"
+msgstr "Falloc"
+
+msgid "Files and Locations"
+msgstr "Filer och Platser"
+
+msgid "Follow torrent"
+msgstr "Följ torrenten"
+
+msgid "General Settings"
+msgstr "Generella inställningar"
+
+msgid "Generate Randomly"
+msgstr "Generera slumpmässigt"
+
+msgid "Info"
+msgstr "Info"
+
+msgid "List of additional Bt tracker"
+msgstr "Lista över extra Bt-tracker"
+
+msgid "List of extra settings"
+msgstr "Lista över extra inställningar"
+
+msgid "Log file is in the config file dir."
+msgstr "Logg-filen är i konfigurationsfilens mapp."
+
+msgid "Log level"
+msgstr "Loggnivå"
+
+msgid "Max concurrent downloads"
+msgstr "Maximalt sammanhängande nerladdningar"
+
+msgid "Max connection per server"
+msgstr "Max antalet anslutningar per server"
+
+msgid "Max number of peers per torrent"
+msgstr "Maximalt antalet jämlikar per torrent"
+
+msgid "Max number of split"
+msgstr "Högst antal split"
+
+msgid "Min split size"
+msgstr "Minsta split-storlek"
+
+msgid "No Authentication"
+msgstr "Ingen autentisering"
+
+msgid "Notice"
+msgstr "Avisering"
+
+msgid "Off"
+msgstr "Av"
+
+msgid "Open WebUI-Aria2"
+msgstr "Öppna WebUI-Aria2"
+
+msgid "Open YAAW"
+msgstr "Öppna YAAW"
+
+msgid "Overall download limit"
+msgstr ""
+
+msgid "Overall speed limit enabled"
+msgstr ""
+
+msgid "Overall upload limit"
+msgstr ""
+
+msgid "Per task download limit"
+msgstr ""
+
+msgid "Per task speed limit enabled"
+msgstr ""
+
+msgid "Per task upload limit"
+msgstr ""
+
+msgid "Prealloc"
+msgstr "Prealloc"
+
+msgid "Preallocation"
+msgstr "Förallokering"
+
+msgid "Prefix of peer ID"
+msgstr "Peer-ID prefix"
+
+msgid "RPC Token"
+msgstr ""
+
+msgid "RPC authentication method"
+msgstr ""
+
+msgid "RPC password"
+msgstr "RPC-lösenord"
+
+msgid "RPC port"
+msgstr "RPC-port"
+
+msgid "RPC username"
+msgstr "RPC-användarnamn"
+
+msgid "Run daemon as user"
+msgstr "Kör daemonen som användare"
+
+msgid "Sec"
+msgstr "Sek"
+
+msgid "Task Settings"
+msgstr "Inställningar för uppgifter"
+
+msgid "The Aria2 service is not running."
+msgstr "Aria2-tjänsten körs inte."
+
+msgid "The Aria2 service is running."
+msgstr "Aria2-tjänsten körs."
+
+msgid "Token"
+msgstr "Tecken"
+
+msgid "Trunc"
+msgstr ""
+
+msgid "Use WebSocket"
+msgstr "Använd WebSocket"
+
+msgid "User agent value"
+msgstr "Använd agent-värde"
+
+msgid "Username & Password"
+msgstr "Användarnamn & Lösenord"
+
+msgid "View Json-RPC URL"
+msgstr "Visa Json-RPC URL"
+
+msgid "Warn"
+msgstr "Varna"
+
+msgid "in bytes, You can append K or M."
+msgstr "i bytes, Du kan bifoga K eller M."
+
+msgid "in bytes/sec, You can append K or M."
+msgstr "i bytes/sek, Du kan bifoga K eller M."

+ 11 - 0
package/luci/applications/luci-app-attendedsysupgrade/Makefile

@@ -0,0 +1,11 @@
+# See /LICENSE for more information.
+# This is free software, licensed under the GNU General Public License v2.
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI support for attended sysupgrades
+LUCI_DEPENDS:=+luci-base +uhttpd-mod-ubus +rpcd-mod-attendedsysupgrade
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 5 - 0
package/luci/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua

@@ -0,0 +1,5 @@
+module("luci.controller.attendedsysupgrade", package.seeall)
+
+function index()
+        entry({"admin", "system", "attended_sysupgrade"}, template("attendedsysupgrade"), _("Attended Sysupgrade"), 1)
+end

+ 376 - 0
package/luci/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm

@@ -0,0 +1,376 @@
+<%
+-- all lua code provided by https://github.com/jow-/
+-- thank you very much!
+
+    function apply_acls(filename, session)
+        local json = require "luci.jsonc"
+        local util = require "luci.util"
+        local fs   = require "nixio.fs"
+
+        local grants = { }
+
+        local acl = json.parse(fs.readfile(filename))
+        if type(acl) ~= "table" then
+            return
+        end
+
+        local group, perms
+        for group, perms in pairs(acl) do
+            local perm, scopes
+            for perm, scopes in pairs(perms) do
+                if type(scopes) == "table" then
+                    local scope, objects
+                    for scope, objects in pairs(scopes) do
+                        if type(objects) == "table" then
+                            if not grants[scope] then
+                                grants[scope] = { }
+                            end
+
+                            if next(objects) == 1 then
+                                local _, object
+                                for _, object in ipairs(objects) do
+                                    if not grants[scope][object] then
+                                        grants[scope][object] = { }
+                                    end
+                                    table.insert(grants[scope][object], perm)
+                                end
+                            else
+                                local object, funcs
+                                for object, funcs in pairs(objects) do
+                                    if type(funcs) == "table" then
+                                        local _, func
+                                        for _, func in ipairs(funcs) do
+                                            if not grants[scope][object] then
+                                                grants[scope][object] = { }
+                                            end
+                                            table.insert(grants[scope][object], func)
+                                        end
+                                    end
+                                end
+                            end
+                        end
+                    end
+                end
+            end
+        end
+
+        local _, scope, object, func
+        for scope, _ in pairs(grants) do
+            local objects = { }
+            for object, _ in pairs(_) do
+                for _, func in ipairs(_) do
+                    table.insert(objects, { object, func })
+                end
+            end
+
+            util.ubus("session", "grant", {
+                ubus_rpc_session = session,
+                scope = scope, objects = objects
+            })
+        end
+    end
+
+    apply_acls("/usr/share/rpcd/acl.d/attendedsysupgrade.json", luci.dispatcher.context.authsession)
+    apply_acls("/usr/share/rpcd/acl.d/packagelist.json", luci.dispatcher.context.authsession)
+%>
+<%+header%>
+<h2 name="content"><%:Attended Sysupgrade%></h2>
+<div class="container">
+	<div style="display: none" id="update_info" class="alert-message info"></div>
+	<div style="display: none" id="update_error" class="alert-message danger"></div>
+</div>
+<input class="cbi-button" value="search for updates" onclick="update_request()" type="button" id="update_button">
+<div style="display: none" id="packages" class="alert-message success"></div>
+<div class="cbi-value" id="update_packages_container" style="display: block">
+	<label class="cbi-value-title" for="keep">search for package updates:</label>
+	<div class="cbi-value-field">
+		<input type="checkbox" name="update_packages" id="update_packages" />
+	</div>
+</div>
+<div class="cbi-value" id="keep_container" style="display: none">
+	<label class="cbi-value-title" for="keep">keep settings:</label>
+	<div class="cbi-value-field">
+		<input type="checkbox" name="keep" id="keep" checked="checked" />
+	</div>
+</div>
+
+<script type="text/javascript">
+
+latest_version = "";
+data = {};
+ubus_counter = 1
+origin = document.location.href.replace(location.pathname, "")
+ubus_url = origin + "/ubus/"
+
+// requests to the update server
+function server_request(request_dict, path, callback) {
+	url = data.update_server + "/" + path
+	request_dict.distro = data.release.distribution;
+	request_dict.target = data.release.target.split("\/")[0];
+	request_dict.subtarget = data.release.target.split("\/")[1];
+	var xmlhttp = new XMLHttpRequest();
+	xmlhttp.open("POST", url, true);
+	xmlhttp.setRequestHeader("Content-type", "application/json");
+	xmlhttp.send(JSON.stringify(request_dict));
+	xmlhttp.onerror = function(e) {
+		update_error("update server down")
+	}
+	xmlhttp.addEventListener('load', function(event) {
+		callback(xmlhttp)
+	});
+}
+
+// requests ubus via rpcd
+function ubus_request(command, argument, params, callback) {
+	request_data = {};
+	request_data.jsonrpc = "2.0";
+	request_data.id = ubus_counter;
+	request_data.method = "call";
+	request_data.params = [ data.ubus_rpc_session, command, argument, params ]
+	ubus_counter++
+	var xmlhttp = new XMLHttpRequest();
+	xmlhttp.open("POST", ubus_url, true);
+	xmlhttp.setRequestHeader("Content-type", "application/json");
+	xmlhttp.onerror = function(e) {
+		setTimeout(back_online, 5000)
+	}
+	xmlhttp.addEventListener('load', function(event) {
+		if(command === "uci") {
+			ubus_request_callback_uci(xmlhttp, callback)
+		} else {
+			ubus_request_callback(xmlhttp, callback)
+		}
+	});
+	xmlhttp.send(JSON.stringify(request_data));
+}
+
+// handle ubus_requests, set variables or perform functions
+function ubus_request_callback(response_object, callback) {
+	if(response_object.status === 200) {
+		console.log(callback)
+		if(typeof callback === "string") {
+			response_json = JSON.parse(response_object.responseText).result[1]
+			if (callback == "release") {
+				latest_version = response_json.release.version
+			}
+			data[callback] = response_json[callback]
+		} else {
+			callback(response_object)
+		}
+	} else {
+		console.log(respons_object.responseText)
+	}
+}
+
+function ubus_request_callback_uci(response_object, callback) {
+	if(response_object.status === 200) {
+		console.log(callback)
+		response_json = JSON.parse(response_object.responseText).result[1].value
+		data[callback] = response_json
+
+		document.getElementById("update_packages").checked = data.update_packages;
+	} else {
+		console.log(respons_object.responseText)
+	}
+}
+
+// initial setup, get system information
+function setup() {
+	data["ubus_rpc_session"] = "<%=luci.dispatcher.context.authsession%>"
+	ubus_request("packagelist", "list", {}, "packagelist");
+	ubus_request("system", "board", {}, "release");
+	ubus_request("system", "board", {}, "board_name");
+	ubus_request("system", "board", {}, "model");
+	ubus_request("uci", "get", { "config": "attendedsysupgrade", "section": "updateserver", "option": "url" }, "update_server")
+	ubus_request("uci", "get", { "config": "attendedsysupgrade", "section": "updateclient", "option": "update_packages" }, "update_packages")
+}
+
+// shows notification if update is available
+function update_info(info_output) {
+	document.getElementById("update_info").style.display = "block";
+	document.getElementById("update_info").innerHTML = info_output;
+}
+
+function update_error(error_output) {
+	document.getElementById("update_error").style.display = "block";
+	document.getElementById("update_error").innerHTML = error_output;
+	document.getElementById("update_info").style.display = "none";
+}
+
+// asks server for news updates, actually only based on relesae not packages
+function update_request() {
+	console.log("update_request")
+	request_dict = {}
+	request_dict.version = data.release.version;
+	request_dict.packages = data.packagelist;
+	if (document.getElementById("update_packages").checked == 1) {
+		request_dict.update_packages = 1
+	}
+	server_request(request_dict, "update-request", update_request_callback)
+}
+
+function update_request_callback(response_object) {
+	if (response_object.status === 500) {
+		// python crashed
+		update_error("internal server error, please try again later")
+		console.log("update server issue")
+	} else if (response_object.status === 502) {
+		// python part offline
+		update_error("internal server error, please try again later")
+		console.log("update server issue")
+	} else if (response_object.status === 503) {
+		// handle overload
+		update_error("server overloaded, retry in 5 minutes")
+		console.log("server overloaded")
+		setTimeout(update_request, 300000)
+	} else if (response_object.status === 201) {
+		update_info("imagebuilder not ready, please wait")
+		console.log("setting up imagebuilder")
+		setTimeout(update_request, 5000)
+	} else if (response_object.status === 204) {
+		// no updates
+		update_info("no updates available")
+	} else if (response_object.status === 400) {
+		// bad request
+		console.log(response_object.responseText)
+		response_object_content = JSON.parse(response_object.responseText)
+		update_error(response_object_content.error)
+	} else if (response_object.status === 200) {
+		// new release/updates
+		response_object_content = JSON.parse(response_object.responseText)
+		update_request_200(response_object_content)
+	}
+}
+
+function back_online() {
+	ubus_request("session", "login", {}, back_online_callback)
+}
+
+function back_online_callback(response_object) {
+	if (response_object.status != 200) {
+		setTimeout(back_online, 5000)
+	} else {
+		update_info("upgrade successfull!")
+		document.getElementById("update_button").value = "reload page";
+		document.getElementById("update_button").onclick = function() { location.reload(); }
+	}
+
+}
+
+function update_request_200(response_content) {
+	info_output = ""
+	if(response_content.version != undefined) {
+		info_output += "<h3>new update available</h3>"
+		info_output += data.release.version + " to " + response_content.version
+		latest_version = response_content.version;
+	}
+	if(response_content.updates != undefined) {
+		info_output += "<h3>package updates available</h3>"
+		for (update in response_content.updates) {
+			info_output += "<b>" + update + "</b>: " + response_content.updates[update][1] + " to " + response_content.updates[update][0] + "</br>"
+		}
+	}
+	data.packages = response_content.packages
+	update_info(info_output)
+	document.getElementById("update_button").value = "request image";
+	document.getElementById("update_packages_container").style.display = "none";
+	document.getElementById("update_button").onclick = image_request;
+}
+
+// request the image, need merge with update_request
+function image_request() {
+	console.log("image_request")
+	document.getElementById("update_packages_container").style.display = "none";
+	request_dict = {}
+	request_dict.version = latest_version;
+	request_dict.board = data.board_name
+	request_dict.packages = data.packages;
+	request_dict.model = data.model
+	server_request(request_dict, "image-request", image_request_handler)
+}
+
+function image_request_handler(response) {
+	if (response.status === 400) {
+		response_content = JSON.parse(response.responseText)
+		update_error(response_content.error)
+	} else if (response.status === 500) {
+		image_request_500()
+	} else if (response.status === 503) {
+		update_error("please wait. server overloaded")
+		// handle overload
+		setTimeout(image_request, 30000)
+	} else if (response.status === 201) {
+		response_content = JSON.parse(response.responseText)
+		if(response_content.queue != undefined) {
+			// in queue
+			update_info("please wait. you are in queue position " + response_content.queue)
+			console.log("queued")
+		} else {
+			update_info("imagebuilder not ready, please wait")
+			console.log("setting up imagebuilder")
+		}
+		setTimeout(image_request, 5000)
+	} else if (response.status === 206) {
+		// building
+		console.log("building")
+		update_info("building image")
+		setTimeout(image_request, 5000)
+	} else if (response.status === 200) {
+		// ready to download
+		response_content = JSON.parse(response.responseText)
+		update_info("image created")
+		document.getElementById("update_button").value = "sysupgrade"
+		document.getElementById("update_button").onclick = function() {download_image(response_content.url); }
+		document.getElementById("keep_container").style.display = "block";
+	}
+}
+
+
+// uploads received blob data to the server using cgi-io
+function upload_image(blob) {
+	var upload_request = new XMLHttpRequest();
+	var form_data  = new FormData();
+
+	form_data.append("sessionid", data.ubus_rpc_session)
+	form_data.append("filename", "/tmp/sysupgrade.bin")
+	form_data.append("filemode", 755) // insecure?
+	form_data.append("filedata", blob)
+
+	upload_request.addEventListener('load', function(event) {
+		// this checksum should be parsed
+		document.getElementById("update_info").innerHTML = "flashing... please wait" // show fancy indicator http://www.ajaxload.info/
+
+		ubus_request("attendedsysupgrade", "sysupgrade", { "keep_settings": document.getElementById("keep").checked }, 'done');
+  	});
+
+  	upload_request.addEventListener('error', function(event) {
+		document.getElementById("update_info").innerHTML = "uploading failed, please retry"
+  	});
+
+  	upload_request.open('POST', origin + '/cgi-bin/cgi-upload');
+  	upload_request.send(form_data);
+}
+
+// download image from server once the url was received by image_request
+function download_image(url) {
+	console.log("download_image")
+	document.getElementById("update_button").value = "flashing..."
+	document.getElementById("update_button").disabled = true;
+	var download_request = new XMLHttpRequest();
+	download_request.open("GET", url);
+	download_request.responseType = "arraybuffer";
+
+	download_request.onload = function () {
+		if (this.status === 200) {
+			var blob = new Blob([download_request.response], {type: "application/octet-stream"});
+			upload_image(blob)
+		}
+	};
+	document.getElementById("update_info").innerHTML = "downloading image"
+	download_request.send();
+}
+
+document.onload = setup()
+</script>
+
+<%+footer%>

+ 18 - 0
package/luci/applications/luci-app-bcp38/Makefile

@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2010 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=BCP38 LuCI interface
+LUCI_DEPENDS:=+luci-mod-admin-full +bcp38
+
+PKG_MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 7 - 0
package/luci/applications/luci-app-bcp38/luasrc/controller/bcp38.lua

@@ -0,0 +1,7 @@
+module("luci.controller.bcp38", package.seeall)
+
+function index()
+	entry({"admin", "network", "firewall", "bcp38"},
+		cbi("bcp38"),
+		_("BCP38"), 50).dependent = false
+end

+ 60 - 0
package/luci/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua

@@ -0,0 +1,60 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2014 Toke Høiland-Jørgensen <toke@toke.dk>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local wa = require "luci.tools.webadmin"
+local net = require "luci.model.network".init()
+local ifaces = net:get_interfaces()
+
+m = Map("bcp38", translate("BCP38"),
+	translate("This function blocks packets with private address destinations " ..
+		"from going out onto the internet as per " ..
+		"<a href=\"http://tools.ietf.org/html/bcp38\">BCP 38</a>. " ..
+		"For IPv6, only source specific default routes are installed, so " ..
+		"no BCP38 firewall routes are needed."))
+
+s = m:section(TypedSection, "bcp38", translate("BCP38 config"))
+s.anonymous = true
+-- BASIC
+e = s:option(Flag, "enabled", translate("Enable"))
+e.rmempty = false
+
+a = s:option(Flag, "detect_upstream", translate("Auto-detect upstream IP"),
+				translate("Attempt to automatically detect if the upstream IP " ..
+					"will be blocked by the configuration, and add an exception if it will. " ..
+					"If this does not work correctly, you can add exceptions manually below."))
+a.rmempty = false
+
+n = s:option(ListValue, "interface", translate("Interface name"), translate("Interface to apply the blocking to " ..
+							"(should be the upstream WAN interface)."))
+for _, iface in ipairs(ifaces) do
+     if iface:is_up() then
+	n:value(iface:name())
+     end
+end
+n.rmempty = false
+
+ma = s:option(DynamicList, "match",
+	translate("Blocked IP ranges"))
+
+ma.datatype = "ip4addr"
+
+nm = s:option(DynamicList, "nomatch",
+	translate("Allowed IP ranges"), translate("Takes precedence over blocked ranges. "..
+						  "Use to whitelist your upstream network if you're behind a double NAT " ..
+						  "and the auto-detection doesn't work."))
+
+nm.datatype = "ip4addr"
+
+
+return m

+ 45 - 0
package/luci/applications/luci-app-bcp38/po/sv/bcp38.po

@@ -0,0 +1,45 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "Allowed IP ranges"
+msgstr ""
+
+msgid ""
+"Attempt to automatically detect if the upstream IP will be blocked by the "
+"configuration, and add an exception if it will. If this does not work "
+"correctly, you can add exceptions manually below."
+msgstr ""
+
+msgid "Auto-detect upstream IP"
+msgstr "Upptäck automatiskt IP från uppströms"
+
+msgid "BCP38"
+msgstr "BCP38"
+
+msgid "BCP38 config"
+msgstr ""
+
+msgid "Blocked IP ranges"
+msgstr ""
+
+msgid "Enable"
+msgstr "Aktivera"
+
+msgid "Interface name"
+msgstr "Namn på gränssnittet"
+
+msgid ""
+"Interface to apply the blocking to (should be the upstream WAN interface)."
+msgstr ""
+
+msgid ""
+"Takes precedence over blocked ranges. Use to whitelist your upstream network "
+"if you're behind a double NAT and the auto-detection doesn't work."
+msgstr ""
+
+msgid ""
+"This function blocks packets with private address destinations from going "
+"out onto the internet as per <a href=\"http://tools.ietf.org/html/"
+"bcp38\">BCP 38</a>. For IPv6, only source specific default routes are "
+"installed, so no BCP38 firewall routes are needed."
+msgstr ""

+ 45 - 0
package/luci/applications/luci-app-bcp38/po/templates/bcp38.pot

@@ -0,0 +1,45 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Allowed IP ranges"
+msgstr ""
+
+msgid ""
+"Attempt to automatically detect if the upstream IP will be blocked by the "
+"configuration, and add an exception if it will. If this does not work "
+"correctly, you can add exceptions manually below."
+msgstr ""
+
+msgid "Auto-detect upstream IP"
+msgstr ""
+
+msgid "BCP38"
+msgstr ""
+
+msgid "BCP38 config"
+msgstr ""
+
+msgid "Blocked IP ranges"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Interface name"
+msgstr ""
+
+msgid ""
+"Interface to apply the blocking to (should be the upstream WAN interface)."
+msgstr ""
+
+msgid ""
+"Takes precedence over blocked ranges. Use to whitelist your upstream network "
+"if you're behind a double NAT and the auto-detection doesn't work."
+msgstr ""
+
+msgid ""
+"This function blocks packets with private address destinations from going "
+"out onto the internet as per <a href=\"http://tools.ietf.org/html/"
+"bcp38\">BCP 38</a>. For IPv6, only source specific default routes are "
+"installed, so no BCP38 firewall routes are needed."
+msgstr ""

+ 52 - 0
package/luci/applications/luci-app-bcp38/po/zh-cn/bcp38.po

@@ -0,0 +1,52 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "Allowed IP ranges"
+msgstr "允许的 IP 范围"
+
+msgid ""
+"Attempt to automatically detect if the upstream IP will be blocked by the "
+"configuration, and add an exception if it will. If this does not work "
+"correctly, you can add exceptions manually below."
+msgstr ""
+"自动检测上游 IP 是否会被当前配置所阻止,当检测到会被阻止时将会添加例外。如果"
+"自动检测无法正常工作,你可以在下面手动添加例外。"
+
+msgid "Auto-detect upstream IP"
+msgstr "自动检测上游 IP"
+
+msgid "BCP38"
+msgstr "BCP38"
+
+msgid "BCP38 config"
+msgstr "BCP38 配置"
+
+msgid "Blocked IP ranges"
+msgstr "阻止的 IP 范围"
+
+msgid "Enable"
+msgstr "启用"
+
+msgid "Interface name"
+msgstr "接口名称"
+
+msgid ""
+"Interface to apply the blocking to (should be the upstream WAN interface)."
+msgstr "应用“阻止规则”的接口(应当为上游 WAN 接口)。"
+
+msgid ""
+"Takes precedence over blocked ranges. Use to whitelist your upstream network "
+"if you're behind a double NAT and the auto-detection doesn't work."
+msgstr ""
+"这里的规则优先于阻止规则被使用。如果你在双重 NAT 之后并且自动检测功能不起作"
+"用,请在这里添加你上游网络的白名单。"
+
+msgid ""
+"This function blocks packets with private address destinations from going "
+"out onto the internet as per <a href=\"http://tools.ietf.org/html/"
+"bcp38\">BCP 38</a>. For IPv6, only source specific default routes are "
+"installed, so no BCP38 firewall routes are needed."
+msgstr ""
+"此功能可以阻止具有私有目标地址的数据包通过 <a href=\"http://tools.ietf.org/"
+"html/bcp38\">BCP 38</a> 发送到互联网上。对于 IPv6,仅安装源特定的默认路由,因"
+"此不需要 BCP38 防火墙路由。"

+ 11 - 0
package/luci/applications/luci-app-bcp38/root/etc/uci-defaults/60_luci-bcp38

@@ -0,0 +1,11 @@
+#!/bin/sh
+
+uci -q batch <<-EOF >/dev/null
+	delete ucitrack.@bcp38[-1]
+	add ucitrack bcp38
+        add_list ucitrack.@bcp38[0].affects=firewall
+	commit ucitrack
+EOF
+
+rm -f /tmp/luci-indexcache
+exit 0

+ 18 - 0
package/luci/applications/luci-app-clamav/Makefile

@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=ClamAV LuCI interface
+LUCI_DEPENDS:=+luci-mod-admin-full +clamav
+
+PKG_MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 22 - 0
package/luci/applications/luci-app-clamav/luasrc/controller/clamav.lua

@@ -0,0 +1,22 @@
+--[[
+
+LuCI ClamAV module
+
+Copyright (C) 2015, Itus Networks, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
+	Luka Perkov <luka.perkov@sartura.hr>
+
+]]--
+
+module("luci.controller.clamav", package.seeall)
+
+function index()
+	entry({"admin", "services", "clamav"}, cbi("clamav"), _("ClamAV"))
+end

+ 178 - 0
package/luci/applications/luci-app-clamav/luasrc/model/cbi/clamav.lua

@@ -0,0 +1,178 @@
+--[[
+
+LuCI ClamAV module
+
+Copyright (C) 2015, Itus Networks, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
+	Luka Perkov <luka.perkov@sartura.hr>
+
+]]--
+
+local fs = require "nixio.fs"
+local sys = require "luci.sys"
+require "ubus"
+
+m = Map("clamav", translate("ClamAV"))
+m.on_after_commit = function() luci.sys.call("/etc/init.d/clamav restart") end
+
+s = m:section(TypedSection, "clamav")
+s.anonymous = true
+s.addremove = false
+
+s:tab("tab_advanced", translate("Settings"))
+s:tab("tab_logs", translate("Log"))
+
+--------------- Settings --------------
+
+LogFileMaxSize = s:taboption("tab_advanced", Value, "LogFileMaxSize", translate("Max size of log file"))
+LogFileMaxSize:value("512K",  translate("512K"))
+LogFileMaxSize:value("1M",  translate("1M"))
+LogFileMaxSize:value("2M",  translate("2M"))
+LogFileMaxSize.default = "1M"
+
+LogTime = s:taboption("tab_advanced", ListValue, "LogTime", translate("Log time with each message"))
+LogTime:value("no",  translate("No"))
+LogTime:value("yes",  translate("Yes"))
+LogTime.default = "no"
+
+LogVerbose = s:taboption("tab_advanced", ListValue, "LogVerbose", translate("Enable verbose logging"))
+LogVerbose:value("no",  translate("No"))
+LogVerbose:value("yes",  translate("Yes"))
+LogVerbose.default = "no"
+
+ExtendedDetectionInfo = s:taboption("tab_advanced", ListValue, "ExtendedDetectionInfo", translate("Log additional infection info"))
+ExtendedDetectionInfo:value("no",  translate("No"))
+ExtendedDetectionInfo:value("yes",  translate("Yes"))
+ExtendedDetectionInfo.default = "no"
+
+dummy3 = s:taboption("tab_advanced", DummyValue, "")
+dummy4 = s:taboption("tab_advanced", DummyValue, "")
+
+MaxDirectoryRecursion = s:taboption("tab_advanced", Value, "MaxDirectoryRecursion", translate("Max directory scan depth"))
+MaxDirectoryRecursion:value("15",  translate("15"))
+MaxDirectoryRecursion:value("20",  translate("20"))
+MaxDirectoryRecursion.default = "15"
+
+FollowDirectorySymlink = s:taboption("tab_advanced", ListValue, "FollowDirectorySymlink", translate("Follow directory symlinks"))
+FollowDirectorySymlink:value("no",  translate("No"))
+FollowDirectorySymlink:value("yes",  translate("Yes"))
+FollowDirectorySymlink.default = "no"
+
+FollowFileSymlinks = s:taboption("tab_advanced", ListValue, "FollowFileSymlinks", translate("Follow file symlinks"))
+FollowFileSymlinks:value("no",  translate("No"))
+FollowFileSymlinks:value("yes",  translate("Yes"))
+FollowFileSymlinks.default = "no"
+
+DetectPUA = s:taboption("tab_advanced", ListValue, "DetectPUA", translate("Detect possibly unwanted apps"))
+DetectPUA:value("no",  translate("No"))
+DetectPUA:value("yes",  translate("Yes"))
+DetectPUA.default = "no"
+
+ScanPE = s:taboption("tab_advanced", ListValue, "ScanPE", translate("Scan portable executables"))
+ScanPE:value("no",  translate("No"))
+ScanPE:value("yes",  translate("Yes"))
+ScanPE.default = "yes"
+
+ScanELF = s:taboption("tab_advanced", ListValue, "ScanELF", translate("Scan ELF files"))
+ScanELF:value("no",  translate("No"))
+ScanELF:value("yes",  translate("Yes"))
+ScanELF.default = "yes"
+
+DetectBrokenExecutables = s:taboption("tab_advanced", ListValue, "DetectBrokenExecutables", translate("Detect broken executables"))
+DetectBrokenExecutables:value("no",  translate("No"))
+DetectBrokenExecutables:value("yes",  translate("Yes"))
+DetectBrokenExecutables.default = "no"
+
+ScanOLE2 = s:taboption("tab_advanced", ListValue, "ScanOLE2", translate("Scan MS Office and .msi files"))
+ScanOLE2:value("no",  translate("No"))
+ScanOLE2:value("yes",  translate("Yes"))
+ScanOLE2.default = "yes"
+
+ScanPDF = s:taboption("tab_advanced", ListValue, "ScanPDF", translate("Scan pdf files"))
+ScanPDF:value("no",  translate("No"))
+ScanPDF:value("yes",  translate("Yes"))
+ScanPDF.default = "yes"
+
+ScanSWF = s:taboption("tab_advanced", ListValue, "ScanSWF", translate("Scan swf files"))
+ScanSWF:value("no",  translate("No"))
+ScanSWF:value("yes",  translate("Yes"))
+ScanSWF.default = "yes"
+
+ScanMail = s:taboption("tab_advanced", ListValue, "ScanMail", translate("Scan emails"))
+ScanMail:value("no",  translate("No"))
+ScanMail:value("yes",  translate("Yes"))
+ScanMail.default = "yes"
+
+ScanPartialMessages = s:taboption("tab_advanced", ListValue, "ScanPartialMessages", translate("Scan RFC1341 messages split over many emails"))
+ScanPartialMessages:value("no",  translate("No"))
+ScanPartialMessages:value("yes",  translate("Yes"))
+ScanPartialMessages.default = "no"
+
+ScanArchive = s:taboption("tab_advanced", ListValue, "ScanArchive", translate("Scan archives"))
+ScanArchive:value("no",  translate("No"))
+ScanArchive:value("yes",  translate("Yes"))
+ScanArchive.default = "yes"
+
+ArchiveBlockEncrypted = s:taboption("tab_advanced", ListValue, "ArchiveBlockEncrypted", translate("Block encrypted archives"))
+ArchiveBlockEncrypted:value("no",  translate("No"))
+ArchiveBlockEncrypted:value("yes",  translate("Yes"))
+ArchiveBlockEncrypted.default = "no"
+
+dummy5 = s:taboption("tab_advanced", DummyValue, "")
+dummy6 = s:taboption("tab_advanced", DummyValue, "")
+
+StreamMinPort = s:taboption("tab_advanced", Value, "StreamMinPort", translate("Port range, lowest port"))
+StreamMinPort.datatype = "portrange"
+StreamMinPort:value("1024",translate("1024"))
+StreamMinPort.default = "1024"
+
+StreamMaxPort = s:taboption("tab_advanced", Value, "StreamMaxPort", translate("Port range, highest port"))
+StreamMaxPort.datatype = "portrange"
+StreamMaxPort:value("2048",translate("2048"))
+StreamMaxPort.default = "2048"
+
+MaxThreads = s:taboption("tab_advanced", Value, "MaxThreads", translate("Max number of threads"))
+MaxThreads.datatype = "and(uinteger,min(1))"
+MaxThreads:value("10",translate("10"))
+MaxThreads:value("20",translate("20"))
+MaxThreads.default = "10"
+
+SelfCheck = s:taboption("tab_advanced", Value, "SelfCheck", translate("Database check every N sec"))
+SelfCheck.datatype = "and(uinteger,min(1))"
+SelfCheck:value("600",translate("600"))
+SelfCheck.default = "600"
+
+MaxFileSize = s:taboption("tab_advanced", Value, "MaxFileSize", translate("Max size of scanned file"))
+MaxFileSize.datatype = "string"
+MaxFileSize:value("150M",translate("150M"))
+MaxFileSize:value("50M",translate("50M"))
+MaxFileSize.default = "150M"
+
+------------------ Log --------------------
+
+clamav_logfile = s:taboption("tab_logs", TextValue, "lines", "")
+clamav_logfile.wrap = "off"
+clamav_logfile.rows = 25
+clamav_logfile.rmempty = true
+
+function clamav_logfile.cfgvalue()
+	local uci = require "luci.model.uci".cursor_state()
+	local file = "/tmp/clamd.log"
+	if file then
+		return fs.readfile(file) or ""
+	else
+		return ""
+	end
+end
+
+function clamav_logfile.write()
+end
+
+return m

+ 130 - 0
package/luci/applications/luci-app-clamav/po/ja/clamav.po

@@ -0,0 +1,130 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.12\n"
+"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: ja\n"
+
+msgid "10"
+msgstr "10"
+
+msgid "1024"
+msgstr "1024"
+
+msgid "15"
+msgstr "15"
+
+msgid "150M"
+msgstr "150M"
+
+msgid "1M"
+msgstr "1M"
+
+msgid "20"
+msgstr "20"
+
+msgid "2048"
+msgstr "2048"
+
+msgid "2M"
+msgstr "2M"
+
+msgid "50M"
+msgstr "50M"
+
+msgid "512K"
+msgstr "512K"
+
+msgid "600"
+msgstr "600"
+
+msgid "Block encrypted archives"
+msgstr "暗号化されたアーカイブのブロック"
+
+msgid "ClamAV"
+msgstr "ClamAV"
+
+msgid "Database check every N sec"
+msgstr "データベース チェック間隔(秒)"
+
+msgid "Detect broken executables"
+msgstr "破損した実行ファイルの検出"
+
+msgid "Detect possibly unwanted apps"
+msgstr "不必要と思われるアプリケーションの検出"
+
+msgid "Enable verbose logging"
+msgstr "詳細なログの有効化"
+
+msgid "Follow directory symlinks"
+msgstr "ディレクトリ シンボリックリンクに従う"
+
+msgid "Follow file symlinks"
+msgstr "ファイル シンボリックリンクに従う"
+
+msgid "Log"
+msgstr "ログ"
+
+msgid "Log additional infection info"
+msgstr "追加の感染情報ログ"
+
+msgid "Log time with each message"
+msgstr "ログ メッセージ毎に時刻を付加"
+
+msgid "Max directory scan depth"
+msgstr "ディレクトリ スキャンの最大深度"
+
+msgid "Max number of threads"
+msgstr "スレッドの最大数"
+
+msgid "Max size of log file"
+msgstr "ログの最大サイズ"
+
+msgid "Max size of scanned file"
+msgstr ""
+
+msgid "No"
+msgstr "いいえ"
+
+msgid "Port range, highest port"
+msgstr "ポート範囲(上限)"
+
+msgid "Port range, lowest port"
+msgstr "ポート範囲(下限)"
+
+msgid "Scan ELF files"
+msgstr "ELF ファイルのスキャン"
+
+msgid "Scan MS Office and .msi files"
+msgstr "MS Office と .msi ファイルのスキャン"
+
+msgid "Scan RFC1341 messages split over many emails"
+msgstr ""
+
+msgid "Scan archives"
+msgstr "アーカイブのスキャン"
+
+msgid "Scan emails"
+msgstr "E-mailのスキャン"
+
+msgid "Scan pdf files"
+msgstr "PDF ファイルのスキャン"
+
+msgid "Scan portable executables"
+msgstr "ポータブル 実行ファイルのスキャン"
+
+msgid "Scan swf files"
+msgstr "SWF ファイルのスキャン"
+
+msgid "Settings"
+msgstr "設定"
+
+msgid "Yes"
+msgstr "はい"

+ 119 - 0
package/luci/applications/luci-app-clamav/po/sv/clamav.po

@@ -0,0 +1,119 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "10"
+msgstr "10"
+
+msgid "1024"
+msgstr "1024"
+
+msgid "15"
+msgstr "15"
+
+msgid "150M"
+msgstr "150M"
+
+msgid "1M"
+msgstr "1M"
+
+msgid "20"
+msgstr "20"
+
+msgid "2048"
+msgstr "2048"
+
+msgid "2M"
+msgstr "2M"
+
+msgid "50M"
+msgstr "50M"
+
+msgid "512K"
+msgstr "512K"
+
+msgid "600"
+msgstr "600"
+
+msgid "Block encrypted archives"
+msgstr "Blockera krypterade arkiv"
+
+msgid "ClamAV"
+msgstr "ClamAV"
+
+msgid "Database check every N sec"
+msgstr "Kontrollera databasen var N sek"
+
+msgid "Detect broken executables"
+msgstr "Upptäck trasiga exekverbara filer"
+
+msgid "Detect possibly unwanted apps"
+msgstr "Upptäck möjliga oönskade appar"
+
+msgid "Enable verbose logging"
+msgstr "Aktivera utförlig loggning"
+
+msgid "Follow directory symlinks"
+msgstr "Följ mappens symbollänkar"
+
+msgid "Follow file symlinks"
+msgstr "Följ symbollänkar för fil"
+
+msgid "Log"
+msgstr "Logg"
+
+msgid "Log additional infection info"
+msgstr "Logga ytterligare information om infektionen"
+
+msgid "Log time with each message"
+msgstr "Loggtid med varje meddelande"
+
+msgid "Max directory scan depth"
+msgstr ""
+
+msgid "Max number of threads"
+msgstr "Maximalt antalet trådar"
+
+msgid "Max size of log file"
+msgstr "Högsta storlek av loggfilen"
+
+msgid "Max size of scanned file"
+msgstr "Högsta storlek av skannad fil"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Port range, highest port"
+msgstr "Räckvidd för port, högsta port"
+
+msgid "Port range, lowest port"
+msgstr "Räckvidd för port, lägsta port"
+
+msgid "Scan ELF files"
+msgstr "Sök igenom ELF-filer"
+
+msgid "Scan MS Office and .msi files"
+msgstr "Sök igen MS Office och .msi-filer"
+
+msgid "Scan RFC1341 messages split over many emails"
+msgstr "Sök igen RFC1341-meddelanden uppdelade över många e-postmeddelanden"
+
+msgid "Scan archives"
+msgstr "Sök igenom arkiven"
+
+msgid "Scan emails"
+msgstr "Sök igenom e-postmeddelanden"
+
+msgid "Scan pdf files"
+msgstr "Sök igenom pdf-filer"
+
+msgid "Scan portable executables"
+msgstr "Sök igenom bärbara exekverbara filer"
+
+msgid "Scan swf files"
+msgstr "Sök igenom swf-filer"
+
+msgid "Settings"
+msgstr "Inställningar"
+
+msgid "Yes"
+msgstr "Ja"

+ 119 - 0
package/luci/applications/luci-app-clamav/po/templates/clamav.pot

@@ -0,0 +1,119 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "10"
+msgstr ""
+
+msgid "1024"
+msgstr ""
+
+msgid "15"
+msgstr ""
+
+msgid "150M"
+msgstr ""
+
+msgid "1M"
+msgstr ""
+
+msgid "20"
+msgstr ""
+
+msgid "2048"
+msgstr ""
+
+msgid "2M"
+msgstr ""
+
+msgid "50M"
+msgstr ""
+
+msgid "512K"
+msgstr ""
+
+msgid "600"
+msgstr ""
+
+msgid "Block encrypted archives"
+msgstr ""
+
+msgid "ClamAV"
+msgstr ""
+
+msgid "Database check every N sec"
+msgstr ""
+
+msgid "Detect broken executables"
+msgstr ""
+
+msgid "Detect possibly unwanted apps"
+msgstr ""
+
+msgid "Enable verbose logging"
+msgstr ""
+
+msgid "Follow directory symlinks"
+msgstr ""
+
+msgid "Follow file symlinks"
+msgstr ""
+
+msgid "Log"
+msgstr ""
+
+msgid "Log additional infection info"
+msgstr ""
+
+msgid "Log time with each message"
+msgstr ""
+
+msgid "Max directory scan depth"
+msgstr ""
+
+msgid "Max number of threads"
+msgstr ""
+
+msgid "Max size of log file"
+msgstr ""
+
+msgid "Max size of scanned file"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "Port range, highest port"
+msgstr ""
+
+msgid "Port range, lowest port"
+msgstr ""
+
+msgid "Scan ELF files"
+msgstr ""
+
+msgid "Scan MS Office and .msi files"
+msgstr ""
+
+msgid "Scan RFC1341 messages split over many emails"
+msgstr ""
+
+msgid "Scan archives"
+msgstr ""
+
+msgid "Scan emails"
+msgstr ""
+
+msgid "Scan pdf files"
+msgstr ""
+
+msgid "Scan portable executables"
+msgstr ""
+
+msgid "Scan swf files"
+msgstr ""
+
+msgid "Settings"
+msgstr ""
+
+msgid "Yes"
+msgstr ""

+ 131 - 0
package/luci/applications/luci-app-clamav/po/zh-cn/clamav.po

@@ -0,0 +1,131 @@
+# liushuyu <liushuyu_011@163.com>, 2017.
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2017-04-15 21:37-0600\n"
+"Language-Team: Chinese <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.1\n"
+"Last-Translator: liushuyu <liushuyu011@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: zh_CN\n"
+
+msgid "10"
+msgstr "10"
+
+msgid "1024"
+msgstr "1024"
+
+msgid "15"
+msgstr "15"
+
+msgid "150M"
+msgstr "150M"
+
+msgid "1M"
+msgstr "1M"
+
+msgid "20"
+msgstr "20"
+
+msgid "2048"
+msgstr "2048"
+
+msgid "2M"
+msgstr "2M"
+
+msgid "50M"
+msgstr "50M"
+
+msgid "512K"
+msgstr "512K"
+
+msgid "600"
+msgstr "600"
+
+msgid "Block encrypted archives"
+msgstr "拦截加密的归档文件"
+
+msgid "ClamAV"
+msgstr "ClamAV"
+
+msgid "Database check every N sec"
+msgstr "每 N 秒检测一次数据库"
+
+msgid "Detect broken executables"
+msgstr "检测破损的可执行文件"
+
+msgid "Detect possibly unwanted apps"
+msgstr "检测不受欢迎的软件"
+
+msgid "Enable verbose logging"
+msgstr "启用详细日志输出"
+
+msgid "Follow directory symlinks"
+msgstr "跟随目录符号链接"
+
+msgid "Follow file symlinks"
+msgstr "跟随文件符号链接"
+
+msgid "Log"
+msgstr "日志"
+
+msgid "Log additional infection info"
+msgstr "记录详细的感染信息"
+
+msgid "Log time with each message"
+msgstr "记录消息时间戳"
+
+msgid "Max directory scan depth"
+msgstr "最大扫描深度"
+
+msgid "Max number of threads"
+msgstr "最大线程数"
+
+msgid "Max size of log file"
+msgstr "最大日志大小"
+
+msgid "Max size of scanned file"
+msgstr "最大可扫描的文件大小"
+
+msgid "No"
+msgstr "否"
+
+msgid "Port range, highest port"
+msgstr "端口范围,最大端口"
+
+msgid "Port range, lowest port"
+msgstr "端口范围,最小端口"
+
+msgid "Scan ELF files"
+msgstr "扫描 ELF 文件"
+
+msgid "Scan MS Office and .msi files"
+msgstr "扫描 MS Office 文档和 .msi 安装包文件"
+
+msgid "Scan RFC1341 messages split over many emails"
+msgstr "扫描符合 RFC1341 邮件分离规范的邮件"
+
+msgid "Scan archives"
+msgstr "扫描归档文件"
+
+msgid "Scan emails"
+msgstr "扫描电子邮件"
+
+msgid "Scan pdf files"
+msgstr "扫描 PDF 文件"
+
+msgid "Scan portable executables"
+msgstr "扫描 PE (Windows) 可执行文件"
+
+msgid "Scan swf files"
+msgstr "扫描 SWF 文件"
+
+msgid "Settings"
+msgstr "设置"
+
+msgid "Yes"
+msgstr "是"

+ 2 - 0
package/luci/applications/luci-app-commands/Makefile

@@ -9,6 +9,8 @@ include $(TOPDIR)/rules.mk
 LUCI_TITLE:=LuCI Shell Command Module
 LUCI_DEPENDS:=
 
+PKG_LICENSE:=Apache-2.0
+
 include ../../luci.mk
 
 # call BuildPackage - OpenWrt buildroot signature

+ 55 - 14
package/luci/applications/luci-app-commands/luasrc/controller/commands.lua

@@ -153,8 +153,8 @@ local function parse_cmdline(cmdid, args)
 	end
 end
 
-function action_run(...)
-	local fs   = require "nixio.fs"
+function execute_command(callback, ...)
+	local fs = require "nixio.fs"
 	local argv = parse_cmdline(...)
 	if argv then
 		local outfile = os.tmpname()
@@ -169,8 +169,8 @@ function action_run(...)
 
 		local binary = not not (stdout:match("[%z\1-\8\14-\31]"))
 
-		luci.http.prepare_content("application/json")
-		luci.http.write_json({
+		callback({
+			ok       = true,
 			command  = table.concat(argv, " "),
 			stdout   = not binary and stdout,
 			stderr   = stderr,
@@ -178,10 +178,41 @@ function action_run(...)
 			binary   = binary
 		})
 	else
-		luci.http.status(404, "No such command")
+		callback({
+			ok       = false,
+			code     = 404,
+			reason   = "No such command"
+		})
+	end
+end
+
+function return_json(result)
+	if result.ok then
+		luci.http.prepare_content("application/json")
+		luci.http.write_json(result)
+	else
+		luci.http.status(result.code, result.reason)
 	end
 end
 
+function action_run(...)
+	execute_command(return_json, ...)
+end
+
+function return_html(result)
+	if result.ok then
+		require("luci.template")
+		luci.template.render("commands_public", {
+			exitcode = result.exitcode,
+			stdout = result.stdout,
+			stderr = result.stderr
+		})
+	else
+		luci.http.status(result.code, result.reason)
+	end
+
+end
+
 function action_download(...)
 	local fs   = require "nixio.fs"
 	local argv = parse_cmdline(...)
@@ -192,11 +223,11 @@ function action_download(...)
 			local name
 			if chunk:match("[%z\1-\8\14-\31]") then
 				luci.http.header("Content-Disposition", "attachment; filename=%s"
-				                 % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
+					% fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
 				luci.http.prepare_content("application/octet-stream")
 			else
 				luci.http.header("Content-Disposition", "attachment; filename=%s"
-				                 % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
+					% fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
 				luci.http.prepare_content("text/plain")
 			end
 
@@ -214,14 +245,24 @@ function action_download(...)
 	end
 end
 
+
 function action_public(cmdid, args)
+	local disp = false
+	if string.sub(cmdid, -1) == "s" then
+		disp = true
+		cmdid = string.sub(cmdid, 1, -2)
+	end
 	local uci = require "luci.model.uci".cursor()
 	if cmdid and
-	   uci:get("luci", cmdid) == "command" and
-	   uci:get("luci", cmdid, "public") == "1"
-	then
-		action_download(cmdid, args)
-	else
-		luci.http.status(403, "Access to command denied")
+		uci:get("luci", cmdid) == "command" and
+		uci:get("luci", cmdid, "public") == "1"
+		then
+			if disp then
+				execute_command(return_html, cmdid, args)
+			else
+				action_download(cmdid, args)
+			end
+		else
+			luci.http.status(403, "Access to command denied")
+		end
 	end
-end

+ 9 - 6
package/luci/applications/luci-app-commands/luasrc/view/commands.htm

@@ -108,16 +108,19 @@
 
 		if (legend && output)
 		{
-			var link = location.protocol + '//' + location.hostname +
+			var prefix = location.protocol + '//' + location.hostname +
 			           (location.port ? ':' + location.port : '') +
-					   location.pathname.split(';')[0] + 'command/' +
-					   id + (args ? '/' + args : '');
-
+					   location.pathname.split(';')[0] + 'command/';
+			var suffix = (args ? '/' + args : '');
+			
+			var link = prefix + id + suffix;
+			var link_nodownload = prefix + id + "s" + suffix;
+			
 			legend.style.display = 'none';
 			output.parentNode.style.display = 'block';
 			output.innerHTML = String.format(
-				'<div class="alert-message"><%:Access command with%> <a href="%s">%s</a></div>',
-				link, link
+				'<div class="alert-message"><p><%:Download execution result%> <a href="%s">%s</a></p><p><%:Or display result%> <a href="%s">%s</a></p></div>',
+				link, link, link_nodownload, link_nodownload
 			);
 
 			location.hash = '#output';

+ 50 - 0
package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm

@@ -0,0 +1,50 @@
+<%#
+ Copyright 2016 t123yh <t123yh@outlook.com>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<% css = [[
+.alert-success {
+    color: #3c763d;
+    background-color: #dff0d8;
+    border-color: #d6e9c6;
+}
+
+.alert {
+    padding: 15px;
+    margin-bottom: 20px;
+    border: 1px solid transparent;
+    border-radius: 4px;
+}
+
+.alert-warning {
+    color: #8a6d3b;
+    background-color: #fcf8e3;
+    border-color: #faebcc;
+}
+]] -%>
+
+<%+header%>
+
+<% if exitcode == 0 then %>
+    <div class="alert alert-success" role="alert"> <%:Command executed successfully.%> </div>
+<% else %>
+    <div class="alert alert-warning" role="alert"> <%:Command exited with status code %> <%= exitcode %> </div>
+<% end %>
+
+<% if stdout ~= "" then %>
+    <h3><%:Standard Output%></h3>
+    <pre><%= stdout %></pre>
+<% end %>
+
+<% if stderr ~= "" then %>
+    <h3><%:Standard Error%></h3>
+    <pre><%= stderr %></pre>
+<% end %>
+
+<script>
+    <%# Display top bar on mobile devices -%>
+    document.getElementsByClassName('brand')[0].style.setProperty("display", "block", "important");
+</script>
+
+<%+footer%>

+ 21 - 3
package/luci/applications/luci-app-commands/po/ca/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Una breva descripció textual de l'ordre configurat"
 
-msgid "Access command with"
-msgstr "Accedeix l'ordre amb"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -42,6 +39,12 @@ msgstr "Recollint dades..."
 msgid "Command"
 msgstr "Ordre"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "L'ordre ha fallat"
 
@@ -72,6 +75,9 @@ msgstr "Descripció"
 msgid "Download"
 msgstr "Baixa"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "L'execució de l'ordre ha fallat!"
 
@@ -81,12 +87,21 @@ msgstr "Enllaç"
 msgid "Loading"
 msgstr "Carregant"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Accés públic"
 
 msgid "Run"
 msgstr "Executa"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -96,3 +111,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Esperant que l'ordre acabi..."
+
+#~ msgid "Access command with"
+#~ msgstr "Accedeix l'ordre amb"

+ 18 - 3
package/luci/applications/luci-app-commands/po/cs/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Krátky popis nastaveného příkazu"
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -40,6 +37,12 @@ msgstr "Sbírání dat..."
 msgid "Command"
 msgstr "Příkaz"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Příkaz selhal"
 
@@ -70,6 +73,9 @@ msgstr "Popis"
 msgid "Download"
 msgstr "Stáhnout"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Chyba při zpracování příkazu!"
 
@@ -79,12 +85,21 @@ msgstr "Odkaz"
 msgid "Loading"
 msgstr "Nahrávám"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Veřejný přístup"
 
 msgid "Run"
 msgstr "Spustit"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 21 - 3
package/luci/applications/luci-app-commands/po/de/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Kurze Beschreibung des abgespeicherten Kommandos"
 
-msgid "Access command with"
-msgstr "Kommando aufrufen mit"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -42,6 +39,12 @@ msgstr "Sammle Daten..."
 msgid "Command"
 msgstr "Kommando"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Kommando fehlgeschlagen"
 
@@ -72,6 +75,9 @@ msgstr "Beschreibung"
 msgid "Download"
 msgstr "Herunterladen"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Kommando konnte nicht ausgeführt werden!"
 
@@ -81,12 +87,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "Lade"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Öffentlicher Zugriff"
 
 msgid "Run"
 msgstr "Ausführen"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -96,3 +111,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Warte auf die Ausführung des Kommandos..."
+
+#~ msgid "Access command with"
+#~ msgstr "Kommando aufrufen mit"

+ 18 - 3
package/luci/applications/luci-app-commands/po/el/commands.po

@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -37,6 +34,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -67,6 +70,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -76,12 +82,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 27 - 5
package/luci/applications/luci-app-commands/po/en/commands.po

@@ -1,19 +1,20 @@
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Last-Translator: Automatically generated\n"
+"Project-Id-Version: \n"
+"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language-Team: none\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Language: en\n"
+"X-Generator: Poedit 1.8.11\n"
 
 msgid "A short textual description of the configured command"
 msgstr "A short textual description of the configured command"
 
-msgid "Access command with"
-msgstr "Access command with"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -39,6 +40,12 @@ msgstr "Collecting data..."
 msgid "Command"
 msgstr "Command"
 
+msgid "Command executed successfully."
+msgstr "Command executed successfully."
+
+msgid "Command exited with status code"
+msgstr "Command exited with status code"
+
 msgid "Command failed"
 msgstr "Command failed"
 
@@ -69,6 +76,9 @@ msgstr "Description"
 msgid "Download"
 msgstr "Download"
 
+msgid "Download execution result"
+msgstr "Download execution result"
+
 msgid "Failed to execute command!"
 msgstr "Failed to execute command!"
 
@@ -78,12 +88,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "Loading"
 
+msgid "Or display result"
+msgstr "Or display result"
+
 msgid "Public access"
 msgstr "Public access"
 
 msgid "Run"
 msgstr "Run"
 
+msgid "Standard Error"
+msgstr "Standard Error"
+
+msgid "Standard Output"
+msgstr "Standard Output"
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -93,3 +112,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Waiting for command to complete..."
+
+#~ msgid "Command exited with status code "
+#~ msgstr "Command exited with status code "

+ 21 - 3
package/luci/applications/luci-app-commands/po/es/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Descripción breve del comando a configurar"
 
-msgid "Access command with"
-msgstr "Acceder al comando con"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -41,6 +38,12 @@ msgstr "Recuperando datos..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Falló"
 
@@ -71,6 +74,9 @@ msgstr "Descripción"
 msgid "Download"
 msgstr "Descarga"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "¡Error al ejecutar el comando!"
 
@@ -80,12 +86,21 @@ msgstr "Enlace"
 msgid "Loading"
 msgstr "Cargando"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Acceso público"
 
 msgid "Run"
 msgstr "Ejecutar"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -95,3 +110,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Esperando a que termine el comando..."
+
+#~ msgid "Access command with"
+#~ msgstr "Acceder al comando con"

+ 21 - 3
package/luci/applications/luci-app-commands/po/fr/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Une courte description de la commande configurée"
 
-msgid "Access command with"
-msgstr "Accéder à la commande par"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -44,6 +41,12 @@ msgstr "Récupération des données ..."
 msgid "Command"
 msgstr "Commande"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Echec de la commande"
 
@@ -74,6 +77,9 @@ msgstr "Description"
 msgid "Download"
 msgstr "Télécharger"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Echec de l'exécution de la commande ! "
 
@@ -83,12 +89,21 @@ msgstr "Lien"
 msgid "Loading"
 msgstr "Chargement"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Accès public"
 
 msgid "Run"
 msgstr "Exécuter"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -98,3 +113,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "En attente de la commande pour finir..."
+
+#~ msgid "Access command with"
+#~ msgstr "Accéder à la commande par"

+ 18 - 3
package/luci/applications/luci-app-commands/po/he/commands.po

@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -37,6 +34,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -67,6 +70,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -76,12 +82,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 21 - 3
package/luci/applications/luci-app-commands/po/hu/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "A beállított parancs rövid szöveges leírása"
 
-msgid "Access command with"
-msgstr "Parancs hozzáférése"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -42,6 +39,12 @@ msgstr "Adatgyűjtés..."
 msgid "Command"
 msgstr "Paracs"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Parancs végrehajtás sikertelen"
 
@@ -72,6 +75,9 @@ msgstr "Leírás"
 msgid "Download"
 msgstr "Letöltés"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Parancs végrehajtása sikertelen!"
 
@@ -81,12 +87,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "Betöltés"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Nyilvános hozzáférés"
 
 msgid "Run"
 msgstr "Futtatás"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -96,3 +111,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Várakozás a parancs befejezésére..."
+
+#~ msgid "Access command with"
+#~ msgstr "Parancs hozzáférése"

+ 21 - 3
package/luci/applications/luci-app-commands/po/it/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Una breve descrizione testuale del comando configurato"
 
-msgid "Access command with"
-msgstr "Accesso comando con"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "Raccolta dei dati..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Comando fallito"
 
@@ -73,6 +76,9 @@ msgstr "Descrizione"
 msgid "Download"
 msgstr "Download"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Impossibile eseguire il comando!"
 
@@ -82,12 +88,21 @@ msgstr "Collegamento"
 msgid "Loading"
 msgstr "Caricamento"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Accesso Pubblico"
 
 msgid "Run"
 msgstr "Esegui"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -97,3 +112,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "In attesa del comando da completare..."
+
+#~ msgid "Access command with"
+#~ msgstr "Accesso comando con"

+ 22 - 4
package/luci/applications/luci-app-commands/po/ja/commands.po

@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
-"PO-Revision-Date: 2016-12-21 11:59+0900\n"
+"PO-Revision-Date: 2017-01-21 18:09+0900\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language-Team: none\n"
 "Language: ja\n"
@@ -15,9 +15,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "設定したコマンドの簡単な説明文を記載します"
 
-msgid "Access command with"
-msgstr "コマンドへのアクセス"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -41,6 +38,12 @@ msgstr "データ収集中です..."
 msgid "Command"
 msgstr "コマンド"
 
+msgid "Command executed successfully."
+msgstr "コマンドの実行に成功しました。"
+
+msgid "Command exited with status code"
+msgstr "コマンドは次のステータス コードで終了しました:"
+
 msgid "Command failed"
 msgstr "コマンド失敗"
 
@@ -71,6 +74,9 @@ msgstr "説明"
 msgid "Download"
 msgstr "ダウンロード"
 
+msgid "Download execution result"
+msgstr "実行結果のダウンロード:"
+
 msgid "Failed to execute command!"
 msgstr "コマンドの実行に失敗しました!"
 
@@ -80,12 +86,21 @@ msgstr "リンク"
 msgid "Loading"
 msgstr "読み込み中"
 
+msgid "Or display result"
+msgstr "または結果の表示:"
+
 msgid "Public access"
 msgstr "パブリック・アクセス"
 
 msgid "Run"
 msgstr "実行"
 
+msgid "Standard Error"
+msgstr "標準エラー"
+
+msgid "Standard Output"
+msgstr "標準出力"
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -95,3 +110,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "コマンド実行中です..."
+
+#~ msgid "Access command with"
+#~ msgstr "コマンドへのアクセス"

+ 18 - 3
package/luci/applications/luci-app-commands/po/ms/commands.po

@@ -10,9 +10,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -36,6 +33,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -66,6 +69,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -75,12 +81,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 21 - 3
package/luci/applications/luci-app-commands/po/no/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "En kort tekstlig beskrivelse av den konfigurerte kommandoen"
 
-msgid "Access command with"
-msgstr "Åpne kommandoen med"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -42,6 +39,12 @@ msgstr "Henter data..."
 msgid "Command"
 msgstr "Kommando"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Kommando feilet"
 
@@ -72,6 +75,9 @@ msgstr "Beskrivelse"
 msgid "Download"
 msgstr "Nedlasting"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Kunne ikke utføre kommandoen!"
 
@@ -81,12 +87,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "Laster"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Tilgjengelig for alle"
 
 msgid "Run"
 msgstr "Kjør"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -96,3 +111,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Venter på at kommandoen fullføres..."
+
+#~ msgid "Access command with"
+#~ msgstr "Åpne kommandoen med"

+ 21 - 3
package/luci/applications/luci-app-commands/po/pl/commands.po

@@ -15,9 +15,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Krótki opis konfigurowanej komendy"
 
-msgid "Access command with"
-msgstr "Dostęp do komendy przez"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "Zbieram dane:"
 msgid "Command"
 msgstr "Komenda"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Zła komenda"
 
@@ -73,6 +76,9 @@ msgstr "Opis"
 msgid "Download"
 msgstr "Download"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Nie można wykonać komendy!"
 
@@ -82,12 +88,21 @@ msgstr "Łącze"
 msgid "Loading"
 msgstr "Ładowanie"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Publiczny dostęp"
 
 msgid "Run"
 msgstr "Uruchom"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -97,3 +112,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Czekanie na wykonanie komendy..."
+
+#~ msgid "Access command with"
+#~ msgstr "Dostęp do komendy przez"

+ 20 - 20
package/luci/applications/luci-app-commands/po/pt-br/commands.po

@@ -15,9 +15,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Uma pequena descrição textual do comando configurado"
 
-msgid "Access command with"
-msgstr "Acessar o comando com"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "Adquirindo dados..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Command executed successfully."
+msgstr "O comando executou com sucesso."
+
+msgid "Command exited with status code"
+msgstr "O comando encerrou com um estado de erro"
+
 msgid "Command failed"
 msgstr "O comando falhou"
 
@@ -73,6 +76,9 @@ msgstr "Descrição"
 msgid "Download"
 msgstr "Baixar"
 
+msgid "Download execution result"
+msgstr "Baixar os resultados da execução"
+
 msgid "Failed to execute command!"
 msgstr "Falha ao executar comando!"
 
@@ -82,12 +88,21 @@ msgstr "Endereço"
 msgid "Loading"
 msgstr "Carregando"
 
+msgid "Or display result"
+msgstr "Ou mostre o resultado"
+
 msgid "Public access"
 msgstr "Acesso público"
 
 msgid "Run"
 msgstr "Executar"
 
+msgid "Standard Error"
+msgstr "Saída de Erro"
+
+msgid "Standard Output"
+msgstr "Saída Padrão"
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -98,20 +113,5 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr "Aguardando a conclusão do comando..."
 
-#~ msgid "Command executed successfully."
-#~ msgstr "O comando executou com sucesso."
-
-#~ msgid "Command exited with status code"
-#~ msgstr "O comando encerrou com um estado de erro"
-
-#~ msgid "Download execution result"
-#~ msgstr "Baixar os resultados da execução"
-
-#~ msgid "Or display result"
-#~ msgstr "Ou mostre o resultado"
-
-#~ msgid "Standard Error"
-#~ msgstr "Saída de Erro"
-
-#~ msgid "Standard Output"
-#~ msgstr "Saída Padrão"
+#~ msgid "Access command with"
+#~ msgstr "Acessar o comando com"

+ 21 - 3
package/luci/applications/luci-app-commands/po/pt/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Uma pequena descrição textual do comando configurado"
 
-msgid "Access command with"
-msgstr "Aceder ao comando com"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "A obter dados..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "O comando falhou"
 
@@ -73,6 +76,9 @@ msgstr "Descrição"
 msgid "Download"
 msgstr "Descarregar"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Falha ao executar comando!"
 
@@ -82,12 +88,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "A carregar"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Acesso público"
 
 msgid "Run"
 msgstr "Executar"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -97,3 +112,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "A aguardar que o comando termine..."
+
+#~ msgid "Access command with"
+#~ msgstr "Aceder ao comando com"

+ 21 - 3
package/luci/applications/luci-app-commands/po/ro/commands.po

@@ -15,9 +15,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "O scurta descriere textuala a comenzii configurate"
 
-msgid "Access command with"
-msgstr "Acces la comanda cu"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "Colectare date..."
 msgid "Command"
 msgstr "Comandă"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Comandă eşuată"
 
@@ -73,6 +76,9 @@ msgstr "Descriere"
 msgid "Download"
 msgstr "Descarca"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "S-a esuat executarea comenzii!!"
 
@@ -82,12 +88,21 @@ msgstr "Link"
 msgid "Loading"
 msgstr "Se incarca"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Access public"
 
 msgid "Run"
 msgstr "Ruleaza"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -97,3 +112,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Astept finalizarea comenzii..."
+
+#~ msgid "Access command with"
+#~ msgstr "Acces la comanda cu"

+ 21 - 3
package/luci/applications/luci-app-commands/po/ru/commands.po

@@ -15,9 +15,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Короткое текстовое описание команды"
 
-msgid "Access command with"
-msgstr "Доступ к команде через"
-
 #, fuzzy
 msgid ""
 "Allow executing the command and downloading its output without prior "
@@ -46,6 +43,12 @@ msgstr "Сбор данных..."
 msgid "Command"
 msgstr "Команда"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Команда не выполнена"
 
@@ -76,6 +79,9 @@ msgstr "Описание"
 msgid "Download"
 msgstr "Скачать"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "Ошибка выполнения команды!"
 
@@ -85,12 +91,21 @@ msgstr "Ссылка"
 msgid "Loading"
 msgstr "Загрузка"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Публичный доступ"
 
 msgid "Run"
 msgstr "Запуск"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -100,3 +115,6 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Ожидание завершения команды..."
+
+#~ msgid "Access command with"
+#~ msgstr "Доступ к команде через"

+ 18 - 3
package/luci/applications/luci-app-commands/po/sk/commands.po

@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -37,6 +34,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -67,6 +70,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -76,12 +82,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 45 - 26
package/luci/applications/luci-app-commands/po/sv/commands.po

@@ -10,83 +10,102 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgid "A short textual description of the configured command"
-msgstr ""
-
-msgid "Access command with"
-msgstr ""
+msgstr "En kort textuell beskrivning av det inställda kommandot"
 
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
 msgstr ""
+"Tillåt att kommandot kan köras och ladda ner dess utmatning utan föregående "
+"autentisering"
 
 msgid "Allow the user to provide additional command line arguments"
-msgstr ""
+msgstr "Tillåt användaren att tillge extra kommandoradsargument"
 
 msgid "Arguments:"
-msgstr ""
+msgstr "Argument:"
 
 msgid "Binary data not displayed, download instead."
-msgstr ""
+msgstr "Binärdatan visades inte, ladda ner istället."
 
 msgid "Code:"
-msgstr ""
+msgstr "Kod:"
 
 msgid "Collecting data..."
-msgstr ""
+msgstr "Samlar in data..."
 
 msgid "Command"
-msgstr ""
+msgstr "Kommando"
+
+msgid "Command executed successfully."
+msgstr "Kommandot utfördes korrekt"
+
+msgid "Command exited with status code"
+msgstr "Kommandot avslutade med statuskod"
 
 msgid "Command failed"
-msgstr ""
+msgstr "Kommandot misslyckades"
 
 msgid "Command line to execute"
-msgstr ""
+msgstr "Kommandorad att exekvera"
 
 msgid "Command successful"
-msgstr ""
+msgstr "Kommandot lyckades"
 
 msgid "Command:"
-msgstr ""
+msgstr "Kommando:"
 
 msgid "Configure"
-msgstr ""
+msgstr "Ställ in"
 
 msgid "Custom Commands"
-msgstr ""
+msgstr "Anpassade kommandon"
 
 msgid "Custom arguments"
-msgstr ""
+msgstr "Anpassade argument"
 
 msgid "Dashboard"
-msgstr ""
+msgstr "Instrumentpanel"
 
 msgid "Description"
-msgstr ""
+msgstr "Beskrivning"
 
 msgid "Download"
-msgstr ""
+msgstr "Ladda ner"
+
+msgid "Download execution result"
+msgstr "Resultatet av nerladdningen"
 
 msgid "Failed to execute command!"
-msgstr ""
+msgstr "Misslyckade med att köra kommando!"
 
 msgid "Link"
-msgstr ""
+msgstr "Länk"
 
 msgid "Loading"
-msgstr ""
+msgstr "Laddar"
+
+msgid "Or display result"
+msgstr "Eller visa resultat"
 
 msgid "Public access"
-msgstr ""
+msgstr "Publik tillgång"
 
 msgid "Run"
-msgstr ""
+msgstr "Kör"
+
+msgid "Standard Error"
+msgstr "Standardfel"
+
+msgid "Standard Output"
+msgstr "Standardinmatning"
 
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
 msgstr ""
+"Den här sidan tillåter dig att ställa in anpassade skalkommandon som lättast "
+"kan åberopas från webbgränssnittet."
 
 msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "Väntar på att kommandot ska slutföras..."

+ 18 - 3
package/luci/applications/luci-app-commands/po/templates/commands.pot

@@ -4,9 +4,6 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -30,6 +27,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -60,6 +63,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -69,12 +75,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 18 - 3
package/luci/applications/luci-app-commands/po/tr/commands.po

@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -37,6 +34,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -67,6 +70,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -76,12 +82,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 18 - 3
package/luci/applications/luci-app-commands/po/uk/commands.po

@@ -16,9 +16,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "Короткий опис команд налаштування"
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -43,6 +40,12 @@ msgstr "Збирання даних..."
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "Команда не виконана"
 
@@ -74,6 +77,9 @@ msgstr "Опис"
 msgid "Download"
 msgstr "Завантажити"
 
+msgid "Download execution result"
+msgstr ""
+
 #, fuzzy
 msgid "Failed to execute command!"
 msgstr "Помилка під час запуску команди!"
@@ -84,12 +90,21 @@ msgstr ""
 msgid "Loading"
 msgstr "Триває завантаження"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "Відкритий доступ"
 
 msgid "Run"
 msgstr "Запустити"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 #, fuzzy
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "

+ 18 - 3
package/luci/applications/luci-app-commands/po/vi/commands.po

@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr ""
 
-msgid "Access command with"
-msgstr ""
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -37,6 +34,12 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr ""
 
@@ -67,6 +70,9 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr ""
 
@@ -76,12 +82,21 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr ""
 
 msgid "Run"
 msgstr ""
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."

+ 26 - 7
package/luci/applications/luci-app-commands/po/zh-cn/commands.po

@@ -1,22 +1,20 @@
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-10-08 15:47+0200\n"
-"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
+"Project-Id-Version: \n"
+"PO-Revision-Date: 2017-01-21 09:34+0900\n"
+"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language-Team: none\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Pootle 2.0.6\n"
+"X-Generator: Poedit 1.8.11\n"
+"POT-Creation-Date: \n"
 
 msgid "A short textual description of the configured command"
 msgstr "简短描述命令用途"
 
-msgid "Access command with"
-msgstr "访问命令"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -40,6 +38,12 @@ msgstr "收集数据:"
 msgid "Command"
 msgstr "命令"
 
+msgid "Command executed successfully."
+msgstr "命令成功执行。"
+
+msgid "Command exited with status code"
+msgstr "命令退出,状态码:"
+
 msgid "Command failed"
 msgstr "执行命令失败"
 
@@ -70,6 +74,9 @@ msgstr "描述"
 msgid "Download"
 msgstr "下载"
 
+msgid "Download execution result"
+msgstr "下载执行结果"
+
 msgid "Failed to execute command!"
 msgstr "执行命令失败!"
 
@@ -79,12 +86,21 @@ msgstr "连接"
 msgid "Loading"
 msgstr "加载中"
 
+msgid "Or display result"
+msgstr "显示执行结果"
+
 msgid "Public access"
 msgstr "公共访问"
 
 msgid "Run"
 msgstr "运行"
 
+msgid "Standard Error"
+msgstr "标准错误流"
+
+msgid "Standard Output"
+msgstr "标准输出流"
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -92,3 +108,6 @@ msgstr "此页面允许您配置自定义Shell命令,并可以从Web界面调
 
 msgid "Waiting for command to complete..."
 msgstr "等待命令执行完成... ..."
+
+#~ msgid "Command exited with status code "
+#~ msgstr "命令退出,状态码:"

+ 21 - 3
package/luci/applications/luci-app-commands/po/zh-tw/commands.po

@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "以短文描述設定指令"
 
-msgid "Access command with"
-msgstr "存取指令"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -40,6 +37,12 @@ msgstr "收集資料中..."
 msgid "Command"
 msgstr "指令"
 
+msgid "Command executed successfully."
+msgstr ""
+
+msgid "Command exited with status code"
+msgstr ""
+
 msgid "Command failed"
 msgstr "命令失敗"
 
@@ -70,6 +73,9 @@ msgstr "描述"
 msgid "Download"
 msgstr "下載"
 
+msgid "Download execution result"
+msgstr ""
+
 msgid "Failed to execute command!"
 msgstr "執行指令失敗!"
 
@@ -79,12 +85,21 @@ msgstr "連結"
 msgid "Loading"
 msgstr "掛載"
 
+msgid "Or display result"
+msgstr ""
+
 msgid "Public access"
 msgstr "公用存取"
 
 msgid "Run"
 msgstr "執行"
 
+msgid "Standard Error"
+msgstr ""
+
+msgid "Standard Output"
+msgstr ""
+
 msgid ""
 "This page allows you to configure custom shell commands which can be easily "
 "invoked from the web interface."
@@ -92,3 +107,6 @@ msgstr "只要可以從web介輕易調用, 這頁面允許你自定shell指令."
 
 msgid "Waiting for command to complete..."
 msgstr "等待完整命令中..."
+
+#~ msgid "Access command with"
+#~ msgstr "存取指令"

+ 1 - 1
package/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po

@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "PO-Revision-Date: 2014-04-28 06:16+0200\n"
-"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
+"Last-Translator: Kristoffer Grundström <hamnisdude@gmail.com>\n"
 "Language-Team: none\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"

+ 17 - 0
package/luci/applications/luci-app-cshark/Makefile

@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2017 Dan Luedtke <mail@danrl.com>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Cloudshark capture tool Web UI
+LUCI_DEPENDS:=+cshark
+LUCI_PKGARCH:=all
+
+PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 125 - 0
package/luci/applications/luci-app-cshark/luasrc/controller/cshark.lua

@@ -0,0 +1,125 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright (C) 2014, QA Cafe, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+]]--
+
+module("luci.controller.cshark", package.seeall)
+
+function index()
+		page = node("admin", "network", "cloudshark")
+		page.target = cbi("admin_network/cshark")
+		page.title = _("CloudShark")
+		page.order = 70
+
+		page = entry({"admin", "network", "cshark_iface_dump_start"}, call("cshark_iface_dump_start"), nil)
+		page.leaf = true
+
+		page = entry({"admin", "network", "cshark_iface_dump_stop"}, call("cshark_iface_dump_stop"), nil)
+		page.leaf = true
+
+		page = entry({"admin", "network", "cshark_check_status"}, call("cshark_check_status"), nil)
+		page.leaf = true
+
+		page = entry({"admin", "network", "cshark_link_list_get"}, call("cshark_link_list_get"), nil)
+		page.leaf = true
+
+		page = entry({"admin", "network", "cshark_link_list_clear"}, call("cshark_link_list_clear"), nil)
+		page.leaf = true
+end
+
+function cshark_iface_dump_start(ifname, value, flag, filter)
+	if ifname == nil or ifname == '' then
+		ifname = 'any'
+	end
+	if tonumber(value) == nil
+	then
+		value = '0'
+	end
+	if filter == nil or filter == '' then
+		filter = ''
+	end
+
+	if flag == nil or flag == '' then
+		filter = 'T'
+	end
+
+	luci.http.prepare_content("text/plain")
+
+	local res = os.execute("(/sbin/cshark -i " .. ifname .. " -" .. flag .. " " .. value .. " -p /tmp/cshark-luci.pid " .. filter .. " > /tmp/cshark-luci.out 2>&1) &")
+	luci.http.write(tostring(res))
+end
+
+function cshark_iface_dump_stop()
+	luci.http.prepare_content("text/plain")
+
+	local f = io.open("/tmp/cshark-luci.pid", "rb")
+	local pid = f:read("*all")
+	io.close(f)
+
+	local res = os.execute("kill -TERM " .. pid)
+	luci.http.write(tostring(res))
+end
+
+function cshark_check_status()
+
+	local msg = "";
+	local status;
+	local f = io.open("/tmp/cshark-luci.pid","r")
+	if f ~= nil then
+		status = 1;
+		io.close(f)
+	else
+		status = 0;
+	end
+
+	f = io.open("/tmp/cshark-luci.out","r")
+	if f ~= nil then
+		msg = f:read("*all")
+		io.close(f)
+		if msg ~= '' then
+			os.remove('/tmp/cshark-luci.out')
+		end
+	end
+
+	luci.http.prepare_content("application/json")
+
+	local res = {}
+	res["status"] = status;
+	res["msg"] = msg;
+
+	luci.http.write_json(res)
+end
+
+function cshark_link_list_get()
+	local uci = require("uci").cursor()
+
+	luci.http.prepare_content("application/json")
+
+	luci.http.write("[")
+
+	local t = uci:get("cshark", "cshark", "entry")
+  if (t ~= nil) then
+	  for i = #t, 1, -1 do
+		  luci.http.write("[\"" .. t[i] .. "\"],")
+	  end
+  end
+
+	luci.http.write("[]]")
+end
+
+function cshark_link_list_clear()
+	local uci = require("uci").cursor()
+
+	uci:delete("cshark", "cshark", "entry")
+	uci:commit("cshark");
+
+	luci.http.status(200, "OK")
+end

+ 30 - 0
package/luci/applications/luci-app-cshark/luasrc/model/cbi/admin_network/cshark.lua

@@ -0,0 +1,30 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright (C) 2014, QA Cafe, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local fs = require "nixio.fs"
+
+m = Map("cshark", translate("CloudShark"))
+
+if fs.access("/etc/config/cshark") then
+	m:section(SimpleSection).template = "cshark"
+
+	s = m:section(TypedSection, "cshark", translate("Options"))
+	s.anonymous = true
+	s.addremove = false
+
+	s:option(Value, "url", translate("CloudShark URL"))
+	s:option(Value, "token", translate("CloudShark API token"))
+end
+
+return m

+ 291 - 0
package/luci/applications/luci-app-cshark/luasrc/view/cshark.htm

@@ -0,0 +1,291 @@
+<%#
+LuCI - Lua Configuration Interface
+
+Copyright (C) 2014, QA Cafe, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+
+-%>
+
+<fieldset class="cbi-section">
+	<legend><%:Start network capture%></legend>
+	<div class="cbi-section-node">
+		<table class="cbi-section-table">
+			<tr>
+				<th><%:Interface%></th>
+				<th colspan='2'><%:seconds, packets, bytes%></th>
+				<th><%:Filter%></th>
+				<th><%:Actions%></th>
+			</tr>
+			<tr>
+				<td>
+					<select title="<%:Interface%>" style="width:auto" id="s_interfaces">
+					<%
+						local nixio = require "nixio"
+						for k, v in ipairs(nixio.getifaddrs()) do
+							if v.family == "packet" then
+							%>
+								<option value="<%=v.name%>"><%=v.name%> </option>
+							<%
+							end
+						end
+					%>
+						<option value="any"><%:any%></option>
+					</select>
+				</td>
+				<td colspan='2'>
+					<input id="tx_value" type="text" value="0" />
+					<select title="<%:timeout, bytes, seconds%>" id="s_value_type" style="width:auto">
+						<option value="T"><%:seconds%></option>
+						<option value="P"><%:packets%></option>
+						<option value="S"><%:bytes%></option>
+					</select>
+				</td>
+				<td>
+					<input style="margin: 5px 0" type="text" title="<%:Filter%>" placeholder="filter" id="i_filter" />
+				</td>
+				<td>
+					<input type="button" id="bt_action" data-action="start" value="<%:Start capture%>" class="cbi-button" />
+				</td>
+			</tr>
+		</table>
+	</div>
+</fieldset>
+
+<fieldset class="cbi-section">
+	<span id="cshark-rc-output"></span>
+</fieldset>
+
+<hr/>
+
+<fieldset class="cbi-section">
+	<legend><%:Capture links%></legend>
+	<div class="cbi-section-node">
+		<table id="t_link_list" class="cbi-section-table">
+			<tr class="cbi-section-table-titles">
+				<th class="cbi-section-table-cell"><%:Capture URL%></th>
+				<th class="cbi-section-table-cell"><%:Capture time%></th>
+			</tr>
+		</table>
+	</div>
+</fieldset>
+
+<fieldset class="cbi-section">
+  <a href="https://support.cloudshark.org/openwrt/openwrt-cloudshark.html" target="_blank">Visit support.cloudshark.org for help.</a>
+</fieldset>
+
+<hr/>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">//<![CDATA[
+
+	var capture_running = 0;
+	var pid_file = 0;
+	var bt_action = document.getElementById('bt_action');
+	var a_clear_links = document.getElementById('a_clear_links');
+	var output = document.getElementById('cshark-rc-output');
+	var loader = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" /> ';
+	var msg = { 'start' : '<%:Waiting for capture to complete...%>', 'stop' : '<%:Waiting for upload to complete...%>' };
+	var status_msg = msg['start'];
+
+	function get_date(timestamp)
+	{
+		function pad_str(str)
+		{
+			return (str < 10) ? "0" + str : str;
+		}
+
+		var current_date = new Date(timestamp * 1000);
+		return current_date.getFullYear() + "-" +
+				pad_str(current_date.getMonth() + 1) + "-" +
+				pad_str(current_date.getDate()) + " " +
+				pad_str(current_date.getHours()) + ":" +
+				pad_str(current_date.getMinutes()) + ":" +
+				pad_str(current_date.getSeconds());
+	}
+
+	bt_action.onclick = function()
+	{
+		var action = this.getAttribute("data-action");
+		var csxhr = new XHR();
+
+		if (action == "stop")
+		{
+			update_status(action);
+
+			bt_action.disabled = true;
+
+			csxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/cshark_iface_dump_stop', null,
+			function(x)
+			{
+				if (!x || x.responseText.trim() != "0")
+				{
+					update_status("failed", "Invalid response on stop.");
+				}
+			});
+
+		}
+		else if (action == "start")
+		{
+
+			var s_interfaces = document.getElementById('s_interfaces');
+			var s_value_type = document.getElementById('s_value_type');
+			var i_filter = document.getElementById('i_filter');
+
+			var if_n = s_interfaces.selectedIndex;
+			var t_n = s_value_type.selectedIndex;
+			var ifname = s_interfaces.options[if_n].value.trim();
+			var filter_val = i_filter.value.trim();
+			var tx_val = document.getElementById('tx_value').value.trim();
+			var type_val = s_value_type.options[t_n].value.trim();
+
+			if (type_val != 'P' && type_val != 'T' && type_val != 'S') type_val = 'T';
+
+			if (!ifname || !type_val) return;
+
+			if (isNaN(tx_val)) return alert("<%:value for [seconds, packets, bytes] must be Integer%>");
+
+			update_status(action);
+
+			csxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/cshark_iface_dump_start/' + ifname + '/' + tx_val + '/' + type_val + '/'+ filter_val, null,
+			function(x)
+			{
+				if (!x)
+					update_status("failed", "Invalid response on start.");
+				else
+					update_status("running");
+			});
+		}
+	}
+
+	function update_status(status, message)
+	{
+		switch (status)
+		{
+			case 'start':
+			case 'stop':
+				status_msg = msg[status];
+				output.innerHTML = loader + status_msg;
+			break
+
+			case 'running':
+				if (capture_running) break;;
+
+				output.innerHTML = loader + status_msg;
+
+				bt_action.value = '<%:Stop capture%>';
+				bt_action.setAttribute('data-action', 'stop');
+				capture_running = 1;
+			break;
+
+			case 'completed':
+			case 'failed':
+				if (!capture_running) break;
+
+				if (status == "completed")
+				{
+					link_list_update();
+				}
+
+				output.innerHTML = "<pre>" + message + "</pre>";
+				bt_action.value = '<%:Start capture%>';
+				bt_action.setAttribute('data-action', 'start');
+				bt_action.disabled = false;
+				capture_running = 0;
+			break;
+		}
+	}
+
+
+	function check_status()
+	{
+
+		XHR.poll(3, '<%=luci.dispatcher.build_url("admin", "network")%>/cshark_check_status', null,
+		function(x, data)
+		{
+			if (!x)
+			{
+				if (capture_running)
+					update_status("failed", "Invalid response when fetching status.");
+
+				return;
+			}
+			console.log(data)
+
+			update_status( (data.status == 1) && "running" || "completed", data.msg);
+		})
+	}
+
+	function link_list_clear()
+	{
+		var csxhr_del = new XHR();
+		csxhr_del.get('<%=luci.dispatcher.build_url("admin", "network")%>/cshark_link_list_clear', null,
+		function(x)
+		{
+			if (!x)
+				return false;
+
+			link_list_update();
+		});
+	}
+
+
+	function link_list_update()
+	{
+		var t_link = document.getElementById("t_link_list");
+		if (!t_link) return;
+
+		var row_count = t_link.rows.length;
+		while(--row_count) t_link.deleteRow(row_count);
+
+		var cell = t_link.insertRow(-1).insertCell(0);
+		cell.colSpan = 2;
+		cell.innerHTML = loader;
+
+		var csxhr_link = new XHR();
+		csxhr_link.get('<%=luci.dispatcher.build_url("admin", "network")%>/cshark_link_list_get', null,
+		function(x, entries)
+		{
+			var row = t_link.deleteRow(1);
+
+			if (!x) return;
+
+			if (!entries || !entries.length)
+			{
+				var cell = t_link.insertRow(-1).insertCell(0);
+				cell.colSpan = 2;
+				cell.innerHTML = '<em><br />There are no captures available yet.</em>';
+
+				return;
+			}
+
+			for (var i = 0, len = entries.length; i < len ; i++)
+			{
+				var entry = entries[i][0];
+				if (!entry) continue;
+
+				var data = entry.split(",");
+				var url = data[0];
+				var timestamp = data[1];
+
+				var row = t_link.insertRow(-1);
+				row.insertCell(0).innerHTML = '<a href="'+url+'" target="_blank">'+url+'</a>';
+				row.insertCell(1).innerHTML = get_date(timestamp);
+			}
+
+			var cell = t_link.insertRow(-1).insertCell(0);
+			cell.colSpan = 2;
+			cell.style.textAlign="center";
+			cell.innerHTML = '<input type="button" onclick="link_list_clear()" class="cbi-button" value ="<%:Clear list%>" />';
+		})
+	}
+
+	check_status();
+	link_list_update();
+//]]></script>

+ 2 - 2
package/luci/applications/luci-app-ddns/Makefile

@@ -2,7 +2,7 @@
 # Copyright 2008 Steven Barth <steven@midlink.org>
 # Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
 # Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
-# Copyright 2014-2016 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+# Copyright 2014-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 #
 # This is free software, licensed under the Apache License, Version 2.0
 
@@ -16,7 +16,7 @@ PKG_VERSION:=2.4.8
 
 # Release == build
 # increase on changes of translation files
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_LICENSE:=Apache-2.0
 PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>

+ 5 - 7
package/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua

@@ -1,7 +1,7 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
 -- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
 -- Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
--- Copyright 2014-2016 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+-- Copyright 2014-2017 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
 module("luci.controller.ddns", package.seeall)
@@ -24,7 +24,7 @@ local srv_ver_min = "2.7.6"			-- minimum version of service required
 local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]]
 local app_name    = "luci-app-ddns"
 local app_title   = "Dynamic DNS"
-local app_version = "2.4.8-1"
+local app_version = "2.4.8-2"
 
 function index()
 	local nxfs	= require "nixio.fs"		-- global definitions not available
@@ -180,12 +180,10 @@ local function _get_status()
 		end
 
 		-- get/set monitored interface and IP version
-		local iface	= s["interface"] or "_nonet_"
+		local iface	= s["interface"] or "wan"
 		local use_ipv6	= tonumber(s["use_ipv6"]) or 0
-		if iface ~= "_nonet_" then
-			local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4"
-			iface = ipv .. " / " .. iface
-		end
+		local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4"
+		iface = ipv .. " / " .. iface
 
 		-- try to get registered IP
 		local lookup_host = s["lookup_host"] or "_nolookup_"

+ 233 - 174
package/luci/applications/luci-app-ddns/po/it/ddns.po

@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: luci-app-ddns 2.4.0-1\n"
 "POT-Creation-Date: 2016-01-30 11:07+0100\n"
-"PO-Revision-Date: 2013-02-03 13:53+0200\n"
-"Last-Translator: Francesco <3gasas@gmail.com>\n"
+"PO-Revision-Date: 2017-09-06 01:53+0200\n"
+"Last-Translator: Bubu83 <bubu83@gmail.com>\n"
 "Language-Team: \n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
@@ -22,160 +22,182 @@ msgid "-- default --"
 msgstr ""
 
 msgid "Advanced Settings"
-msgstr ""
+msgstr "Opzioni Avanzate"
 
 msgid "Allow non-public IP's"
-msgstr ""
+msgstr "Consenti IP non pubblici"
 
 msgid "Applying changes"
-msgstr ""
+msgstr "Applico i cambiamenti"
 
 msgid "Basic Settings"
-msgstr ""
+msgstr "Opzioni di Base"
 
 msgid ""
 "Below a list of configuration tips for your system to run Dynamic DNS "
 "updates without limitations"
 msgstr ""
+"Sotto c'è una lista di consigli di configurazione per il tuo sistema per eseguire "
+"aggiornamenti di Dynamic DNS senza limitazioni"
 
 msgid ""
 "Below is a list of configured DDNS configurations and their current state."
 msgstr ""
+"Sotto c'è una lista delle configurazioni DDNS configurate e il loro stato attuale."
 
 msgid "Bind Network"
-msgstr ""
+msgstr "Collega Rete"
 
 msgid "Binding to a specific network not supported"
-msgstr ""
+msgstr "Collegamento a una specifica rete non supportato"
 
 msgid ""
 "BusyBox's nslookup and Wget do not support to specify the IP version to use "
 "for communication with DDNS Provider!"
 msgstr ""
+"Nslookup di BusyBox e Wget non supportano lo specificare la versione IP da usare "
+"per la comunicazione con il Provider DDNS!"
 
 msgid ""
 "BusyBox's nslookup and hostip do not support to specify to use TCP instead "
 "of default UDP when requesting DNS server!"
 msgstr ""
+"Nslookup di BusyBox e hostip non supportano lo specificare l'uso di TCP invece "
+"di UDP di default quando richiedono il server DNS!"
 
 msgid ""
 "BusyBox's nslookup in the current compiled version does not handle given DNS "
 "Servers correctly!"
 msgstr ""
+"Nslookup di BusyBox nella versione compilata corrente non gestisce i dati Server "
+"DNS correttamente!"
 
 msgid "Casual users should not change this setting"
-msgstr ""
+msgstr "Gli utenti casuali non dovrebbero cambiare questa opzione"
 
 msgid "Change provider"
-msgstr ""
+msgstr "Cambia provider"
 
 msgid "Check Interval"
-msgstr ""
+msgstr "Controlla Intervallo"
 
 msgid "Collecting data..."
-msgstr ""
+msgstr "Raccogliendo dati..."
 
 msgid "Config error"
-msgstr ""
+msgstr "Errore di configurazione"
 
 msgid "Configuration"
-msgstr ""
+msgstr "Configurazione"
 
 msgid ""
 "Configure here the details for all Dynamic DNS services including this LuCI "
 "application."
 msgstr ""
+"Configura qui i dettagli per tutti i servizi Dynamic DNS inclusa questa "
+"applicazione LuCI."
 
 msgid "Configure here the details for selected Dynamic DNS service."
-msgstr ""
+msgstr "Configura qui i dettagli per il servizio Dynamic DNS selezionato."
 
 msgid "Current setting"
-msgstr ""
+msgstr "Impostazione corrente"
 
 msgid ""
 "Currently DDNS updates are not started at boot or on interface events.<br /"
 ">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
 "force_interval set to '0')"
 msgstr ""
+"Attualmente gli aggiornamenti DDNS non si avviano al boot o per eventi "
+"dell'interfaccia.  <br />Questo è di default se esegui gli script DDNS per conto tuo "
+" (es. usando cron con force_interval impostato a '0')"
 
 msgid ""
 "Currently DDNS updates are not started at boot or on interface events.<br /"
 ">You can start/stop each configuration here. It will run until next reboot."
 msgstr ""
+"Attualmente gli aggiornamenti DDNS non si avviano al boot o per eventi "
+"dell'interfaccia. <br />Puoi avviare/fermare ogni configurazione qui. Verrà eseguita "
+"fino al prossimo riavvio."
 
 msgid "Custom update script to be used for updating your DDNS Provider."
-msgstr ""
+msgstr "Script aggiornamento personalizzato da usare per aggiornare il tuo DDNS Provider."
 
 msgid "Custom update-URL"
 msgstr "URL di aggiornamento personalizzato"
 
 msgid "Custom update-script"
-msgstr ""
+msgstr "Script di aggiornamento personalizzato"
 
 msgid "DDNS Autostart disabled"
-msgstr ""
+msgstr "Autoavvio DDNS disabilitato"
 
 msgid "DDNS Client Configuration"
-msgstr ""
+msgstr "Configurazione Cliente DDNS"
 
 msgid "DDNS Client Documentation"
-msgstr ""
+msgstr "Documentazione Cliente DDNS"
 
 msgid "DDNS Service provider"
-msgstr ""
+msgstr "Provider del Servizio DDNS"
 
 msgid "DNS requests via TCP not supported"
-msgstr ""
+msgstr "Richieste DNS via TCP non supportate"
 
 msgid "DNS-Server"
-msgstr ""
+msgstr "Server DNS"
 
 msgid "Date format"
-msgstr ""
+msgstr "Formato Data"
 
 msgid "Defines the Web page to read systems IPv4-Address from"
-msgstr ""
+msgstr "Definisce la pagina WEB che legge l'indirizzo IPv4 dei sistemi"
 
 msgid "Defines the Web page to read systems IPv6-Address from"
-msgstr ""
+msgstr "Definisce la pagina WEB che legge l'indirizzo IPv6 dei sistemi"
 
 msgid "Defines the interface to read systems IP-Address from"
-msgstr ""
+msgstr "Definisce l'interfaccia che legge l'indirizzo IP dei sistemi"
 
 msgid "Defines the network to read systems IPv4-Address from"
-msgstr ""
+msgstr "Definisce la rete che legge l'indirizzo IPv4 dei sistemi"
 
 msgid "Defines the network to read systems IPv6-Address from"
-msgstr ""
+msgstr "Definisce la rete che legge l'indirizzo IPv6 dei sistemi"
 
 msgid ""
 "Defines the source to read systems IPv4-Address from, that will be send to "
 "the DDNS provider"
 msgstr ""
+"Definisce la sorgente che legge l'indirizzo IPv4 dei sistemi, che sarà mandata "
+"al provider DDNS"
 
 msgid ""
 "Defines the source to read systems IPv6-Address from, that will be send to "
 "the DDNS provider"
 msgstr ""
+"Definisce la sorgente che legge l'indirizzo IPv6 dei sistemi, che sarà mandata "
+"al provider DDNS"
 
 msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
-msgstr ""
+msgstr "Definisce quale indirizzo IP 'IPv4/IPv6' è mandato al provider DDNS"
 
 msgid "Details for"
-msgstr ""
+msgstr "Dettagli per"
 
 msgid "Directory contains Log files for each running section"
-msgstr ""
+msgstr "Directory che contiene i file di registro per ogni sezione avviata"
 
 msgid ""
 "Directory contains PID and other status information for each running section"
 msgstr ""
+"Directory che contiene il PID e altre informazioni di stato per ogni seziona avviata"
 
 msgid "Disabled"
-msgstr ""
+msgstr "Disabilitato"
 
 msgid "Domain"
-msgstr ""
+msgstr "Dominio"
 
 msgid "Dynamic DNS"
 msgstr "DNS Dinamico"
@@ -188,124 +210,136 @@ msgstr ""
 "statico anche nel caso in cui tu disponga di un indirizzo IP dinamico."
 
 msgid "Enable secure communication with DDNS provider"
-msgstr ""
+msgstr "Abilita la comunicazione sicura con il provider DDNS"
 
 msgid "Enabled"
-msgstr ""
+msgstr "Abilitato"
 
 msgid "Error"
-msgstr ""
+msgstr "Errore"
 
 msgid "Error Retry Counter"
-msgstr ""
+msgstr "Conteggio errore di riprova"
 
 msgid "Error Retry Interval"
-msgstr ""
+msgstr "Intervallo errore di riprova"
 
 msgid "Event Network"
-msgstr ""
+msgstr "Network Evento"
 
 msgid "File"
 msgstr ""
 
 msgid "File not found"
-msgstr ""
+msgstr "File non trovato"
 
 msgid "File not found or empty"
-msgstr ""
+msgstr "File non trovato o vuoto"
 
 msgid ""
 "Follow this link<br />You will find more hints to optimize your system to "
 "run DDNS scripts with all options"
 msgstr ""
+"Segui questo collegamento<br />Troverai più aiuti per ottimizzare il tuo sistema "
+"a eseguire script DDNS con tutte le opzioni"
 
 msgid "For detailed information about parameter settings look here."
-msgstr ""
+msgstr "Per informazioni dettagliate sui parametri opzionali guarda qui."
 
 msgid "For supported codes look here"
-msgstr ""
+msgstr "Per i codici supportati guarda qui"
 
 msgid "Force IP Version"
-msgstr ""
+msgstr "Forza Versione IP"
 
 msgid "Force IP Version not supported"
-msgstr ""
+msgstr "Forza Versione IP non supportato"
 
 msgid "Force Interval"
-msgstr ""
+msgstr "Forza Intervallo"
 
 msgid "Force TCP on DNS"
-msgstr ""
+msgstr "Forza TCP su DNS"
 
 msgid "Forced IP Version don't matched"
-msgstr ""
+msgstr "La Versione IP forzata non corrisponde"
 
 msgid "Format"
-msgstr ""
+msgstr "Formato"
 
 msgid "Format: IP or FQDN"
-msgstr ""
+msgstr "Formato: IP o FQDN"
 
 msgid ""
 "GNU Wget will use the IP of given network, cURL will use the physical "
 "interface."
 msgstr ""
+"GNU Wget userà l'IP della rete data, cURL userà l'interfaccia "
+"fisica."
 
 msgid "Global Settings"
-msgstr ""
+msgstr "Opzioni Globali"
 
 msgid "HTTPS not supported"
-msgstr ""
+msgstr "HTTPS non supportato"
 
 msgid "Hints"
-msgstr ""
+msgstr "Suggerimenti"
 
 msgid "Hostname/FQDN to validate, if IP update happen or necessary"
-msgstr ""
+msgstr "Indirizzo/FQDN da validare, se l'aggiornamento IP avviene o è necessario"
 
 msgid "IP address source"
-msgstr ""
+msgstr "Sorgente indirizzo IP"
 
 msgid "IP address version"
-msgstr ""
+msgstr "Versione indirizzo IP"
 
 msgid "IPv4-Address"
-msgstr ""
+msgstr "Indirizzo IPv4"
 
 msgid "IPv6 address must be given in square brackets"
-msgstr ""
+msgstr "Indirizzo IPv6 deve essere dato con le parentesi quadre"
 
 msgid ""
 "IPv6 is currently not (fully) supported by this system<br />Please follow "
 "the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
 "your system to the latest OpenWrt Release"
 msgstr ""
+"IPv6 non è (pienamente) supportato da questo sistema<br />Per favore segui "
+"le istruzioni sul sito di OpenWrt per abilitare il supporto a IPv6<br />o aggiorna "
+"il tuo sistema all'ultima Release di OpenWrt"
 
 msgid "IPv6 not supported"
-msgstr ""
+msgstr "IPv6 non supportato"
 
 msgid "IPv6-Address"
-msgstr ""
+msgstr "Indirizzo IPv6"
 
 msgid "If both cURL and GNU Wget are installed, Wget is used by default."
-msgstr ""
+msgstr "Se sia cURL e sia GNU Wget sono installati, Wget è usato di default."
 
 msgid ""
 "If this service section is disabled it could not be started.<br />Neither "
 "from LuCI interface nor from console"
 msgstr ""
+"Se questa sezione del servizio è disabilitata, non può essere avviata<br />Nè "
+"da interfaccia LuCI nè da console"
 
 msgid "If using secure communication you should verify server certificates!"
-msgstr ""
+msgstr "Se usi la comunicazione sicura dovresti verificare i certificati del server!"
 
 msgid ""
 "If you want to send updates for IPv4 and IPv6 you need to define two "
 "separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
 msgstr ""
+"Se vuoi mandare aggiornamenti per IPv4 e IPv6, devi definire due "
+"Configurazioni separate es. 'myddns_ipv4' e 'myddns_ipv6'"
 
 msgid ""
 "In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
 msgstr ""
+"In alcune versioni cURL/libcurl in OpenWrt è compilato senza supporto proxy."
 
 msgid "Info"
 msgstr ""
@@ -314,6 +348,8 @@ msgid ""
 "Install 'ca-certificates' package or needed certificates by hand into /etc/"
 "ssl/certs default directory"
 msgstr ""
+"Installa il pacchetto 'ca-certificates' o i certificati necessari "
+"a mano nella directory di default /etc/ssl/certs"
 
 msgid "Interface"
 msgstr "Interfaccia"
@@ -322,408 +358,431 @@ msgid ""
 "Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
 "are not supported"
 msgstr ""
+"Intervallo per controllare i cambiamenti dell'IP<br />I valori sotto i 5 minuti == "
+"300 secondi non sono supportati"
 
 msgid ""
 "Interval to force updates send to DDNS Provider<br />Setting this parameter "
 "to 0 will force the script to only run once<br />Values lower 'Check "
 "Interval' except '0' are not supported"
 msgstr ""
+"Intervallo per forzare gli aggiornamenti da mandare al provider DDNS<br />Impostanto questo "
+"parametro a 0 forzerà lo script ad eseguirsi una sola volta<br />Valori sotto 'Controllo "
+"Intervallo' eccetto '0' non sono supportati"
 
 msgid "It is NOT recommended for casual users to change settings on this page."
-msgstr ""
+msgstr "Non è raccomandato agli utenti casuali di cambiare le opzioni in questa pagina."
 
 msgid "Last Update"
-msgstr ""
+msgstr "Ultimo Aggiornamento"
 
 msgid "Loading"
-msgstr ""
+msgstr "Caricando"
 
 msgid "Log File Viewer"
-msgstr ""
+msgstr "Visualizzatore Registro"
 
 msgid "Log directory"
-msgstr ""
+msgstr "Directory registro"
 
 msgid "Log length"
-msgstr ""
+msgstr "Lunghezza registro"
 
 msgid "Log to file"
-msgstr ""
+msgstr "Registra su file"
 
 msgid "Log to syslog"
-msgstr ""
+msgstr "Registra su syslog"
 
 msgid "Lookup Hostname"
-msgstr ""
+msgstr "Indirizzo da consultare"
 
 msgid "NOT installed"
-msgstr ""
+msgstr "NON installato"
 
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
 msgstr ""
+"Nè GNU Wget con SSL nè cURL installati per selezionare una rete da usare per "
+"comunicazione."
 
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to support secure updates via "
 "HTTPS protocol."
 msgstr ""
+"Nè GNU Wget con SSL nè cURL installati per supportare aggiornamenti sicuri via "
+"protocollo HTTPS."
 
 msgid "Network"
 msgstr "Rete"
 
 msgid "Network on which the ddns-updater scripts will be started"
-msgstr ""
+msgstr "Rete su cui lo script di aggiornamento DDNS sara avviato"
 
 msgid "Never"
-msgstr ""
+msgstr "Mai"
 
 msgid "Next Update"
-msgstr ""
+msgstr "Prossimo Aggiornamento"
 
 msgid "No certificates found"
-msgstr ""
+msgstr "Nessun certificato trovato"
 
 msgid "No data"
-msgstr ""
+msgstr "Nessuno dato"
 
 msgid "No logging"
-msgstr ""
+msgstr "Nessun registro"
 
 msgid "Non-public and by default blocked IP's"
-msgstr ""
+msgstr "Ip non pubblici e bloccati di default"
 
 msgid "Notice"
-msgstr ""
+msgstr "Avviso"
 
 msgid "Number of last lines stored in log files"
-msgstr ""
+msgstr "Numero di ultime linee memorizzato nei file registro"
 
 msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
-msgstr ""
+msgstr "OPZIONALE: Forza l'uso di puro IPv4/IPv6 solo comunicazione."
 
 msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
-msgstr ""
+msgstr "OPZIONALE: Forza l'uso del TCP invece del UDP di default per richieste DNS."
 
 msgid "OPTIONAL: Network to use for communication"
-msgstr ""
+msgstr "OPZIONALE: Rete da usare per comunicazione"
 
 msgid "OPTIONAL: Proxy-Server for detection and updates."
-msgstr ""
+msgstr "OPZIONALE: Server Proxy per rivelazioni e aggiornamenti."
 
 msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
-msgstr ""
+msgstr "OPZIONALE: Usa Server DNS non di default per individuare 'IP Registrati'."
 
 msgid "On Error the script will retry the failed action after given time"
-msgstr ""
+msgstr "Ad Errore lo script riproverà l'azione fallita dopo il tempo dato"
 
 msgid "On Error the script will stop execution after given number of retrys"
-msgstr ""
+msgstr "Ad Errore lo script fermerà l'esecuzione dopo il numero di tentativi dati"
 
 msgid "OpenWrt Wiki"
 msgstr ""
 
 msgid "Optional Encoded Parameter"
-msgstr ""
+msgstr "Parametro Codificato Opzionale"
 
 msgid "Optional Parameter"
-msgstr ""
+msgstr "Parametro Opzionale"
 
 msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
-msgstr ""
+msgstr "Opzionale: Sostituisci [PARAMENC] nell'URL di aggiornamento (URL codificato)"
 
 msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
-msgstr ""
+msgstr "Opzionale: Sostituisci [PARAMOPT] nell'URL di aggiornamento (URL NON codificato)"
 
 msgid "Overview"
-msgstr ""
+msgstr "Riassunto"
 
 msgid "PROXY-Server"
-msgstr ""
+msgstr "Server PROXY"
 
 msgid "PROXY-Server not supported"
-msgstr ""
+msgstr "SERVER PROXY non supportato"
 
 msgid "Password"
 msgstr "Password"
 
 msgid "Path to CA-Certificate"
-msgstr ""
+msgstr "Percorso per Certificato CA"
 
 msgid "Please [Save & Apply] your changes first"
-msgstr ""
+msgstr "Per favore [Salva & Applica] prima i cambiamenti"
 
 msgid "Please press [Read] button"
-msgstr ""
+msgstr "Per favore premi il pulsante [Leggi]"
 
 msgid "Please update to the current version!"
-msgstr ""
+msgstr "Per favore aggiorna alla versione corrente!"
 
 msgid "Process ID"
-msgstr ""
+msgstr "ID del Processo"
 
 msgid "Read / Reread log file"
-msgstr ""
+msgstr "Leggi / Rileggi registro"
 
 msgid "Really change DDNS provider?"
-msgstr ""
+msgstr "Cambiare provider DDNS veramente?"
 
 msgid "Registered IP"
-msgstr ""
+msgstr "IP Registrato"
 
 msgid "Replaces [DOMAIN] in Update-URL"
-msgstr ""
+msgstr "Sostituisci [DOMAIN] nell'URL di aggiornamento"
 
 msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
-msgstr ""
+msgstr "Sostituisci [PASSWORD] nell'URL di aggiornamento (URL codificato)"
 
 msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
-msgstr ""
+msgstr "Sostituisci [NOME UTENTE] nell'URL di aggiornamento (URL codificato)"
 
 msgid "Run once"
-msgstr ""
+msgstr "Esegui una volta"
 
 msgid "Script"
 msgstr ""
 
 msgid "Show more"
-msgstr ""
+msgstr "Mostra di più"
 
 msgid "Software update required"
-msgstr ""
+msgstr "Richiesto aggiornamento Software"
 
 msgid "Specifying a DNS-Server is not supported"
-msgstr ""
+msgstr "Specificare un server DNS non è supportato"
 
 msgid "Start"
-msgstr ""
+msgstr "Inizio"
 
 msgid "Start / Stop"
-msgstr ""
+msgstr "Inizio / Stop"
 
 msgid "Status directory"
 msgstr ""
 
 msgid "Stopped"
-msgstr ""
+msgstr "Fermato"
 
 msgid ""
 "The currently installed 'ddns-scripts' package did not support all available "
 "settings."
 msgstr ""
+"Il pacchetto 'ddns-scripts' attualmente installato non supporta tutte le opzioni "
+"disponibili."
 
 msgid "The default setting of '0' will retry infinite."
-msgstr ""
+msgstr "L'opzione di default '0' riproverà all'infinito."
 
 msgid "There is no service configured."
-msgstr ""
+msgstr "Non c'è un servizio configurato."
 
 msgid "Timer Settings"
-msgstr ""
+msgstr "Impostazioni del Timer"
 
 msgid "To change global settings click here"
-msgstr ""
+msgstr "Per cambiare le opzioni globali clicca qui"
 
 msgid "To use cURL activate this option."
-msgstr ""
+msgstr "Per usare cURL attiva questa opzione."
 
 msgid "URL"
 msgstr "URL"
 
 msgid "URL to detect"
-msgstr ""
+msgstr "URL da individuare"
 
 msgid "Unknown error"
-msgstr ""
+msgstr "Errore sconosciuto"
 
 msgid ""
 "Update URL to be used for updating your DDNS Provider.<br />Follow "
 "instructions you will find on their WEB page."
 msgstr ""
+"L'URL di aggiornamento da usare per aggiornare il tuo Provider DDNS.<br />"
+"Segui le istruzioni che trovi sulla loro pagina WEB."
 
 msgid "Update error"
-msgstr ""
+msgstr "Errore di aggiornamento"
 
 msgid "Use HTTP Secure"
-msgstr ""
+msgstr "Usa HTTP Sicuro"
 
 msgid "Use cURL"
-msgstr ""
+msgstr "Usa cURL"
 
 msgid "User defined script to read systems IP-Address"
-msgstr ""
+msgstr "Script definito dall'utente per leggere l'indirizzo IP dei sistemi"
 
 msgid "Username"
 msgstr "Nome Utente"
 
 msgid "Using specific DNS Server not supported"
-msgstr ""
+msgstr "Usare specifici Server DNS non supportato"
 
 msgid "Verify"
-msgstr ""
+msgstr "Verifica"
 
 msgid "Version"
-msgstr ""
+msgstr "Versione"
 
 msgid "Version Information"
-msgstr ""
+msgstr "Informazione Versione"
 
 msgid "Waiting for changes to be applied..."
-msgstr ""
+msgstr "Aspettando l'applicazione dei cambiamenti..."
 
 msgid "Warning"
-msgstr ""
+msgstr "Allarme"
 
 msgid ""
 "Writes detailed messages to log file. File will be truncated automatically."
 msgstr ""
+"Scrivi messaggi dettagliati sul registro. Il file sarà tagliato automaticamente."
 
 msgid ""
 "Writes log messages to syslog. Critical Errors will always be written to "
 "syslog."
 msgstr ""
+"Scrivi i messaggi registro al syslog. Gli Errori Critici saranno sempre scritti "
+"sul syslog."
 
 msgid ""
 "You should install 'bind-host' or 'knot-host' or 'drill' or 'hostip' "
 "package, if you need to specify a DNS server to detect your registered IP."
 msgstr ""
+"Dovresti installare il pacchetto 'bind-host' o 'knot-host' o 'drill' o 'hostip', "
+"se hai bisogno di specificare un server DNS che identifichi il tuo IP registrato."
 
 msgid ""
 "You should install 'bind-host' or 'knot-host' or 'drill' package for DNS "
 "requests."
 msgstr ""
+"Dovresti installare il pacchetto 'bind-host' o 'knot-host' o 'drill' per le "
+"richieste DNS."
 
 msgid "You should install 'wget' or 'curl' or 'uclient-fetch' package."
-msgstr ""
+msgstr "Dovresti installare il pacchetto 'wget' o 'curl' o 'uclient-fetch'."
 
 msgid ""
 "You should install 'wget' or 'curl' or 'uclient-fetch' with 'libustream-"
 "*ssl' package."
 msgstr ""
+"Dovresti installare il pacchetto 'wget' o 'curl' o 'uclient-fetch' con il "
+"pacchetto 'libustream-*ssl'."
 
 msgid "You should install 'wget' or 'curl' package."
-msgstr ""
+msgstr "Dovresti installare il pacchetto 'wget' o 'curl'."
 
 msgid ""
 "You should install 'wget' or 'uclient-fetch' package or replace libcurl."
 msgstr ""
+"Dovresti installare il pacchetto 'wget' o 'uclient-fetch' o sostituire libcurl."
 
 msgid "cURL is installed, but libcurl was compiled without proxy support."
-msgstr ""
+msgstr "cURL è installato, ma libcurl è compilato senza supporto proxy."
 
 msgid "cURL without Proxy Support"
-msgstr ""
+msgstr "cURL senza Supporto Proxy"
 
 msgid "can not detect local IP. Please select a different Source combination"
-msgstr ""
+msgstr "non individuo l'IP locale. Per favore seleziona una combinazione Sorgente diversa"
 
 msgid "can not resolve host:"
-msgstr ""
+msgstr "non posso risolvere host:"
 
 msgid "config error"
-msgstr ""
+msgstr "errore configurazione"
 
 msgid "days"
-msgstr ""
+msgstr "giorni"
 
 msgid "directory or path/file"
-msgstr ""
+msgstr "directory o percorso/file"
 
 msgid "either url or script could be set"
-msgstr ""
+msgstr "o l'url o lo script può essere impostato"
 
 msgid "enable here"
-msgstr ""
+msgstr "abilita qui"
 
 msgid "file or directory not found or not 'IGNORE'"
-msgstr ""
+msgstr "file o directory non trovati o non 'IGNORE'"
 
 msgid "help"
-msgstr ""
+msgstr "aiuto"
 
 msgid "hours"
-msgstr ""
+msgstr "ore"
 
 msgid "installed"
-msgstr ""
+msgstr "installato"
 
 msgid "invalid FQDN / required - Sample"
-msgstr ""
+msgstr "FQDN invalido / richiesto - Esempio"
 
 msgid "minimum value '0'"
-msgstr ""
+msgstr "valore minimo '0'"
 
 msgid "minimum value '1'"
-msgstr ""
+msgstr "valore minimo '1'"
 
 msgid "minimum value 5 minutes == 300 seconds"
-msgstr ""
+msgstr "valore minimo 5 minuti == 300 secondi"
 
 msgid "minutes"
-msgstr ""
+msgstr "minuti"
 
 msgid "missing / required"
-msgstr ""
+msgstr "mancante / richiesto"
 
 msgid "must be greater or equal 'Check Interval'"
-msgstr ""
+msgstr "deve essere più grande o uguale "Controlla Intervallo'"
 
 msgid "must start with 'http://'"
-msgstr ""
+msgstr "deve iniziare con 'http://'"
 
 msgid "nc (netcat) can not connect"
-msgstr ""
+msgstr "nc (netcat) non può connettersi"
 
 msgid "never"
-msgstr ""
+msgstr "mai"
 
 msgid "no data"
-msgstr ""
+msgstr "Niente dati"
 
 msgid "not found or not executable - Sample: '/path/to/script.sh'"
-msgstr ""
+msgstr "non trovato o non eseguibile - Esempio: '/path/to/script.sh'"
 
 msgid "nslookup can not resolve host"
-msgstr ""
+msgstr "nslookup non può risolvere l'host"
 
 msgid "or"
-msgstr ""
+msgstr "o"
 
 msgid "or higher"
-msgstr ""
+msgstr "o più alto"
 
 msgid "please disable"
-msgstr ""
+msgstr "per favore disabilita"
 
 msgid "please remove entry"
-msgstr ""
+msgstr "per favore rimuovi la voce"
 
 msgid "please select 'IPv4' address version"
-msgstr ""
+msgstr "per favore seleziona versione indirizzo 'IPv4'"
 
 msgid "please select 'IPv4' address version in"
-msgstr ""
+msgstr "per favore seleziona versione indirizzo 'IPv4' in"
 
 msgid "please set to 'default'"
-msgstr ""
+msgstr "per favore imposta a 'default'"
 
 msgid "proxy port missing"
-msgstr ""
+msgstr "porta proxy mancante"
 
 msgid "required"
-msgstr ""
+msgstr "richiesto"
 
 msgid "seconds"
-msgstr ""
+msgstr "secondi"
 
 msgid "to run HTTPS without verification of server certificates (insecure)"
-msgstr ""
+msgstr "per eseguire HTTPS senza la verifica dei certificati del server (insicuro)"
 
 msgid "unknown error"
-msgstr ""
+msgstr "errore sconosciuto"
 
 msgid "unspecific error"
-msgstr ""
+msgstr "errore non specifico"
 
 msgid "use hostname, FQDN, IPv4- or IPv6-Address"
-msgstr ""
+msgstr "usa nome host, FQDN, indirizzo IPv4 o IPv6"

+ 724 - 0
package/luci/applications/luci-app-ddns/po/sv/ddns.po

@@ -0,0 +1,724 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "&"
+msgstr "&"
+
+msgid "-- custom --"
+msgstr "-- anpassad --"
+
+msgid "-- default --"
+msgstr "-- standard --"
+
+msgid "Advanced Settings"
+msgstr "Avancerade inställningar"
+
+msgid "Allow non-public IP's"
+msgstr "Tillåt icke-publika IP-adresser"
+
+msgid "Applying changes"
+msgstr "Verkställer ändringar"
+
+msgid "Basic Settings"
+msgstr "Standardinställningar"
+
+msgid ""
+"Below a list of configuration tips for your system to run Dynamic DNS "
+"updates without limitations"
+msgstr ""
+
+msgid ""
+"Below is a list of configured DDNS configurations and their current state."
+msgstr ""
+"Här nedanför finns det en lista över konfigurerade DDNS-konfigurationer och deras nuvarande skick."
+
+msgid "Bind Network"
+msgstr "Bind samman nätverk"
+
+msgid "Binding to a specific network not supported"
+msgstr "Att binda samman med ett specifikt nätverk stöds inte"
+
+msgid ""
+"BusyBox's nslookup and Wget do not support to specify the IP version to use "
+"for communication with DDNS Provider!"
+msgstr ""
+
+msgid ""
+"BusyBox's nslookup and hostip do not support to specify to use TCP instead "
+"of default UDP when requesting DNS server!"
+msgstr ""
+
+msgid ""
+"BusyBox's nslookup in the current compiled version does not handle given DNS "
+"Servers correctly!"
+msgstr ""
+
+msgid "Casual users should not change this setting"
+msgstr ""
+
+msgid "Change provider"
+msgstr "Byt operatör"
+
+msgid "Check Interval"
+msgstr "Kontroll-intervall"
+
+msgid "Collecting data..."
+msgstr "Samlar in data..."
+
+msgid "Config error"
+msgstr "Konfigurationsfel"
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid ""
+"Configure here the details for all Dynamic DNS services including this LuCI "
+"application."
+msgstr ""
+
+msgid "Configure here the details for selected Dynamic DNS service."
+msgstr ""
+
+msgid "Current setting"
+msgstr "Nuvarande inställning"
+
+msgid ""
+"Currently DDNS updates are not started at boot or on interface events.<br /"
+">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
+"force_interval set to '0')"
+msgstr ""
+
+msgid ""
+"Currently DDNS updates are not started at boot or on interface events.<br /"
+">You can start/stop each configuration here. It will run until next reboot."
+msgstr ""
+
+msgid "Custom update script to be used for updating your DDNS Provider."
+msgstr ""
+
+msgid "Custom update-URL"
+msgstr "Anpassad webbadress för uppdatering"
+
+msgid "Custom update-script"
+msgstr "Anpassat uppdateringsskript"
+
+msgid "DDNS Autostart disabled"
+msgstr ""
+
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
+msgid "DDNS Service provider"
+msgstr ""
+
+msgid "DNS requests via TCP not supported"
+msgstr ""
+
+msgid "DNS-Server"
+msgstr "DNS-server"
+
+msgid "Date format"
+msgstr "Datumformat"
+
+msgid "Defines the Web page to read systems IPv4-Address from"
+msgstr ""
+
+msgid "Defines the Web page to read systems IPv6-Address from"
+msgstr ""
+
+msgid "Defines the interface to read systems IP-Address from"
+msgstr ""
+
+msgid "Defines the network to read systems IPv4-Address from"
+msgstr ""
+
+msgid "Defines the network to read systems IPv6-Address from"
+msgstr ""
+
+msgid ""
+"Defines the source to read systems IPv4-Address from, that will be send to "
+"the DDNS provider"
+msgstr ""
+
+msgid ""
+"Defines the source to read systems IPv6-Address from, that will be send to "
+"the DDNS provider"
+msgstr ""
+
+msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
+msgstr ""
+
+msgid "Details for"
+msgstr "Detaljer för"
+
+msgid "Directory contains Log files for each running section"
+msgstr ""
+
+msgid ""
+"Directory contains PID and other status information for each running section"
+msgstr ""
+
+msgid "Disabled"
+msgstr "Inaktivera"
+
+msgid "Domain"
+msgstr "Domän"
+
+msgid "Dynamic DNS"
+msgstr "Dynamisk DNS"
+
+msgid ""
+"Dynamic DNS allows that your router can be reached with a fixed hostname "
+"while having a dynamically changing IP address."
+msgstr ""
+
+msgid "Enable secure communication with DDNS provider"
+msgstr ""
+
+msgid "Enabled"
+msgstr "Aktiverad"
+
+msgid "Error"
+msgstr "Fel"
+
+msgid "Error Retry Counter"
+msgstr ""
+
+msgid "Error Retry Interval"
+msgstr ""
+
+msgid "Event Network"
+msgstr ""
+
+msgid "File"
+msgstr "Fil"
+
+msgid "File not found"
+msgstr "Filen hittades inte"
+
+msgid "File not found or empty"
+msgstr "Filen hittades inte eller tom"
+
+msgid ""
+"Follow this link<br />You will find more hints to optimize your system to "
+"run DDNS scripts with all options"
+msgstr ""
+
+msgid "For detailed information about parameter settings look here."
+msgstr ""
+
+msgid "For supported codes look here"
+msgstr ""
+
+msgid "Force IP Version"
+msgstr "Tvinga IP-version"
+
+msgid "Force IP Version not supported"
+msgstr "Påtvingad IP-version stöds inte"
+
+msgid "Force Interval"
+msgstr ""
+
+msgid "Force TCP on DNS"
+msgstr ""
+
+msgid "Forced IP Version don't matched"
+msgstr ""
+
+msgid "Format"
+msgstr "Format"
+
+msgid "Format: IP or FQDN"
+msgstr "Format: IP eller FQDN"
+
+msgid ""
+"GNU Wget will use the IP of given network, cURL will use the physical "
+"interface."
+msgstr ""
+"GNU Wget kommer att använda IP-adressen för det angivna nätverket, cURL "
+"kommer att använda det fysiska gränssnittet."
+
+msgid "Global Settings"
+msgstr "Globala inställningar"
+
+msgid "HTTPS not supported"
+msgstr "HTTPS stöds inte"
+
+msgid "Hints"
+msgstr "Ledtrådar"
+
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
+msgstr ""
+
+msgid "IP address source"
+msgstr "IP-adressens källa"
+
+msgid "IP address version"
+msgstr "Version för IP-adress"
+
+msgid "IPv4-Address"
+msgstr "IPv4-adress"
+
+msgid "IPv6 address must be given in square brackets"
+msgstr ""
+
+msgid ""
+"IPv6 is currently not (fully) supported by this system<br />Please follow "
+"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
+"your system to the latest OpenWrt Release"
+msgstr ""
+
+msgid "IPv6 not supported"
+msgstr "IPv6 stöds inte"
+
+msgid "IPv6-Address"
+msgstr "IPv6-adress"
+
+msgid "If both cURL and GNU Wget are installed, Wget is used by default."
+msgstr ""
+"Om både cURL och GNU Wget är installerade så används Wget som standard."
+
+msgid ""
+"If this service section is disabled it could not be started.<br />Neither "
+"from LuCI interface nor from console"
+msgstr ""
+
+msgid "If using secure communication you should verify server certificates!"
+msgstr ""
+
+msgid ""
+"If you want to send updates for IPv4 and IPv6 you need to define two "
+"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
+msgstr ""
+
+msgid ""
+"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
+msgstr ""
+
+msgid "Info"
+msgstr "Info"
+
+msgid ""
+"Install 'ca-certificates' package or needed certificates by hand into /etc/"
+"ssl/certs default directory"
+msgstr ""
+
+msgid "Interface"
+msgstr "Gränssnitt"
+
+msgid ""
+"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
+"are not supported"
+msgstr ""
+
+msgid ""
+"Interval to force updates send to DDNS Provider<br />Setting this parameter "
+"to 0 will force the script to only run once<br />Values lower 'Check "
+"Interval' except '0' are not supported"
+msgstr ""
+
+msgid "It is NOT recommended for casual users to change settings on this page."
+msgstr ""
+"Det är INTE rekommenderat för vanliga användare att ändra inställningar på "
+"den här sidan."
+
+msgid "Last Update"
+msgstr "Senaste uppdateringen"
+
+msgid "Loading"
+msgstr "Laddar"
+
+msgid "Log File Viewer"
+msgstr "Visare för loggfil"
+
+msgid "Log directory"
+msgstr ""
+
+msgid "Log length"
+msgstr "Loggens längd"
+
+msgid "Log to file"
+msgstr "Logga till fil"
+
+msgid "Log to syslog"
+msgstr "Logga till syslog"
+
+msgid "Lookup Hostname"
+msgstr "Kolla upp värdnamn"
+
+msgid "NOT installed"
+msgstr "INTE installerad"
+
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
+"communication."
+msgstr ""
+
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to support secure updates via "
+"HTTPS protocol."
+msgstr ""
+
+msgid "Network"
+msgstr "Nätverk"
+
+msgid "Network on which the ddns-updater scripts will be started"
+msgstr ""
+
+msgid "Never"
+msgstr "Aldrig"
+
+msgid "Next Update"
+msgstr "Nästa uppdatering"
+
+msgid "No certificates found"
+msgstr "Inga ceritifikat hittades"
+
+msgid "No data"
+msgstr "Ingen data"
+
+msgid "No logging"
+msgstr "Ingen loggning"
+
+msgid "Non-public and by default blocked IP's"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Number of last lines stored in log files"
+msgstr ""
+
+msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
+msgstr ""
+
+msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
+msgstr ""
+
+msgid "OPTIONAL: Network to use for communication"
+msgstr ""
+
+msgid "OPTIONAL: Proxy-Server for detection and updates."
+msgstr ""
+
+msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
+msgstr ""
+
+msgid "On Error the script will retry the failed action after given time"
+msgstr ""
+
+msgid "On Error the script will stop execution after given number of retrys"
+msgstr ""
+
+msgid "OpenWrt Wiki"
+msgstr "Wiki för OpenWrt"
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr "Valfri parameter"
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "PROXY-Server"
+msgstr "PROXY-server"
+
+msgid "PROXY-Server not supported"
+msgstr "PROXY-servern stöds inte"
+
+msgid "Password"
+msgstr "Lösenord"
+
+msgid "Path to CA-Certificate"
+msgstr ""
+
+msgid "Please [Save & Apply] your changes first"
+msgstr "Vänligen [Spara & Verkställ] dina ändringar först"
+
+msgid "Please press [Read] button"
+msgstr "Vänligen tryck på [Läs]-knappen"
+
+msgid "Please update to the current version!"
+msgstr "Vänligen uppdatera till den senaste versionen!"
+
+msgid "Process ID"
+msgstr ""
+
+msgid "Read / Reread log file"
+msgstr "Läs / Läs om loggfilen"
+
+msgid "Really change DDNS provider?"
+msgstr ""
+
+msgid "Registered IP"
+msgstr "Registrerad IP"
+
+msgid "Replaces [DOMAIN] in Update-URL"
+msgstr ""
+
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Run once"
+msgstr "Kör en gång"
+
+msgid "Script"
+msgstr "Skript"
+
+msgid "Show more"
+msgstr "Visa mer"
+
+msgid "Software update required"
+msgstr ""
+
+msgid "Specifying a DNS-Server is not supported"
+msgstr ""
+
+msgid "Start"
+msgstr "Starta"
+
+msgid "Start / Stop"
+msgstr "Starta / Stoppa"
+
+msgid "Status directory"
+msgstr ""
+
+msgid "Stopped"
+msgstr "Stoppad"
+
+msgid ""
+"The currently installed 'ddns-scripts' package did not support all available "
+"settings."
+msgstr ""
+
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
+msgid "There is no service configured."
+msgstr "Det finns ingen tjänst inställd."
+
+msgid "Timer Settings"
+msgstr ""
+
+msgid "To change global settings click here"
+msgstr "Klicka här för att ändra på globala inställningar"
+
+msgid "To use cURL activate this option."
+msgstr ""
+
+msgid "URL"
+msgstr "Webbadress"
+
+msgid "URL to detect"
+msgstr "Webbadress att upptäcka"
+
+msgid "Unknown error"
+msgstr "Okänt fel"
+
+msgid ""
+"Update URL to be used for updating your DDNS Provider.<br />Follow "
+"instructions you will find on their WEB page."
+msgstr ""
+
+msgid "Update error"
+msgstr "Uppdateringsfel"
+
+msgid "Use HTTP Secure"
+msgstr "Använd Säker HTTP"
+
+msgid "Use cURL"
+msgstr "Använd cURL"
+
+msgid "User defined script to read systems IP-Address"
+msgstr ""
+
+msgid "Username"
+msgstr "Användarnamn"
+
+msgid "Using specific DNS Server not supported"
+msgstr ""
+
+msgid "Verify"
+msgstr "Verkställ"
+
+msgid "Version"
+msgstr "Version"
+
+msgid "Version Information"
+msgstr "Information om versionen"
+
+msgid "Waiting for changes to be applied..."
+msgstr "Väntar på att ändringarna ska bli verkställda..."
+
+msgid "Warning"
+msgstr "Varning"
+
+msgid ""
+"Writes detailed messages to log file. File will be truncated automatically."
+msgstr ""
+
+msgid ""
+"Writes log messages to syslog. Critical Errors will always be written to "
+"syslog."
+msgstr ""
+
+msgid ""
+"You should install 'bind-host' or 'knot-host' or 'drill' or 'hostip' "
+"package, if you need to specify a DNS server to detect your registered IP."
+msgstr ""
+
+msgid ""
+"You should install 'bind-host' or 'knot-host' or 'drill' package for DNS "
+"requests."
+msgstr ""
+
+msgid "You should install 'wget' or 'curl' or 'uclient-fetch' package."
+msgstr ""
+
+msgid ""
+"You should install 'wget' or 'curl' or 'uclient-fetch' with 'libustream-"
+"*ssl' package."
+msgstr ""
+
+msgid "You should install 'wget' or 'curl' package."
+msgstr ""
+
+msgid ""
+"You should install 'wget' or 'uclient-fetch' package or replace libcurl."
+msgstr ""
+
+msgid "cURL is installed, but libcurl was compiled without proxy support."
+msgstr ""
+
+msgid "cURL without Proxy Support"
+msgstr "cURL utan Proxy-stöd"
+
+msgid "can not detect local IP. Please select a different Source combination"
+msgstr ""
+"kan inte upptäcka lokal IP-adress. Vänligen välj en annorlunda Käll-"
+"kombination"
+
+msgid "can not resolve host:"
+msgstr "kan inte avgöra värd:"
+
+msgid "config error"
+msgstr "konfigurationsfel"
+
+msgid "days"
+msgstr "dagar"
+
+msgid "directory or path/file"
+msgstr ""
+
+msgid "either url or script could be set"
+msgstr "kunde varken fastställa webbadress eller skript"
+
+msgid "enable here"
+msgstr "aktivera här"
+
+msgid "file or directory not found or not 'IGNORE'"
+msgstr ""
+
+msgid "help"
+msgstr "hjälp"
+
+msgid "hours"
+msgstr "timmar"
+
+msgid "installed"
+msgstr "installerad"
+
+msgid "invalid FQDN / required - Sample"
+msgstr "ogiltig FQDN / behövs - Urval"
+
+msgid "minimum value '0'"
+msgstr "minimalt värde '0'"
+
+msgid "minimum value '1'"
+msgstr "minimalt värde '1'"
+
+msgid "minimum value 5 minutes == 300 seconds"
+msgstr "minimalt värde 5 minuter == 300 sekunder"
+
+msgid "minutes"
+msgstr "minutrar"
+
+msgid "missing / required"
+msgstr "saknas / behövs"
+
+msgid "must be greater or equal 'Check Interval'"
+msgstr ""
+
+msgid "must start with 'http://'"
+msgstr "måste börja med 'http://"
+
+msgid "nc (netcat) can not connect"
+msgstr "nc (netcat) kan inte ansluta"
+
+msgid "never"
+msgstr "aldrig"
+
+msgid "no data"
+msgstr "ingen data"
+
+msgid "not found or not executable - Sample: '/path/to/script.sh'"
+msgstr ""
+
+msgid "nslookup can not resolve host"
+msgstr ""
+
+msgid "or"
+msgstr "eller"
+
+msgid "or higher"
+msgstr "eller större"
+
+msgid "please disable"
+msgstr "vänligen inaktivera"
+
+msgid "please remove entry"
+msgstr "vänligen ta bort inmatningen"
+
+msgid "please select 'IPv4' address version"
+msgstr "vänligen välj version för 'IPv4'-adress"
+
+msgid "please select 'IPv4' address version in"
+msgstr ""
+
+msgid "please set to 'default'"
+msgstr ""
+
+msgid "proxy port missing"
+msgstr ""
+
+msgid "required"
+msgstr "behövs"
+
+msgid "seconds"
+msgstr "sekunder"
+
+msgid "to run HTTPS without verification of server certificates (insecure)"
+msgstr "för att köra HTTPS utan verifiering av server-certifikaten (osäkert)"
+
+msgid "unknown error"
+msgstr "okänt fel"
+
+msgid "unspecific error"
+msgstr "ospecifierat fel"
+
+msgid "use hostname, FQDN, IPv4- or IPv6-Address"
+msgstr "använd värdnamn, FQDN, IPv4- eller IPv6-adress"

+ 4 - 2
package/luci/applications/luci-app-diag-core/po/sv/diag_core.po

@@ -10,10 +10,10 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgid "Configure Diagnostics"
-msgstr ""
+msgstr "Ställ in diagnostik"
 
 msgid "Diagnostics"
-msgstr ""
+msgstr "Diagnostik"
 
 msgid ""
 "The diagnostics available under this menu depend on what modules you have "
@@ -29,3 +29,5 @@ msgid ""
 "With this menu you can configure network diagnostics, such as network device "
 "scans and ping tests."
 msgstr ""
+"Med den här menyn så kan du ställa in nätverksdiagnostik så som "
+"igenomsökningar och ping-tester för nätverksenheten."

+ 44 - 44
package/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po

@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Project-Id-Version: PACKAGE VERSION\n"
-"Last-Translator: Automatically generated\n"
+"Last-Translator: Kristoffer Grundström <hamnisdude@gmail.com>\n"
 "Language-Team: none\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
@@ -10,22 +10,22 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgid "Actions"
-msgstr ""
+msgstr "Åtgärder"
 
 msgid "Add"
-msgstr ""
+msgstr "Lägg till"
 
 msgid "Beginning of MAC address range"
-msgstr ""
+msgstr "Början av räckvidd för MAC-adress"
 
 msgid "Config Phone Scan"
-msgstr ""
+msgstr "Konfigurera skanning av telefon"
 
 msgid "Configure"
-msgstr ""
+msgstr "Konfigurera"
 
 msgid "Configure Scans"
-msgstr ""
+msgstr "Konfigurera skanningar"
 
 msgid ""
 "Configure scanning for devices on specified networks. Decreasing 'Timeout', "
@@ -40,46 +40,46 @@ msgid ""
 msgstr ""
 
 msgid "Delete"
-msgstr ""
+msgstr "Radera"
 
 msgid "Device Scan Config"
 msgstr ""
 
 msgid "Device Type"
-msgstr ""
+msgstr "Enhetstyp"
 
 msgid "Devices discovered for"
 msgstr ""
 
 msgid "Devices on Network"
-msgstr ""
+msgstr "Enheter på nätverket"
 
 msgid "Edit"
-msgstr ""
+msgstr "Redigera"
 
 msgid "Enable"
-msgstr ""
+msgstr "Aktivera"
 
 msgid "End of MAC address range"
 msgstr ""
 
 msgid "Go to relevant configuration page"
-msgstr ""
+msgstr "Gå till relevant konfigurationssida"
 
 msgid "IP Address"
-msgstr ""
+msgstr "IP-adress"
 
 msgid "Interface"
-msgstr ""
+msgstr "Gränssnitt"
 
 msgid "Invalid"
-msgstr ""
+msgstr "Ogiltig"
 
 msgid "Link to Device"
-msgstr ""
+msgstr "Länka till enhet"
 
 msgid "MAC Address"
-msgstr ""
+msgstr "MAC-adress"
 
 msgid "MAC Device Info Overrides"
 msgstr ""
@@ -94,10 +94,10 @@ msgid "Milliseconds to sleep between requests (default 100)"
 msgstr ""
 
 msgid "Model"
-msgstr ""
+msgstr "Modell"
 
 msgid "Name"
-msgstr ""
+msgstr "Namn"
 
 msgid "Network Device Scan"
 msgstr ""
@@ -106,16 +106,16 @@ msgid "Network Device Scanning Configuration"
 msgstr ""
 
 msgid "Networks to scan for devices"
-msgstr ""
+msgstr "Nätverk att skanna efter enheter i"
 
 msgid "Networks to scan for supported devices"
 msgstr ""
 
 msgid "No SIP devices"
-msgstr ""
+msgstr "Inga SIP-enheter"
 
 msgid "No devices detected"
-msgstr ""
+msgstr "Upptäckte inga enheter"
 
 msgid "Number of times to send requests (default 1)"
 msgstr ""
@@ -132,28 +132,28 @@ msgid "Perform Scans (this can take a few minutes)"
 msgstr ""
 
 msgid "Phone Information"
-msgstr ""
+msgstr "Information om telefon"
 
 msgid "Phone Scan"
-msgstr ""
+msgstr "Skanning av telefon"
 
 msgid "Phone Scanning Configuration"
-msgstr ""
+msgstr "Konfiguration av skanning i telefon"
 
 msgid "Phones"
-msgstr ""
+msgstr "Telefoner"
 
 msgid "Ports"
-msgstr ""
+msgstr "Portar"
 
 msgid "Raw"
-msgstr ""
+msgstr ""
 
 msgid "Repeat Count"
 msgstr ""
 
 msgid "Repeat Scans (this can take a few minutes)"
-msgstr ""
+msgstr "Repetera skanningar (det här kan ta några minuter)"
 
 msgid "SIP Device Information"
 msgstr ""
@@ -162,46 +162,46 @@ msgid "SIP Device Scan"
 msgstr ""
 
 msgid "SIP Device Scanning Configuration"
-msgstr ""
+msgstr "Skanningskonfiguration för SIP-enhet"
 
 msgid "SIP Devices on Network"
-msgstr ""
+msgstr "SIP-enheter på nätverk"
 
 msgid "SIP devices discovered for"
-msgstr ""
+msgstr "Upptäckta SIP-enheter för"
 
 msgid "Scan for devices on specified networks."
-msgstr ""
+msgstr "Skanna efter enheter i angivna nätverk."
 
 msgid "Scan for supported SIP devices on specified networks."
-msgstr ""
+msgstr "Skannar efter SIP-enheter som stöds i angivna nätverk."
 
 msgid "Scanning Configuration"
-msgstr ""
+msgstr "Skannar konfiguration"
 
 msgid "Scans for devices on specified networks."
-msgstr ""
+msgstr "Skannar efter enheter i angivna nätverk."
 
 msgid "Sleep Between Requests"
-msgstr ""
+msgstr "Sov mellan förfrågningar"
 
 msgid "Subnet"
-msgstr ""
+msgstr "Subnät"
 
 msgid "This section contains no values yet"
-msgstr ""
+msgstr "Den här sektionen innehåller inga värden än"
 
 msgid "Time to wait for responses in seconds (default 10)"
-msgstr ""
+msgstr "Tid att vänta på svar i sekunder (standard 10)"
 
 msgid "Timeout"
 msgstr ""
 
 msgid "Use Configuration"
-msgstr ""
+msgstr "Använd konfiguration"
 
 msgid "Vendor"
-msgstr ""
+msgstr "Tillverkare"
 
 msgid "check other networks"
-msgstr ""
+msgstr "kolla andra nätverk"

+ 13 - 0
package/luci/applications/luci-app-dnscrypt-proxy/Makefile

@@ -0,0 +1,13 @@
+# Copyright 2017 Dirk Brenken (dev@brenken.org)
+# This is free software, licensed under the Apache License, Version 2.0
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI support for DNSCrypt-Proxy
+LUCI_DEPENDS:=+uclient-fetch +dnscrypt-proxy
+LUCI_PKGARCH:=all
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature

+ 32 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/controller/dnscrypt-proxy.lua

@@ -0,0 +1,32 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+module("luci.controller.dnscrypt-proxy", package.seeall)
+
+local util  = require("luci.util")
+local i18n  = require("luci.i18n")
+local templ = require("luci.template")
+
+function index()
+	if not nixio.fs.access("/etc/config/dnscrypt-proxy") then
+		nixio.fs.writefile("/etc/config/dnscrypt-proxy", "")
+	end
+	entry({"admin", "services", "dnscrypt-proxy"}, firstchild(), _("DNSCrypt-Proxy"), 60).dependent = false
+	entry({"admin", "services", "dnscrypt-proxy", "tab_from_cbi"}, cbi("dnscrypt-proxy/overview_tab", {hideresetbtn=true, hidesavebtn=true}), _("Overview"), 10).leaf = true
+	entry({"admin", "services", "dnscrypt-proxy", "logfile"}, call("logread"), _("View Logfile"), 20).leaf = true
+	entry({"admin", "services", "dnscrypt-proxy", "advanced"}, firstchild(), _("Advanced"), 100)
+	entry({"admin", "services", "dnscrypt-proxy", "advanced", "configuration"}, cbi("dnscrypt-proxy/configuration_tab"), _("Edit DNSCrypt-Proxy Configuration"), 110).leaf = true
+	entry({"admin", "services", "dnscrypt-proxy", "advanced", "cfg_dnsmasq"}, cbi("dnscrypt-proxy/cfg_dnsmasq_tab"), _("Edit Dnsmasq Configuration"), 120).leaf = true
+	entry({"admin", "services", "dnscrypt-proxy", "advanced", "view_reslist"}, call("view_reslist"), _("View Resolver List"), 130).leaf = true
+
+end
+
+function view_reslist()
+	local reslist = util.trim(util.exec("cat /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv"))
+	templ.render("dnscrypt-proxy/view_reslist", {title = i18n.translate("DNSCrypt-Proxy Resolver List"), content = reslist})
+end
+
+function logread()
+	local logfile = util.trim(util.exec("logread -e 'dnscrypt-proxy'"))
+	templ.render("dnscrypt-proxy/logread", {title = i18n.translate("DNSCrypt-Proxy Logfile"), content = logfile})
+end

+ 37 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/cfg_dnsmasq_tab.lua

@@ -0,0 +1,37 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local nxfs      = require("nixio.fs")
+local util      = require("luci.util")
+local uci_input = "/etc/config/dhcp"
+
+if not nxfs.access(uci_input) then
+	m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+	return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("dnscrypt-proxy/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+	translate("This form allows you to modify the content of the main Dnsmasq configuration file (/etc/config/dhcp)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+	return nxfs.readfile(uci_input) or ""
+end
+
+function f.write(self, section, data)
+	return nxfs.writefile(uci_input, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+	return true
+end
+
+return m

+ 39 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/configuration_tab.lua

@@ -0,0 +1,39 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local nxfs      = require("nixio.fs")
+local util      = require("luci.util")
+local uci_input = "/etc/config/dnscrypt-proxy"
+
+if not nxfs.access(uci_input) then
+	m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+	m.reset = false
+	m.submit = false
+	return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("dnscrypt-proxy/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+	translate("This form allows you to modify the content of the main DNSCrypt-Proxy configuration file (/etc/config/dnscrypt-proxy)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+	return nxfs.readfile(uci_input) or ""
+end
+
+function f.write(self, section, data)
+	return nxfs.writefile(uci_input, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+	return true
+end
+
+return m

+ 177 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/model/cbi/dnscrypt-proxy/overview_tab.lua

@@ -0,0 +1,177 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs        = require("nixio.fs")
+local uci       = require("luci.model.uci").cursor()
+local util      = require("luci.util")
+local date      = require("luci.http.protocol.date")
+local res_input = "/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv"
+local dump      = util.ubus("network.interface", "dump", {})
+local plug_cnt  = tonumber(luci.sys.exec("env -i /usr/sbin/dnscrypt-proxy --version | grep 'Support for plugins: present' | wc -l"))
+local res_list  = {}
+local url       = "https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-resolvers.csv"
+
+if not fs.access("/lib/libustream-ssl.so") then
+	m = SimpleForm("error", nil, translate("SSL support not available, please install an libustream-ssl variant to use this package."))
+	m.submit = false
+	m.reset = false
+	return m
+end
+
+if not fs.access(res_input) then
+	luci.sys.call("env -i /bin/uclient-fetch --no-check-certificate -O " .. res_input .. " " .. url .. " >/dev/null 2>&1")
+end
+
+if not uci:get_first("dnscrypt-proxy", "global") then
+	uci:add("dnscrypt-proxy", "global")
+	uci:save("dnscrypt-proxy")
+	uci:commit("dnscrypt-proxy")
+end
+
+for line in io.lines(res_input) do
+	local name = line:match("^[%w_.-]*")
+	res_list[#res_list + 1] = { name = name }
+end
+
+m = Map("dnscrypt-proxy", translate("DNSCrypt-Proxy"),
+	translate("Configuration of the DNSCrypt-Proxy package. ")
+	.. translate("Keep in mind to configure Dnsmasq as well. ")
+	.. translatef("For further information "
+	.. "<a href=\"%s\" target=\"_blank\">"
+	.. "see the wiki online</a>", "https://wiki.openwrt.org/inbox/dnscrypt"))
+
+function m.on_after_commit(self)
+	luci.sys.call("env -i /etc/init.d/dnsmasq restart >/dev/null 2>&1")
+	luci.sys.call("env -i /etc/init.d/dnscrypt-proxy restart >/dev/null 2>&1")
+end
+
+s = m:section(TypedSection, "global", translate("General options"))
+s.anonymous = true
+
+-- Main dnscrypt-proxy resource list
+
+o1 = s:option(DummyValue, "", translate("Default Resolver List"))
+o1.template = "dnscrypt-proxy/res_options"
+o1.value = res_input
+
+o2 = s:option(DummyValue, "", translate("File Date"))
+o2.template = "dnscrypt-proxy/res_options"
+o2.value = date.to_http(nixio.fs.stat(res_input).mtime)
+
+o3 = s:option(DummyValue, "", translate("File Checksum"))
+o3.template = "dnscrypt-proxy/res_options"
+o3.value = luci.sys.exec("sha256sum " .. res_input .. " | awk '{print $1}'")
+
+btn = s:option(Button, "", translate("Refresh Resolver List"))
+btn.inputtitle = translate("Refresh List")
+btn.inputstyle = "apply"
+btn.disabled = false
+function btn.write(self, section, value)
+	luci.sys.call("env -i /bin/uclient-fetch --no-check-certificate -O " .. res_input .. " " .. url .. " >/dev/null 2>&1")
+	luci.http.redirect(luci.dispatcher.build_url("admin", "services", "dnscrypt-proxy"))
+end
+
+-- Trigger settings
+
+t = s:option(DynamicList, "procd_trigger", translate("Startup Trigger"),
+	translate("By default the DNSCrypt-Proxy startup will be triggered by ifup events of multiple network interfaces. ")
+	.. translate("To restrict the trigger, add only the relevant network interface(s). ")
+	.. translate("Usually the 'wan' interface should work for most users."))
+if dump then
+	local i, v
+	for i, v in ipairs(dump.interface) do
+		if v.interface ~= "loopback" then
+			t:value(v.interface)
+		end
+	end
+end
+t.rmempty = true
+
+-- Extra options
+
+ds = s:option(DummyValue, "_dummy", translate("Extra options"),
+	translate("Options for further tweaking in case the defaults are not suitable for you."))
+ds.template = "cbi/nullsection"
+
+btn = s:option(Button, "", translate("Create custom config file"),
+	translate("Create '/etc/resolv-crypt.conf' with 'options timeout:1' to reduce DNS upstream timeouts with multiple DNSCrypt instances. ")
+	.. translatef("For further information "
+	.. "<a href=\"%s\" target=\"_blank\">"
+	.. "see the wiki online</a>", "https://wiki.openwrt.org/inbox/dnscrypt"))
+btn.inputtitle = translate("Create Config File")
+btn.inputstyle = "apply"
+btn.disabled = false
+function btn.write(self, section, value)
+	if not fs.access("/etc/resolv-crypt.conf") then
+		luci.sys.call("env -i echo 'options timeout:1' > '/etc/resolv-crypt.conf'")
+	end
+end
+
+-- Mandatory options per instance
+
+s = m:section(TypedSection, "dnscrypt-proxy", translate("Instance options"))
+s.anonymous = true
+s.addremove = true
+
+o1 = s:option(Value, "address", translate("IP Address"),
+	translate("The local IPv4 or IPv6 address. The latter one should be specified within brackets, e.g. '[::1]'."))
+o1.default = address or "127.0.0.1"
+o1.rmempty = false
+
+o2 = s:option(Value, "port", translate("Port"),
+	translate("The listening port for DNS queries."))
+o2.datatype = "port"
+o2.default = port
+o2.rmempty = false
+
+o3 = s:option(ListValue, "resolver", translate("Resolver"),
+	translate("Name of the remote DNS service for resolving queries."))
+o3.datatype = "hostname"
+o3.widget = "select"
+local i, v
+for i, v in ipairs(res_list) do
+	if v.name ~= "Name" then
+		o3:value(v.name)
+	end
+end
+o3.default = resolver
+o3.rmempty = false
+
+-- Extra options per instance
+
+e1 = s:option(Value, "resolvers_list", translate("Alternate Resolver List"),
+	translate("Specify a non-default Resolver List."))
+e1.datatype = "file"
+e1.optional = true
+
+e2 = s:option(Value, "ephemeral_keys", translate("Ephemeral Keys"),
+	translate("Improve privacy by using an ephemeral public key for each query. ")
+	.. translate("This option requires extra CPU cycles and is useless with most DNSCrypt server."))
+e2.datatype = "bool"
+e2.value = 1
+e2.optional = true
+
+if plug_cnt > 0 then
+	e3 = s:option(DynamicList, "blacklist", translate("Blacklist"),
+		translate("Local blacklists allow you to block abuse sites by domains or ip addresses. ")
+		.. translate("The value for this property is the blocklist type and path to the file, e.g.'domains:/path/to/dbl.txt' or 'ips:/path/to/ipbl.txt'."))
+	e3.optional = true
+
+	e4 = s:option(Value, "block_ipv6", translate("Block IPv6"),
+		translate("Disable IPv6 to speed up DNSCrypt-Proxy."))
+	e4.datatype = "bool"
+	e4.value = 1
+	e4.optional = true
+
+	e5 = s:option(Value, "local_cache", translate("Local Cache"),
+		translate("Enable Caching to speed up DNSCcrypt-Proxy."))
+	e5.datatype = "bool"
+	e5.value = 1
+	e5.optional = true
+	
+	e6 = s:option(Value, "query_log_file", translate("DNS Query Logfile"),
+	translate("Log the received DNS queries to a file, so you can watch in real-time what is happening on the network."))
+	e6.optional = true
+end
+
+return m

+ 13 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/config_css.htm

@@ -0,0 +1,13 @@
+<style type="text/css">
+	textarea
+	{
+		border: 1px solid #cccccc;
+		padding: 5px;
+		font-size: 12px;
+		font-family: monospace;
+		resize: none;
+		white-space: pre;
+		overflow-wrap: normal;
+		overflow-x: scroll;
+	}
+</style>

+ 15 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/logread.htm

@@ -0,0 +1,15 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+	<fieldset class="cbi-section">
+		<div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for DNSCrypt-Proxy related messages only.%></div>
+		<textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
+	</fieldset>
+</div>
+
+<%+footer%>

+ 10 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/res_options.htm

@@ -0,0 +1,10 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+cbi/valueheader%>
+
+<input name="reslist" id="reslist" type="text" class="cbi-input-text" style="background:transparent;border:none;box-shadow:none;color:#0069d6;width:500px" value="<%=self:cfgvalue(section)%>" disabled="disabled" />
+
+<%+cbi/valuefooter%>

+ 15 - 0
package/luci/applications/luci-app-dnscrypt-proxy/luasrc/view/dnscrypt-proxy/view_reslist.htm

@@ -0,0 +1,15 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+	<fieldset class="cbi-section">
+		<div class="cbi-section-descr"><%:This form shows the content of the current DNSCrypt Resolver List.%></div>
+		<textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
+	</fieldset>
+</div>
+
+<%+footer%>

+ 232 - 0
package/luci/applications/luci-app-dnscrypt-proxy/po/ja/dnscrypt-proxy.po

@@ -0,0 +1,232 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.3\n"
+"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: ja\n"
+
+msgid "Advanced"
+msgstr "詳細"
+
+msgid "Alternate Resolver List"
+msgstr "代替 リゾルバ リスト"
+
+msgid "Blacklist"
+msgstr "ブラックリスト"
+
+msgid "Block IPv6"
+msgstr "IPv6 のブロック"
+
+msgid ""
+"By default the DNSCrypt-Proxy startup will be triggered by ifup events of "
+"multiple network interfaces."
+msgstr ""
+"デフォルトでは、 DNSCrypt-Proxy は全ネットワーク インターフェースの ifup イベ"
+"ントによりトリガされ起動します。"
+
+msgid "Configuration of the DNSCrypt-Proxy package."
+msgstr "DNSCrypt-Proxy パッケージの設定です。"
+
+msgid ""
+"Create '/etc/resolv-crypt.conf' with 'options timeout:1' to reduce DNS "
+"upstream timeouts with multiple DNSCrypt instances."
+msgstr ""
+"複数の DNSCrypt インスタンスで DNS アップストリーム タイムアウトの設定値を共"
+"用するため、 'options timeout:1' を含めた '/etc/resolv-crypt.conf' を作成しま"
+"す。"
+
+msgid "Create Config File"
+msgstr "設定ファイルの作成"
+
+msgid "Create custom config file"
+msgstr "カスタム設定ファイルの作成"
+
+msgid "DNS Query Logfile"
+msgstr "DNS クエリ ログファイル"
+
+msgid "DNSCrypt-Proxy"
+msgstr "DNSCrypt-Proxy"
+
+msgid "DNSCrypt-Proxy Logfile"
+msgstr "DNSCrypt-Proxy ログファイル"
+
+msgid "DNSCrypt-Proxy Resolver List"
+msgstr "DNSCrypt-Proxy リゾルバ リスト"
+
+msgid "Default Resolver List"
+msgstr "デフォルト リゾルバ リスト"
+
+msgid "Disable IPv6 to speed up DNSCrypt-Proxy."
+msgstr "DNSCrypt-Proxy の高速化のため、IPv6 を無効化します。"
+
+msgid "Edit DNSCrypt-Proxy Configuration"
+msgstr "DNSCrypt-Proxy 設定の編集"
+
+msgid "Edit Dnsmasq Configuration"
+msgstr "Dnsmasq 設定の編集"
+
+msgid "Enable Caching to speed up DNSCcrypt-Proxy."
+msgstr "DNSCrypt-Proxy の高速化のため、キャッシュ機能を有効化します。"
+
+msgid "Ephemeral Keys"
+msgstr "一時的なキー"
+
+msgid "Extra options"
+msgstr "拡張オプション"
+
+msgid "File Checksum"
+msgstr "ファイル チェックサム"
+
+msgid "File Date"
+msgstr "ファイル日付"
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see the wiki "
+"online</a>"
+msgstr ""
+"詳細な情報は <a href=\"%s\" target=\"_blank\">オンライン Wiki</a> を確認して"
+"ください。"
+
+msgid "General options"
+msgstr "全般設定"
+
+msgid "IP Address"
+msgstr "IP アドレス"
+
+msgid "Improve privacy by using an ephemeral public key for each query."
+msgstr ""
+"クエリ毎に一時的な公開鍵を使用することにより、プライバシーを向上します。"
+
+msgid "Input file not found, please check your configuration."
+msgstr "入力ファイルが見つかりません。設定を確認してください。"
+
+msgid "Instance options"
+msgstr "インスタンス オプション"
+
+msgid "Keep in mind to configure Dnsmasq as well."
+msgstr "Dnsmasq を適切に設定する必要があることに留意してください。"
+
+msgid "Local Cache"
+msgstr "ローカル キャッシュ"
+
+msgid ""
+"Local blacklists allow you to block abuse sites by domains or ip addresses."
+msgstr ""
+"ローカル ブラックリストは、不正なサイトをドメイン名または IP アドレスによって"
+"ブロックすることが可能です。"
+
+msgid ""
+"Log the received DNS queries to a file, so you can watch in real-time what "
+"is happening on the network."
+msgstr ""
+"受信した DNS クエリをファイルに記録します。これにより、ネットワークで何が起き"
+"ているかをリアルタイムに把握することが可能です。"
+
+msgid "Name of the remote DNS service for resolving queries."
+msgstr "クエリの名前解決を行う、リモートの DNS サービス名です。"
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr "デフォルト設定が適切でない場合、追加で設定するためのオプションです。"
+
+msgid "Overview"
+msgstr "概要"
+
+msgid "Port"
+msgstr "ポート"
+
+msgid "Refresh List"
+msgstr "リストのリフレッシュ"
+
+msgid "Refresh Resolver List"
+msgstr "リゾルバ リストのリフレッシュ"
+
+msgid "Resolver"
+msgstr "リゾルバ"
+
+msgid ""
+"SSL support not available, please install an libustream-ssl variant to use "
+"this package."
+msgstr ""
+"SSL サポートが利用できません。このパッケージを使用するには libustream-ssl 等"
+"をインストールし、 SSL サポートを有効にしてください。"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Specify a non-default Resolver List."
+msgstr "デフォルトとは異なるリゾルバ リストを設定します。"
+
+msgid "Startup Trigger"
+msgstr "スタートアップ トリガ"
+
+msgid "The listening port for DNS queries."
+msgstr "DNS クエリを待ち受けるポートです。"
+
+msgid ""
+"The local IPv4 or IPv6 address. The latter one should be specified within "
+"brackets, e.g. '[::1]'."
+msgstr ""
+"ローカルの IPv4 または IPv6 アドレスです。 IPv6 アドレスの場合、ブラケット "
+"\"[ ]\" を含めて記述される必要があります(例: '[::1]')。"
+
+msgid ""
+"The value for this property is the blocklist type and path to the file, e."
+"g.'domains:/path/to/dbl.txt' or 'ips:/path/to/ipbl.txt'."
+msgstr ""
+"このプロパティの値は、ブロックリストのタイプ及びファイルへのパスの組み合わせ"
+"です。(例: 'domains:/path/to/domainlist.txt' または 'ips:/path/to/iplist."
+"txt')"
+
+msgid ""
+"This form allows you to modify the content of the main DNSCrypt-Proxy "
+"configuration file (/etc/config/dnscrypt-proxy)."
+msgstr ""
+"このフォームでは、メインの DNSCrypt-Proxy 設定ファイル (/etc/config/dnscrypt-"
+"proxy) の内容を変更することができます。"
+
+msgid ""
+"This form allows you to modify the content of the main Dnsmasq configuration "
+"file (/etc/config/dhcp)."
+msgstr ""
+"このフォームでは、メインの Dnsmasq 設定ファイル (/etc/config/dhcp) の内容を変"
+"更することができます。"
+
+msgid "This form shows the content of the current DNSCrypt Resolver List."
+msgstr ""
+"このフォームには、現在の DNSCrypt リゾルバ リストの内容が表示されます。"
+
+msgid ""
+"This form shows the syslog output, pre-filtered for DNSCrypt-Proxy related "
+"messages only."
+msgstr ""
+"このフォームには、システムログ内の DNSCrypt-Proxy に関連するメッセージのみが"
+"表示されます。"
+
+msgid ""
+"This option requires extra CPU cycles and is useless with most DNSCrypt "
+"server."
+msgstr ""
+"このオプションは、通常よりも CPU リソースを多く使用するほか、ほとんどの "
+"DNSCrypt サーバーでは不要なものです。"
+
+msgid "To restrict the trigger, add only the relevant network interface(s)."
+msgstr ""
+"トリガを限定するには、適切なネットワーク インターフェースのみを追加してくださ"
+"い。"
+
+msgid "Usually the 'wan' interface should work for most users."
+msgstr "通常、 'wan' インターフェースがほとんどのユーザーに適しています。"
+
+msgid "View Logfile"
+msgstr "ログファイルの確認"
+
+msgid "View Resolver List"
+msgstr "リゾルバ リストの確認"

+ 191 - 0
package/luci/applications/luci-app-dnscrypt-proxy/po/templates/dnscrypt-proxy.pot

@@ -0,0 +1,191 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Alternate Resolver List"
+msgstr ""
+
+msgid "Blacklist"
+msgstr ""
+
+msgid "Block IPv6"
+msgstr ""
+
+msgid ""
+"By default the DNSCrypt-Proxy startup will be triggered by ifup events of "
+"multiple network interfaces."
+msgstr ""
+
+msgid "Configuration of the DNSCrypt-Proxy package."
+msgstr ""
+
+msgid ""
+"Create '/etc/resolv-crypt.conf' with 'options timeout:1' to reduce DNS "
+"upstream timeouts with multiple DNSCrypt instances."
+msgstr ""
+
+msgid "Create Config File"
+msgstr ""
+
+msgid "Create custom config file"
+msgstr ""
+
+msgid "DNS Query Logfile"
+msgstr ""
+
+msgid "DNSCrypt-Proxy"
+msgstr ""
+
+msgid "DNSCrypt-Proxy Logfile"
+msgstr ""
+
+msgid "DNSCrypt-Proxy Resolver List"
+msgstr ""
+
+msgid "Default Resolver List"
+msgstr ""
+
+msgid "Disable IPv6 to speed up DNSCrypt-Proxy."
+msgstr ""
+
+msgid "Edit DNSCrypt-Proxy Configuration"
+msgstr ""
+
+msgid "Edit Dnsmasq Configuration"
+msgstr ""
+
+msgid "Enable Caching to speed up DNSCcrypt-Proxy."
+msgstr ""
+
+msgid "Ephemeral Keys"
+msgstr ""
+
+msgid "Extra options"
+msgstr ""
+
+msgid "File Checksum"
+msgstr ""
+
+msgid "File Date"
+msgstr ""
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see the wiki "
+"online</a>"
+msgstr ""
+
+msgid "General options"
+msgstr ""
+
+msgid "IP Address"
+msgstr ""
+
+msgid "Improve privacy by using an ephemeral public key for each query."
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+
+msgid "Instance options"
+msgstr ""
+
+msgid "Keep in mind to configure Dnsmasq as well."
+msgstr ""
+
+msgid "Local Cache"
+msgstr ""
+
+msgid ""
+"Local blacklists allow you to block abuse sites by domains or ip addresses."
+msgstr ""
+
+msgid ""
+"Log the received DNS queries to a file, so you can watch in real-time what "
+"is happening on the network."
+msgstr ""
+
+msgid "Name of the remote DNS service for resolving queries."
+msgstr ""
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "Port"
+msgstr ""
+
+msgid "Refresh List"
+msgstr ""
+
+msgid "Refresh Resolver List"
+msgstr ""
+
+msgid "Resolver"
+msgstr ""
+
+msgid ""
+"SSL support not available, please install an libustream-ssl variant to use "
+"this package."
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Specify a non-default Resolver List."
+msgstr ""
+
+msgid "Startup Trigger"
+msgstr ""
+
+msgid "The listening port for DNS queries."
+msgstr ""
+
+msgid ""
+"The local IPv4 or IPv6 address. The latter one should be specified within "
+"brackets, e.g. '[::1]'."
+msgstr ""
+
+msgid ""
+"The value for this property is the blocklist type and path to the file, e."
+"g.'domains:/path/to/dbl.txt' or 'ips:/path/to/ipbl.txt'."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main DNSCrypt-Proxy "
+"configuration file (/etc/config/dnscrypt-proxy)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main Dnsmasq configuration "
+"file (/etc/config/dhcp)."
+msgstr ""
+
+msgid "This form shows the content of the current DNSCrypt Resolver List."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for DNSCrypt-Proxy related "
+"messages only."
+msgstr ""
+
+msgid ""
+"This option requires extra CPU cycles and is useless with most DNSCrypt "
+"server."
+msgstr ""
+
+msgid "To restrict the trigger, add only the relevant network interface(s)."
+msgstr ""
+
+msgid "Usually the 'wan' interface should work for most users."
+msgstr ""
+
+msgid "View Logfile"
+msgstr ""
+
+msgid "View Resolver List"
+msgstr ""

+ 11 - 0
package/luci/applications/luci-app-dnscrypt-proxy/root/etc/uci-defaults/60_luci-dnscrypt-proxy

@@ -0,0 +1,11 @@
+#!/bin/sh
+
+uci -q batch <<-EOF >/dev/null
+	delete ucitrack.@dnscrypt-proxy[-1]
+	add ucitrack dnscrypt-proxy
+	set ucitrack.@dnscrypt-proxy[-1].init=dnscrypt-proxy
+	commit ucitrack
+EOF
+
+rm -f /tmp/luci-indexcache
+exit 0

Some files were not shown because too many files changed in this diff