Merge pull request #464 from remakeelectric/pulls/list-operations
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 17 Dec 2015 01:39:23 +0000 (02:39 +0100)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 17 Dec 2015 01:39:23 +0000 (02:39 +0100)
get/set list operations and documentation

418 files changed:
CONTRIBUTING.md
README.md
applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
applications/luci-app-ahcp/po/sv/ahcp.po
applications/luci-app-asterisk/Makefile
applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
applications/luci-app-commands/luasrc/view/commands.htm
applications/luci-app-ddns/luasrc/controller/ddns.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
applications/luci-app-ddns/luasrc/tools/ddns.lua
applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm
applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm
applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
applications/luci-app-ddns/po/ca/ddns.po
applications/luci-app-ddns/po/cs/ddns.po
applications/luci-app-ddns/po/de/ddns.po
applications/luci-app-ddns/po/el/ddns.po
applications/luci-app-ddns/po/en/ddns.po
applications/luci-app-ddns/po/es/ddns.po
applications/luci-app-ddns/po/fr/ddns.po
applications/luci-app-ddns/po/he/ddns.po
applications/luci-app-ddns/po/hu/ddns.po
applications/luci-app-ddns/po/it/ddns.po
applications/luci-app-ddns/po/ja/ddns.po
applications/luci-app-ddns/po/ms/ddns.po
applications/luci-app-ddns/po/no/ddns.po
applications/luci-app-ddns/po/pl/ddns.po
applications/luci-app-ddns/po/pt-br/ddns.po
applications/luci-app-ddns/po/pt/ddns.po
applications/luci-app-ddns/po/ro/ddns.po
applications/luci-app-ddns/po/ru/ddns.po
applications/luci-app-ddns/po/sk/ddns.po
applications/luci-app-ddns/po/sv/ddns.po
applications/luci-app-ddns/po/templates/ddns.pot
applications/luci-app-ddns/po/tr/ddns.po
applications/luci-app-ddns/po/uk/ddns.po
applications/luci-app-ddns/po/vi/ddns.po
applications/luci-app-ddns/po/zh-cn/ddns.po
applications/luci-app-ddns/po/zh-tw/ddns.po
applications/luci-app-diag-core/luasrc/view/diag/index.htm
applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm
applications/luci-app-diag-devinfo/Makefile
applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
applications/luci-app-firewall/po/pl/firewall.po
applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm
applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm
applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
applications/luci-app-minidlna/luasrc/view/minidlna_status.htm
applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot
applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po
applications/luci-app-multiwan/luasrc/view/multiwan_status.htm
applications/luci-app-multiwan/po/es/multiwan.po
applications/luci-app-ocserv/luasrc/controller/ocserv.lua
applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua
applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
applications/luci-app-olsr/luasrc/controller/olsr.lua
applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm
applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua
applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua
applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm
applications/luci-app-openvpn/po/ca/openvpn.po
applications/luci-app-openvpn/po/cs/openvpn.po
applications/luci-app-openvpn/po/de/openvpn.po
applications/luci-app-openvpn/po/el/openvpn.po
applications/luci-app-openvpn/po/en/openvpn.po
applications/luci-app-openvpn/po/es/openvpn.po
applications/luci-app-openvpn/po/fr/openvpn.po
applications/luci-app-openvpn/po/he/openvpn.po
applications/luci-app-openvpn/po/hu/openvpn.po
applications/luci-app-openvpn/po/it/openvpn.po
applications/luci-app-openvpn/po/ja/openvpn.po
applications/luci-app-openvpn/po/ms/openvpn.po
applications/luci-app-openvpn/po/no/openvpn.po
applications/luci-app-openvpn/po/pl/openvpn.po
applications/luci-app-openvpn/po/pt-br/openvpn.po
applications/luci-app-openvpn/po/pt/openvpn.po
applications/luci-app-openvpn/po/ro/openvpn.po
applications/luci-app-openvpn/po/ru/openvpn.po
applications/luci-app-openvpn/po/sk/openvpn.po
applications/luci-app-openvpn/po/sv/openvpn.po
applications/luci-app-openvpn/po/templates/openvpn.pot
applications/luci-app-openvpn/po/tr/openvpn.po
applications/luci-app-openvpn/po/uk/openvpn.po
applications/luci-app-openvpn/po/vi/openvpn.po
applications/luci-app-openvpn/po/zh-cn/openvpn.po
applications/luci-app-openvpn/po/zh-tw/openvpn.po
applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua
applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua
applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua
applications/luci-app-polipo/luasrc/view/polipo_status.htm
applications/luci-app-privoxy/Makefile
applications/luci-app-privoxy/luasrc/controller/privoxy.lua
applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua
applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm
applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm
applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua
applications/luci-app-qos/po/ca/qos.po
applications/luci-app-qos/po/cs/qos.po
applications/luci-app-qos/po/de/qos.po
applications/luci-app-qos/po/el/qos.po
applications/luci-app-qos/po/en/qos.po
applications/luci-app-qos/po/es/qos.po
applications/luci-app-qos/po/fr/qos.po
applications/luci-app-qos/po/he/qos.po
applications/luci-app-qos/po/hu/qos.po
applications/luci-app-qos/po/it/qos.po
applications/luci-app-qos/po/ja/qos.po
applications/luci-app-qos/po/ms/qos.po
applications/luci-app-qos/po/no/qos.po
applications/luci-app-qos/po/pl/qos.po
applications/luci-app-qos/po/pt-br/qos.po
applications/luci-app-qos/po/pt/qos.po
applications/luci-app-qos/po/ro/qos.po
applications/luci-app-qos/po/ru/qos.po
applications/luci-app-qos/po/sk/qos.po
applications/luci-app-qos/po/sv/qos.po
applications/luci-app-qos/po/templates/qos.pot
applications/luci-app-qos/po/tr/qos.po
applications/luci-app-qos/po/uk/qos.po
applications/luci-app-qos/po/vi/qos.po
applications/luci-app-qos/po/zh-cn/qos.po
applications/luci-app-qos/po/zh-tw/qos.po
applications/luci-app-radicale/Makefile
applications/luci-app-radicale/luasrc/controller/radicale.lua
applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm
applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot
applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po
applications/luci-app-splash/luasrc/controller/splash/splash.lua
applications/luci-app-splash/luasrc/view/admin_status/splash.htm
applications/luci-app-splash/luasrc/view/splash/blocked.htm
applications/luci-app-splash/luasrc/view/splash/splash.htm
applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua
applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua
applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua [new file with mode: 0644]
applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua [new file with mode: 0644]
applications/luci-app-statistics/luasrc/statistics/i18n.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua [new file with mode: 0644]
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua [new file with mode: 0644]
applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm
applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm
applications/luci-app-statistics/po/ca/statistics.po
applications/luci-app-statistics/po/cs/statistics.po
applications/luci-app-statistics/po/de/statistics.po
applications/luci-app-statistics/po/el/statistics.po
applications/luci-app-statistics/po/en/statistics.po
applications/luci-app-statistics/po/es/statistics.po
applications/luci-app-statistics/po/fr/statistics.po
applications/luci-app-statistics/po/he/statistics.po
applications/luci-app-statistics/po/hu/statistics.po
applications/luci-app-statistics/po/it/statistics.po
applications/luci-app-statistics/po/ja/statistics.po
applications/luci-app-statistics/po/ms/statistics.po
applications/luci-app-statistics/po/no/statistics.po
applications/luci-app-statistics/po/pl/statistics.po
applications/luci-app-statistics/po/pt-br/statistics.po
applications/luci-app-statistics/po/pt/statistics.po
applications/luci-app-statistics/po/ro/statistics.po
applications/luci-app-statistics/po/ru/statistics.po
applications/luci-app-statistics/po/sk/statistics.po
applications/luci-app-statistics/po/sv/statistics.po
applications/luci-app-statistics/po/templates/statistics.pot
applications/luci-app-statistics/po/tr/statistics.po
applications/luci-app-statistics/po/uk/statistics.po
applications/luci-app-statistics/po/vi/statistics.po
applications/luci-app-statistics/po/zh-cn/statistics.po
applications/luci-app-statistics/po/zh-tw/statistics.po
applications/luci-app-statistics/root/etc/config/luci_statistics
applications/luci-app-statistics/root/usr/bin/stat-genconfig
applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua
applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm
applications/luci-app-upnp/luasrc/controller/upnp.lua
applications/luci-app-upnp/luasrc/view/upnp_status.htm
applications/luci-app-upnp/po/ca/upnp.po
applications/luci-app-upnp/po/cs/upnp.po
applications/luci-app-upnp/po/de/upnp.po
applications/luci-app-upnp/po/el/upnp.po
applications/luci-app-upnp/po/en/upnp.po
applications/luci-app-upnp/po/es/upnp.po
applications/luci-app-upnp/po/fr/upnp.po
applications/luci-app-upnp/po/he/upnp.po
applications/luci-app-upnp/po/hu/upnp.po
applications/luci-app-upnp/po/it/upnp.po
applications/luci-app-upnp/po/ja/upnp.po
applications/luci-app-upnp/po/ms/upnp.po
applications/luci-app-upnp/po/no/upnp.po
applications/luci-app-upnp/po/pl/upnp.po
applications/luci-app-upnp/po/pt-br/upnp.po
applications/luci-app-upnp/po/pt/upnp.po
applications/luci-app-upnp/po/ro/upnp.po
applications/luci-app-upnp/po/ru/upnp.po
applications/luci-app-upnp/po/sk/upnp.po
applications/luci-app-upnp/po/sv/upnp.po
applications/luci-app-upnp/po/templates/upnp.pot
applications/luci-app-upnp/po/tr/upnp.po
applications/luci-app-upnp/po/uk/upnp.po
applications/luci-app-upnp/po/vi/upnp.po
applications/luci-app-upnp/po/zh-cn/upnp.po
applications/luci-app-upnp/po/zh-tw/upnp.po
applications/luci-app-vnstat/luasrc/view/vnstat.htm
applications/luci-app-voice-core/Makefile
applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm
applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm
applications/luci-app-voice-diag/Makefile
applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm
applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua
applications/luci-app-wshaper/po/sv/wshaper.po
contrib/package/community-profiles/files/etc/config/profile_bno [deleted file]
contrib/package/community-profiles/files/etc/config/profile_cottbus [new file with mode: 0644]
contrib/package/freifunk-common/files/usr/bin/neigh.sh
contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting [deleted symlink]
documentation/CBI.md
documentation/ModulesHowTo.md
documentation/SubmitPatchesHowTo:.md [deleted file]
documentation/api/modules/luci.jsonc.parser.html
documentation/api/modules/luci.model.uci.html
libs/luci-lib-jsonc/src/jsonc.c
libs/luci-lib-jsonc/src/jsonc.luadoc
luci.mk
modules/luci-base/Makefile
modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif
modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif
modules/luci-base/htdocs/luci-static/resources/cbi/file.gif
modules/luci-base/htdocs/luci-static/resources/icons/bridge.png
modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/encryption.png
modules/luci-base/htdocs/luci-static/resources/icons/encryption_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png
modules/luci-base/htdocs/luci-static/resources/icons/ethernet_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/loading.gif
modules/luci-base/htdocs/luci-static/resources/icons/port_down.png
modules/luci-base/htdocs/luci-static/resources/icons/port_up.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-0-25.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-25-50.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-75-100.png
modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png
modules/luci-base/htdocs/luci-static/resources/icons/switch.png
modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png
modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/vlan.png
modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/wifi.png
modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png
modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png
modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png
modules/luci-base/luasrc/cbi.lua
modules/luci-base/luasrc/cbi/datatypes.lua
modules/luci-base/luasrc/controller/admin/servicectl.lua
modules/luci-base/luasrc/dispatcher.lua
modules/luci-base/luasrc/http.lua
modules/luci-base/luasrc/http/protocol.lua
modules/luci-base/luasrc/model/ipkg.lua
modules/luci-base/luasrc/model/network.lua
modules/luci-base/luasrc/model/uci.luadoc
modules/luci-base/luasrc/sys.lua
modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua
modules/luci-base/luasrc/util.lua
modules/luci-base/luasrc/view/cbi/apply_xhr.htm
modules/luci-base/luasrc/view/cbi/browser.htm
modules/luci-base/luasrc/view/cbi/dynlist.htm
modules/luci-base/luasrc/view/cbi/error.htm
modules/luci-base/luasrc/view/cbi/header.htm
modules/luci-base/luasrc/view/cbi/map.htm
modules/luci-base/luasrc/view/cbi/mvalue.htm
modules/luci-base/luasrc/view/cbi/simpleform.htm
modules/luci-base/luasrc/view/cbi/upload.htm
modules/luci-base/luasrc/view/cbi/value.htm
modules/luci-base/luasrc/view/csrftoken.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/error404.htm
modules/luci-base/luasrc/view/error500.htm
modules/luci-base/luasrc/view/sysauth.htm
modules/luci-base/po/ca/base.po
modules/luci-base/po/cs/base.po
modules/luci-base/po/de/base.po
modules/luci-base/po/el/base.po
modules/luci-base/po/en/base.po
modules/luci-base/po/es/base.po
modules/luci-base/po/fr/base.po
modules/luci-base/po/he/base.po
modules/luci-base/po/hu/base.po
modules/luci-base/po/it/base.po
modules/luci-base/po/ja/base.po
modules/luci-base/po/ms/base.po
modules/luci-base/po/no/base.po
modules/luci-base/po/pl/base.po
modules/luci-base/po/pt-br/base.po
modules/luci-base/po/pt/base.po
modules/luci-base/po/ro/base.po
modules/luci-base/po/ru/base.po
modules/luci-base/po/sk/base.po
modules/luci-base/po/sv/base.po
modules/luci-base/po/templates/base.pot
modules/luci-base/po/tr/base.po
modules/luci-base/po/uk/base.po
modules/luci-base/po/vi/base.po
modules/luci-base/po/zh-cn/base.po
modules/luci-base/po/zh-tw/base.po
modules/luci-base/root/etc/config/luci
modules/luci-base/root/etc/luci-uploads/.placeholder [new file with mode: 0644]
modules/luci-base/root/lib/uci/upload/.placeholder [deleted file]
modules/luci-base/root/www/index.html
modules/luci-mod-admin-full/Makefile
modules/luci-mod-admin-full/luasrc/controller/admin/index.lua
modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
modules/luci-mod-admin-full/luasrc/controller/admin/status.lua
modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua
modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm
modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm
modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm
modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm
modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm
modules/luci-mod-admin-mini/luasrc/view/mini/index.htm
modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm
modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm
modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua
modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm
modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm
modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm
modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm
modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm
modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
modules/luci-mod-rpc/luasrc/controller/rpc.lua
protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua
protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppossh.lua [new file with mode: 0644]
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua
protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
protocols/luci-proto-vpnc/Makefile [new file with mode: 0644]
protocols/luci-proto-vpnc/luasrc/model/cbi/admin_network/proto_vpnc.lua [new file with mode: 0644]
protocols/luci-proto-vpnc/luasrc/model/network/proto_vpnc.lua [new file with mode: 0644]
themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
themes/luci-theme-freifunk-bno/Makefile [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-right.gif [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png [deleted file]
themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/schriftzug.gif [deleted file]
themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/footer.htm [deleted file]
themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm [deleted file]
themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno [deleted file]
themes/luci-theme-material/Makefile [new file with mode: 0755]
themes/luci-theme-material/htdocs/luci-static/material/css/style.css [new file with mode: 0755]
themes/luci-theme-material/htdocs/luci-static/material/favicon.ico [new file with mode: 0755]
themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot [new file with mode: 0644]
themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg [new file with mode: 0644]
themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf [new file with mode: 0644]
themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff [new file with mode: 0644]
themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js [new file with mode: 0755]
themes/luci-theme-material/htdocs/luci-static/material/js/script.js [new file with mode: 0755]
themes/luci-theme-material/htdocs/luci-static/material/logo.png [new file with mode: 0755]
themes/luci-theme-material/luasrc/view/themes/material/footer.htm [new file with mode: 0755]
themes/luci-theme-material/luasrc/view/themes/material/header.htm [new file with mode: 0755]
themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material [new file with mode: 0755]

index 7c42913..e4edf0c 100644 (file)
@@ -1,16 +1,16 @@
 # Contributing Guidelines
 
-Patches and pull-requests:
+## Patches and Pull requests:
 
 If you want to contribute a change to LuCI, please either send a patch using git send-email
-or open a pull request against the openwrt/luci repository.
+or open a "pull request" against the openwrt/luci repository.
 
 Regardless of whether you send a patch or open a pull request, please try to follow these rules:
 
-* Have a useful subject prefixed with the component name  
-    (E.g.: "modules/admin-full: fix wifi channel selection on multiple STA networks")
+* Have a useful subject prefixed with the component name
+    (E.g.: "luci-mod-admin-full: fix wifi channel selection on multiple STA networks")
 * Shortly explain the changes made and - if applicable - the reasoning behind them
-* Include Signed-off-by in the comment  
+* Commit message of each commit should include a Signed-off-by line
     (See <https://dev.openwrt.org/wiki/SubmittingPatches#a10.Signyourwork>)
        
 In case you like to send patches by mail, please use the [LuCI mailinglist](https://lists.subsignal.org/mailman/listinfo/luci)
@@ -19,22 +19,41 @@ or the [OpenWrt Development List](https://lists.openwrt.org/cgi-bin/mailman/list
 If you send via the OpenWrt list, include a "[luci]" tag in your subject line.
 For general information on patch submission, follow the [OpenWrt patch submission guideline](https://dev.openwrt.org/wiki/SubmittingPatches).
 
+## Advice on pull requests:
 
-If you have commit access:
+Pull requests are the easiest way to contribute changes to git repos at Github. They are the preferred contribution method, as they offer a nice way for commenting and amending the proposed changes.
+
+* You need a local "fork" of the Github repo.
+* Use a "feature branch" for your changes. That separates the changes in the pull request from your other changes and makes it easy to edit/amend commits in the pull request. Workflow using "feature_x" as the example:
+  - Update your local git fork to the tip (of the master, usually)
+  - Create the feature branch with `git checkout -b feature_x`
+  - Edit changes and commit them locally
+  - Push them to your Github fork by `git push -u origin feature_x`. That creates the "feature_x" branch at your Github fork and sets it as the remote of this branch
+  - When you now visit Github, you should see a proposal to create a pull request
+
+* If you later need to add new commits to the pull request, you can simply commit the changes to the local branch and then use `git push` to automatically update the pull request.
+
+* If you need to change something in the existing pull request (e.g. to add a missing signed-off-by line to the commit message), you can use `git push -f` to overwrite the original commits. That is easy and safe when using a feature branch. Example workflow:
+  - Checkout the feature branch by `git checkout feature_x`
+  - Edit changes and commit them locally. If you are just updating the commit message in the last commit, you can use `git commit --amend` to do that
+  - If you added several new commits or made other changes that require cleaning up, you can use `git rebase -i HEAD~X` (X = number of commits to edit) to possibly squash some commits
+  - Push the changed commits to Github with `git push -f` to overwrite the original commits in the "feature_x" branch with the new ones. The pull request gets automatically updated
+
+## If you have commit access:
 
 * Do NOT use git push --force.
 * Use Pull Requests if you are unsure and to suggest changes to other developers.
 
-Gaining commit access:
+## Gaining commit access:
 
 * Commit access will be granted to responsible contributors who have made
   useful pull requests and / or feedback or patches to this repository or
   OpenWrt in general. Please include your request for commit access in your
   next pull request or ticket.
 
-Release Branches:
+## Release Branches:
 
-* Branches named "luci-X.Y" (e.g. luci-0.12) are release branches.
+* Branches named "for-XX.YY" or "luci-X.Y" (e.g. "for-15.05") are release branches.
 * These branches are built with the respective OpenWrt release and are created
   during the release stabilisation phase.
 * Please ONLY cherry-pick or commit security and bug-fixes to these branches.
index 371cee2..abccff6 100644 (file)
--- a/README.md
+++ b/README.md
@@ -17,6 +17,10 @@ To install all its package definitions, run:
 ./scripts/feeds install -a -p luci
 ```
 
+## API Reference
+
+You can browse the generated API documentation [directly on Github](http://htmlpreview.github.io/?http://raw.githubusercontent.com/openwrt/luci/master/documentation/api/index.html).
+
 ## License
 
 See [LICENSE](LICENSE) file.
index 88796cb..9468289 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "ahcpd", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/network/ahcpd/status')%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('ahcpd_status_table');
index b5f0b7d..a7c7a38 100644 (file)
@@ -22,7 +22,7 @@ msgid ""
 msgstr ""
 
 msgid "Active AHCP Leases"
-msgstr ""
+msgstr "Aktiva AHCP-hyror"
 
 msgid "Address"
 msgstr "Adress"
@@ -40,13 +40,13 @@ msgid "Announced NTP servers"
 msgstr "Aviserade NTP-servrar"
 
 msgid "Announced prefixes"
-msgstr ""
+msgstr "Aviserade prefix"
 
 msgid "Collecting data..."
 msgstr "Samlar in data..."
 
 msgid "Forwarder"
-msgstr ""
+msgstr "Vidarebefordrare"
 
 msgid "General Setup"
 msgstr "Allmän inställning"
@@ -61,16 +61,16 @@ msgid "IPv6 only"
 msgstr "Endast IPv6"
 
 msgid "Lease directory"
-msgstr ""
+msgstr "Hyr mappen"
 
 msgid "Lease validity time"
-msgstr ""
+msgstr "Giltighetstid för hyran"
 
 msgid "Log file"
 msgstr "Logg-fil"
 
 msgid "Multicast address"
-msgstr ""
+msgstr "Multicast-adress"
 
 msgid "Operation mode"
 msgstr "Driftsläge"
@@ -82,7 +82,7 @@ msgid "Protocol family"
 msgstr "Protokoll-familj"
 
 msgid "Served interfaces"
-msgstr ""
+msgstr "Betjänade gränssnitt"
 
 msgid "Server"
 msgstr "Server"
@@ -94,16 +94,16 @@ msgid "Specifies the announced IPv4 and IPv6 name servers"
 msgstr "Specificerar de aviserade IPv4 och IPv6 namn-servrarna"
 
 msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
-msgstr ""
+msgstr "Specificerar de aviserade IPv4 och IPv6 nätverksprefixen i CIDR-noteringen"
 
 msgid "The AHCP Service is not running."
 msgstr "AHCP-tjänsten körs inte."
 
 msgid "The AHCP Service is running with ID %s."
-msgstr ""
+msgstr "AHCP-tjänsten körs med ID %s."
 
 msgid "There are no active leases."
-msgstr ""
+msgstr "Det finns inga aktiva hyror."
 
 msgid "Unique ID file"
 msgstr "Unik ID-fil"
index f2f3cd1..3434e16 100644 (file)
@@ -7,7 +7,6 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Support for Asterisk
-LUCI_DEPENDS:=+ahcpd
 
 include ../../luci.mk
 
index 70f986c..9f644ba 100644 (file)
@@ -56,7 +56,7 @@
 %>
 
 
-<form method="post" action="<%=luci.dispatcher.build_url("admin", "asterisk", "dialplans")%>" enctype="multipart/form-data">
+<form method="post" action="<%=url('admin/asterisk/dialplans')%>" enctype="multipart/form-data">
        <div>
                <script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
                <input type="hidden" name="cbi.submit" value="1" />
        </div>
 
 <div class="cbi-map" id="cbi-asterisk">
-       <h2><a id="content" name="content">Outgoing Call Routing</a></h2>
+       <h2 name="content">Outgoing Call Routing</h2>
        <div class="cbi-map-descr">
                Here you can manage your dial plans which are used to route outgoing calls from your local extensions.<br /><br />
                Related tasks:<br />
-               <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
-               <a href="<%=luci.dispatcher.build_url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
-               <a href="<%=luci.dispatcher.build_url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
+               <a href="<%=url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
+               <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
+               <a href="<%=url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
        </div>
        <!-- tblsection -->
        <fieldset class="cbi-section" id="cbi-asterisk-sip">
@@ -85,7 +85,7 @@
                                                <big>Dialplan <em><%=plan.name%></em></big>
                                        </th>
                                        <td>
-                                               <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans')%>?delplan=<%=plan.name%>">
+                                               <a href="<%=url('admin/asterisk/dialplans')%>?delplan=<%=plan.name%>">
                                                        <img style="border:none" alt="Remove this dialplan" title="Remove this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
                                        </td>
                                                </p>
                                        </td>
                                        <td style="width:5%" class="cbi-value-field">
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans/out', zone.name)%>">
+                                               <a href="<%=url('admin/asterisk/dialplans/out', zone.name)%>">
                                                        <img style="border:none" alt="Edit dialzone" title="Edit dialzone" src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
+                                               <a href="<%=url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
                                        </td>
                                                </p>
                                        </td>
                                        <td style="width:5%" class="cbi-value-field">
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/voicemail/mailboxes')%>">
+                                               <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>">
                                                        <img style="border:none" alt="Manage mailboxes ..." title="Manage mailboxes ..." src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
+                                               <a href="<%=url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
                                        </td>
                                                </p>
                                        </td>
                                        <td style="width:5%" class="cbi-value-field">
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/meetme/rooms')%>">
+                                               <a href="<%=url('admin/asterisk/meetme/rooms')%>">
                                                        <img style="border:none" alt="Manage conferences ..." title="Manage conferences ..." src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
-                                               <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
+                                               <a href="<%=url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
                                        </td>
index ac52791..ffdbbcf 100644 (file)
@@ -47,7 +47,7 @@
 %>
 
 
-<form method="post" action="<%=luci.dispatcher.build_url("admin", "asterisk", "dialplans", "zones")%>" enctype="multipart/form-data">
+<form method="post" action="<%=url('admin/asterisk/dialplans/zones')%>" enctype="multipart/form-data">
        <div>
                <script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
                <input type="hidden" name="cbi.submit" value="1" />
@@ -55,9 +55,9 @@
        </div>
 
 <div class="cbi-map" id="cbi-asterisk">
-       <h2><a id="content" name="content">Dial Zone Management</a></h2>
+       <h2 name="content">Dial Zone Management</h2>
        <div class="cbi-map-descr">
-               <a href="<%=luci.dispatcher.build_url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
+               <a href="<%=url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
                Here you can manage your dial zones. The zones are used to route outgoing calls to the destination.
                Each zone groups multiple trunks and number matches to represent a logical destination. Zones can
                also be used to enforce certain dial restrictions on selected extensions.
                                                <%=rule.description or rule.name%>
                                        </td>
                                        <td style="text-align:left" class="cbi-value-field">
-                                               <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans', 'out', rule.name)%>">
+                                               <a href="<%=url('admin/asterisk/dialplans/out', rule.name)%>">
                                                        <img style="border:none" alt="Edit entry" title="Edit entry" src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
-                                               <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans', 'zones')%>?delzone=<%=rule.name%>">
+                                               <a href="<%=url('admin/asterisk/dialplans/zones')%>?delzone=<%=rule.name%>">
                                                        <img style="border:none" alt="Delete entry" title="Delete entry" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
                                        </td>
index 72f1e1d..73b9e6a 100644 (file)
@@ -58,7 +58,7 @@
                        legend.parentNode.style.display = 'block';
                        legend.style.display = 'inline';
 
-                       stxhr.get('<%=luci.dispatcher.build_url("admin", "system", "commands", "run")%>/' + id + (args ? '/' + args : ''), null,
+                       stxhr.get('<%=url('admin/system/commands/run')%>/' + id + (args ? '/' + args : ''), null,
                                function(x, st)
                                {
                                        if (st)
@@ -93,7 +93,7 @@
                if (field)
                        args = encodeURIComponent(field.value);
 
-               location.href = '<%=luci.dispatcher.build_url("admin", "system", "commands", "download")%>/' + id + (args ? '/' + args : '');
+               location.href = '<%=url('admin/system/commands/download')%>/' + id + (args ? '/' + args : '');
        }
 
        function command_link(id)
 
 <form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
        <div class="cbi-map">
-               <h2><a id="content" name="content"><%:Custom Commands%></a></h2>
+               <h2 name="content"><%:Custom Commands%></h2>
 
                <fieldset class="cbi-section">
                        <% local _, command; for _, command in ipairs(commands) do %>
index 946dfef..29598ea 100644 (file)
@@ -10,39 +10,107 @@ local NX   = require "nixio"
 local NXFS = require "nixio.fs"
 local DISP = require "luci.dispatcher"
 local HTTP = require "luci.http"
-local UCI  = require "luci.model.uci"
+local I18N = require "luci.i18n"               -- not globally avalible here
+local IPKG = require "luci.model.ipkg"
 local SYS  = require "luci.sys"
-local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
+local UCI  = require "luci.model.uci"
 local UTIL = require "luci.util"
+local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
-DDNS_MIN = "2.4.2-1"   -- minimum version of service required
+local srv_name    = "ddns-scripts"
+local srv_ver_min = "2.5.0"                    -- minimum version of service required
+local srv_ver_cmd = [[/usr/lib/ddns/dynamic_dns_updater.sh --version | awk {'print $2'}]]
+local app_name    = "luci-app-ddns"
+local app_title   = "Dynamic DNS"
+local app_version = "2.3.0-1"
 
 function index()
        local nxfs      = require "nixio.fs"            -- global definitions not available
        local sys       = require "luci.sys"            -- in function index()
        local ddns      = require "luci.tools.ddns"     -- ddns multiused functions
-       local verinst   = ddns.ipkg_ver_installed("ddns-scripts")
-       local verok     = ddns.ipkg_ver_compare(verinst, ">=", "2.0.0-0")
-       -- do NOT start it not ddns-scripts version 2.x
-       if not verok then
-               return
-       end
+       local muci      = require "luci.model.uci"
+
        -- no config create an empty one
        if not nxfs.access("/etc/config/ddns") then
                nxfs.writefile("/etc/config/ddns", "")
        end
 
+       -- preset new option "lookup_host" if not already defined
+       local uci = muci.cursor()
+       local commit = false
+       uci:foreach("ddns", "service", function (s)
+               if not s["lookup_host"] and s["domain"] then
+                       uci:set("ddns", s[".name"], "lookup_host", s["domain"])
+                       commit = true
+               end
+       end)
+       if commit then uci:commit("ddns") end
+       uci:unload("ddns")
+
        entry( {"admin", "services", "ddns"}, cbi("ddns/overview"), _("Dynamic DNS"), 59)
        entry( {"admin", "services", "ddns", "detail"}, cbi("ddns/detail"), nil ).leaf = true
        entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints",
                {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true
        entry( {"admin", "services", "ddns", "global"}, cbi("ddns/global"), nil ).leaf = true
        entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true
-       entry( {"admin", "services", "ddns", "startstop"}, call("startstop") ).leaf = true
+       entry( {"admin", "services", "ddns", "startstop"}, post("startstop") ).leaf = true
        entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true
 end
 
--- function to read all sections status and return data array
+-- Application specific information functions
+function app_description()
+       return  I18N.translate("Dynamic DNS allows that your router can be reached with " ..
+                       "a fixed hostname while having a dynamically changing IP address.")
+               .. [[<br />]]
+               .. I18N.translate("OpenWrt Wiki") .. ": "
+               .. [[<a href="http://wiki.openwrt.org/doc/howto/ddns.client" target="_blank">]]
+               .. I18N.translate("DDNS Client Documentation") .. [[</a>]]
+               .. " --- "
+               .. [[<a href="http://wiki.openwrt.org/doc/uci/ddns" target="_blank">]]
+               .. I18N.translate("DDNS Client Configuration") .. [[</a>]]
+end
+function app_title_back()
+       return  [[<a href="]]
+               .. DISP.build_url("admin", "services", "ddns")
+               .. [[">]]
+               .. I18N.translate(app_title)
+               .. [[</a>]]
+end
+
+-- Standardized application/service functions
+function app_title_main()
+       return  [[<a href="javascript:alert(']]
+                       .. I18N.translate("Version Information")
+                       .. [[\n\n]] .. app_name
+                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
+                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+                               .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+                               .. (service_version() or I18N.translate("NOT installed"))
+                       .. [[\n\n]]
+               .. [[')">]]
+               .. I18N.translate(app_title)
+               .. [[</a>]]
+end
+function service_version()
+       local ver = nil
+       IPKG.list_installed(srv_name, function(n, ver, d)
+                       -- nothing to do
+               end
+       )
+       if not ver then
+               ver = UTIL.exec(srv_ver_cmd)
+               if #ver == 0 then ver = nil end
+       end
+       return  ver
+end
+function service_ok()
+       return  IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
+end
+
+-- internal function to read all sections status and return data array
 local function _get_status()
        local uci        = UCI.cursor()
        local service    = SYS.init.enabled("ddns") and 1 or 0
@@ -118,12 +186,12 @@ local function _get_status()
                end
 
                -- try to get registered IP
-               local domain    = s["domain"] or "_nodomain_"
+               local lookup_host = s["lookup_host"] or "_nolookup_"
                local dnsserver = s["dns_server"] or ""
                local force_ipversion = tonumber(s["force_ipversion"] or 0)
                local force_dnstcp = tonumber(s["force_dnstcp"] or 0)
                local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]]
-               command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
+               command = command .. [[ get_registered_ip ]] .. lookup_host .. [[ ]] .. use_ipv6 ..
                        [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
                local reg_ip = SYS.exec(command)
                if reg_ip == "" then
@@ -135,7 +203,7 @@ local function _get_status()
                        section  = section,
                        enabled  = enabled,
                        iface    = iface,
-                       domain   = domain,
+                       lookup   = lookup_host,
                        reg_ip   = reg_ip,
                        pid      = pid,
                        datelast = datelast,
@@ -235,3 +303,4 @@ function status()
        HTTP.prepare_content("application/json")
        HTTP.write_json(data)
 end
+
index 27f9a9f..88429fd 100644 (file)
@@ -8,13 +8,15 @@ local NX   = require "nixio"
 local NXFS = require "nixio.fs"
 local SYS  = require "luci.sys"
 local UTIL = require "luci.util"
+local HTTP = require "luci.http"
 local DISP = require "luci.dispatcher"
 local WADM = require "luci.tools.webadmin"
 local DTYP = require "luci.cbi.datatypes"
+local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
 -- takeover arguments -- #######################################################
-local section  = arg[1]
+local section = arg[1]
 
 -- check supported options -- ##################################################
 -- saved to local vars here because doing multiple os calls slow down the system
@@ -31,15 +33,15 @@ local bold_on       = "<strong>"
 local bold_off = "</strong>"
 
 -- error text constants -- #####################################################
-err_ipv6_plain = translate("IPv6 not supported") .. " - " ..
+local err_ipv6_plain = translate("IPv6 not supported") .. " - " ..
                translate("please select 'IPv4' address version")
-err_ipv6_basic = bold_on ..
+local err_ipv6_basic = bold_on ..
                        font_red ..
                                translate("IPv6 not supported") ..
                        font_off ..
                        "<br />" .. translate("please select 'IPv4' address version") ..
                 bold_off
-err_ipv6_other = bold_on ..
+local err_ipv6_other = bold_on ..
                        font_red ..
                                translate("IPv6 not supported") ..
                        font_off ..
@@ -52,16 +54,46 @@ err_ipv6_other = bold_on ..
                        [[</a>]] ..
                 bold_off
 
-function err_tab_basic(self)
+local function err_tab_basic(self)
        return translate("Basic Settings") .. " - " .. self.title .. ": "
 end
-function err_tab_adv(self)
+local function err_tab_adv(self)
        return translate("Advanced Settings") .. " - " .. self.title .. ": "
 end
-function err_tab_timer(self)
+local function err_tab_timer(self)
        return translate("Timer Settings") .. " - " .. self.title .. ": "
 end
 
+-- read services/services_ipv6 files -- ########################################
+local services4 = { }          -- IPv4 --
+local fd4 = io.open("/usr/lib/ddns/services", "r")
+if fd4 then
+       local ln, s, t
+       repeat
+               ln = fd4:read("*l")
+               s  = ln and ln:match('^%s*".*') -- only handle lines beginning with "
+               s  = s  and  s:gsub('"','')     -- remove "
+               t  = s  and UTIL.split(s,"(%s+)",nil,true)      -- split on whitespaces
+               if t then services4[t[1]]=t[2] end
+       until not ln
+       fd4:close()
+end
+
+local services6 = { }          -- IPv6 --
+local fd6 = io.open("/usr/lib/ddns/services_ipv6", "r")
+if fd6 then
+       local ln, s, t
+       repeat
+               ln = fd6:read("*l")
+               s  = ln and ln:match('^%s*".*') -- only handle lines beginning with "
+               s  = s  and  s:gsub('"','')     -- remove "
+               t  = s  and UTIL.split(s,"(%s+)",nil,true)      -- split on whitespaces
+               if t then services6[t[1]]=t[2] end
+       until not ln
+       fd6:close()
+end
+
+-- multi-used functions -- ####################################################
 -- function to verify settings around ip_source
 -- will use dynamic_dns_lucihelper to check if
 -- local IP can be read
@@ -105,18 +137,94 @@ local function _verify_ip_source()
        end
 end
 
--- cbi-map definition -- #######################################################
-m = Map("ddns")
+-- function to check if option is used inside url or script
+-- return -1 on error, 0 NOT required, 1 required
+local function _option_used(option, urlscript)
+       local surl      -- search string for url
+       local ssh       -- search string for script
+       local required  -- option used inside url or script
 
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
-               translate("Dynamic DNS")
+       if     option == "domain"    then surl, ssh = '%[DOMAIN%]', '%$domain'
+       elseif option == "username"  then surl, ssh = '%[USERNAME%]', '%$username'
+       elseif option == "password"  then surl, ssh = '%[PASSWORD%]', '%$password'
+       elseif option == "param_enc" then surl, ssh = '%[PARAMENC%]', '%$param_enc'
+       elseif option == "param_opt" then surl, ssh = '%[PARAMOPT%]', '%$param_opt'
+       else
+               error("undefined option")
+               return -1       -- return on error
+       end
 
-m.description = translate("Dynamic DNS allows that your router can be reached with " ..
-                       "a fixed hostname while having a dynamically changing " ..
-                       "IP address.")
+       local required = false
+       -- handle url
+       if urlscript:find('http') then
+               required = ( urlscript:find(surl) )
+       -- handle script
+       else
+               if not urlscript:find("/") then
+                       -- might be inside ddns-scripts directory
+                       urlscript = "/usr/lib/ddns/" .. urlscript
+               end
+               -- problem with script exit here
+               if not NXFS.access(urlscript) then return -1 end
+
+               local f = io.input(urlscript)
+               -- still problem with script exit here
+               if not f then return -1 end
+               for l in f:lines() do
+                       repeat
+                               if l:find('^#') then break end  -- continue on comment lines
+                               required = ( l:find(surl) or l:find(ssh) )
+                       until true
+                       if required then break end
+               end
+               f:close()
+       end
+       return (required and 1 or 0)
+end
 
-m.redirect = DISP.build_url("admin", "services", "ddns")
+-- function to verify if option is valid
+local function _option_validate(self, value)
+       -- section is globally defined here be calling agrument (see above)
+       local fusev6 = usev6:formvalue(section)
+       local fsvc4  = svc4:formvalue(section)
+       local fsvc6  = svc6:formvalue(section)
+       local urlsh, used
+
+       -- IP-Version dependent custom service selected
+       if (fusev6 == "0" and fsvc4 == "-") or
+          (fusev6 == "1" and fsvc6 == "-") then
+               -- read custom url
+               urlsh = uurl:formvalue(section)
+               -- no url then read custom script
+               if not urlsh or (#urlsh == 0) then
+                       urlsh = ush:formvalue(section)
+               end
+       -- IPv4 read from services4 table
+       elseif (fusev6 == "0") then
+               urlsh = services4[fsvc4]
+       -- IPv6 read from services6 table
+       else
+               urlsh = services6[fsvc6]
+       end
+       -- problem with url or script exit here
+       -- error handled somewhere else
+       if not urlsh or (#urlsh == 0) then return "" end
+
+       used = _option_used(self.option, urlsh)
+       -- on error or not used return empty sting
+       if used < 1 then return "" end
+       -- needed but no data then return error
+       if not value or (#value == 0) then
+               return nil, err_tab_basic(self) .. translate("missing / required")
+       end
+       return value
+end
+
+-- cbi-map definition -- #######################################################
+local m        = Map("ddns")
+m.title                = CTRL.app_title_back()
+m.description  = CTRL.app_description()
+m.redirect     = DISP.build_url("admin", "services", "ddns")
 
 m.on_after_commit = function(self)
        if self.changed then    -- changes ?
@@ -127,19 +235,42 @@ m.on_after_commit = function(self)
        end
 end
 
+-- provider switch was requested, save and reload page
+if m:formvalue("cbid.ddns.%s._switch" % section) then  -- section == arg[1]
+       local fsvc
+       local fusev6 = m:formvalue("cbid.ddns.%s.use_ipv6" % section)
+       if fusev6 == "1" then
+               fsvc = m:formvalue("cbid.ddns.%s.ipv6_service_name" % section)
+       else
+               fsvc = m:formvalue("cbid.ddns.%s.ipv4_service_name" % section)
+       end
+
+       if fusev6 ~= (m:get(section, "use_ipv6") or "0") then   -- IPv6 was changed
+               m:set(section, "use_ipv6", fusev6)              -- save it
+       end
+
+       if fsvc ~= "-" then                                     -- NOT "custom"
+               m:set(section, "service_name", fsvc)            -- save it
+       else                                                    -- else
+               m:del(section, "service_name")                  -- delete it
+       end
+       m.uci:save(m.config)
+
+       -- reload page
+       HTTP.redirect( DISP.build_url("admin", "services", "ddns", "detail", section) )
+       return
+end
+
 -- read application settings -- ################################################
 -- date format; if not set use ISO format
-date_format = m.uci:get(m.config, "global", "date_format") or "%F %R"
+local date_format = m.uci:get(m.config, "global", "date_format") or "%F %R"
 -- log directory
-log_dir = m.uci:get(m.config, "global", "log_dir") or "/var/log/ddns"
+local log_dir = m.uci:get(m.config, "global", "log_dir") or "/var/log/ddns"
 
 -- cbi-section definition -- ###################################################
-ns = m:section( NamedSection, section, "service",
+local ns = m:section( NamedSection, section, "service",
        translate("Details for") .. ([[: <strong>%s</strong>]] % section),
-       translate("Configure here the details for selected Dynamic DNS service.")
-       .. [[<br /><a href="http://wiki.openwrt.org/doc/uci/ddns#version_1x" target="_blank">]]
-       .. translate("For detailed information about parameter settings look here.")
-       .. [[</a>]] )
+       translate("Configure here the details for selected Dynamic DNS service.") )
 ns.instance = section  -- arg [1]
 ns:tab("basic", translate("Basic Settings"), nil )
 ns:tab("advanced", translate("Advanced Settings"), nil )
@@ -147,17 +278,33 @@ ns:tab("timer", translate("Timer Settings"), nil )
 ns:tab("logview", translate("Log File Viewer"), nil )
 
 -- TAB: Basic  #####################################################################################
--- enabled  -- #################################################################
+-- enabled -- #################################################################
 en = ns:taboption("basic", Flag, "enabled",
        translate("Enabled"),
        translate("If this service section is disabled it could not be started." .. "<br />" ..
                "Neither from LuCI interface nor from console") )
 en.orientation = "horizontal"
-function en.parse(self, section)
-       DDNS.flag_parse(self, section)
+
+-- IPv4/IPv6 - lookup_host -- #################################################
+luh = ns:taboption("basic", Value, "lookup_host",
+               translate("Lookup Hostname"),
+               translate("Hostname/FQDN to validate, if IP update happen or necessary") )
+luh.rmempty    = false
+luh.placeholder = "myhost.example.com"
+function luh.validate(self, value)
+       if not value
+       or not (#value > 0)
+       or not DTYP.hostname(value) then
+               return nil, err_tab_basic(self) .. translate("invalid FQDN / required - Sample") .. ": 'myhost.example.com'"
+       else
+               return UTIL.trim(value)
+       end
+end
+function luh.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
--- use_ipv6 (NEW)  -- ##########################################################
+-- use_ipv6 -- ################################################################
 usev6 = ns:taboption("basic", ListValue, "use_ipv6",
        translate("IP address version"),
        translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
@@ -180,36 +327,15 @@ function usev6.validate(self, value)
        end
        return nil, err_tab_basic(self) .. err_ipv6_plain
 end
-function usev6.write(self, section, value)
-       if value == "0" then    -- force rmempty
-               return self.map:del(section, self.option)
-       else
-               return self.map:set(section, self.option, value)
-       end
+function usev6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
--- IPv4 - service_name -- ######################################################
+-- IPv4 - service_name -- #####################################################
 svc4 = ns:taboption("basic", ListValue, "ipv4_service_name",
        translate("DDNS Service provider") .. " [IPv4]" )
 svc4.default   = "-"
 svc4:depends("use_ipv6", "0")  -- only show on IPv4
-
-local services4 = { }
-local fd4 = io.open("/usr/lib/ddns/services", "r")
-
-if fd4 then
-       local ln
-       repeat
-               ln = fd4:read("*l")
-               local s = ln and ln:match('^%s*"([^"]+)"')
-               if s then services4[#services4+1] = s end
-       until not ln
-       fd4:close()
-end
-
-for _, v in UTIL.vspairs(services4) do svc4:value(v) end
-svc4:value("-", translate("-- custom --") )
-
 function svc4.cfgvalue(self, section)
        local v =  DDNS.read_value(self, section, "service_name")
        if not v or #v == 0 then
@@ -230,14 +356,18 @@ function svc4.write(self, section, value)
                self.map:del(section, self.option)      -- to be shure
                if value ~= "-" then                    -- and write "service_name
                        self.map:del(section, "update_url")     -- delete update_url
+                       self.map:del(section, "update_script")  -- delete update_script
                        return self.map:set(section, "service_name", value)
                else
                        return self.map:del(section, "service_name")
                end
        end
 end
+function svc4.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv6 - service_name -- ######################################################
+-- IPv6 - service_name -- #####################################################
 svc6 = ns:taboption("basic", ListValue, "ipv6_service_name",
        translate("DDNS Service provider") .. " [IPv6]" )
 svc6.default   = "-"
@@ -245,23 +375,6 @@ svc6:depends("use_ipv6", "1")      -- only show on IPv6
 if not has_ipv6 then
        svc6.description = err_ipv6_basic
 end
-
-local services6 = { }
-local fd6 = io.open("/usr/lib/ddns/services_ipv6", "r")
-
-if fd6 then
-       local ln
-       repeat
-               ln = fd6:read("*l")
-               local s = ln and ln:match('^%s*"([^"]+)"')
-               if s then services6[#services6+1] = s end
-       until not ln
-       fd6:close()
-end
-
-for _, v in UTIL.vspairs(services6) do svc6:value(v) end
-svc6:value("-", translate("-- custom --") )
-
 function svc6.cfgvalue(self, section)
        local v =  DDNS.read_value(self, section, "service_name")
        if not v or #v == 0 then
@@ -283,33 +396,42 @@ function svc6.write(self, section, value)
                self.map:del(section, self.option)      -- delete "ipv6_service_name" helper
                if value ~= "-" then                    -- and write "service_name
                        self.map:del(section, "update_url")     -- delete update_url
+                       self.map:del(section, "update_script")  -- delete update_script
                        return self.map:set(section, "service_name", value)
                else
                        return self.map:del(section, "service_name")
                end
        end
 end
+function svc6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
+
+-- IPv4/IPv6 - change Provider -- #############################################
+svs            = ns:taboption("basic", Button, "_switch")
+svs.title      = translate("Really change DDNS provider?")
+svs.inputtitle = translate("Change provider")
+svs.inputstyle = "apply"
 
--- IPv4/IPv6 - update_url -- ###################################################
+-- IPv4/IPv6 - update_url -- ##################################################
 uurl = ns:taboption("basic", Value, "update_url",
        translate("Custom update-URL"),
        translate("Update URL to be used for updating your DDNS Provider." .. "<br />" ..
                "Follow instructions you will find on their WEB page.") )
-uurl:depends("ipv4_service_name", "-")
-uurl:depends("ipv6_service_name", "-")
 function uurl.validate(self, value)
-       local script = ush:formvalue(section)
+       local fush   = ush:formvalue(section)
+       local fusev6 = usev6:formvalue(section)
 
-       if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or
-          (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then
+       if (fusev6 == "0" and svc4:formvalue(section) ~= "-") or
+          (fusev6 == "1" and svc6:formvalue(section) ~= "-") then
                return ""       -- suppress validate error
        elseif not value then
-               if not script or not (#script > 0) then
+               if not fush or (#fush == 0) then
                        return nil, err_tab_basic(self) .. translate("missing / required")
                else
                        return ""       -- suppress validate error / update_script is given
                end
-       elseif (#script > 0) then
+       elseif (#fush > 0) then
                return nil, err_tab_basic(self) .. translate("either url or script could be set")
        end
 
@@ -326,80 +448,159 @@ function uurl.validate(self, value)
 
        return value
 end
+function uurl.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4/IPv6 - update_script -- ################################################
+-- IPv4/IPv6 - update_script -- ###############################################
 ush = ns:taboption("basic", Value, "update_script",
        translate("Custom update-script"),
        translate("Custom update script to be used for updating your DDNS Provider.") )
-ush:depends("ipv4_service_name", "-")
-ush:depends("ipv6_service_name", "-")
 function ush.validate(self, value)
-       local url = uurl:formvalue(section)
+       local fuurl  = uurl:formvalue(section)
+       local fusev6 = usev6:formvalue(section)
 
-       if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or
-          (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then
+       if (fusev6 == "0" and svc4:formvalue(section) ~= "-") or
+          (fusev6 == "1" and svc6:formvalue(section) ~= "-") then
                return ""       -- suppress validate error
        elseif not value then
-               if not url or not (#url > 0) then
+               if not fuurl or (#fuurl == 0) then
                        return nil, err_tab_basic(self) .. translate("missing / required")
                else
                        return ""       -- suppress validate error / update_url is given
                end
-       elseif (#url > 0) then
+       elseif (#fuurl > 0) then
                return nil, err_tab_basic(self) .. translate("either url or script could be set")
        elseif not NXFS.access(value) then
                return nil, err_tab_basic(self) .. translate("File not found")
        end
        return value
 end
+function ush.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4/IPv6 - domain -- #######################################################
+-- IPv4/IPv6 - domain -- ######################################################
 dom = ns:taboption("basic", Value, "domain",
-               translate("Hostname/Domain"),
+               translate("Domain"),
                translate("Replaces [DOMAIN] in Update-URL") )
-dom.rmempty    = false
-dom.placeholder        = "mypersonaldomain.dyndns.org"
+dom.placeholder = "myhost.example.com"
 function dom.validate(self, value)
-       if not value
-       or not (#value > 0)
-       or not DTYP.hostname(value) then
-               return nil, err_tab_basic(self) ..      translate("invalid - Sample") .. ": 'mypersonaldomain.dyndns.org'"
-       else
-               return value
-       end
+       return _option_validate(self, value)
+end
+function dom.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
--- IPv4/IPv6 - username -- #####################################################
+-- IPv4/IPv6 - username -- ####################################################
 user = ns:taboption("basic", Value, "username",
                translate("Username"),
-               translate("Replaces [USERNAME] in Update-URL") )
-user.rmempty = false
+               translate("Replaces [USERNAME] in Update-URL (URL-encoded)") )
 function user.validate(self, value)
-       if not value then
-               return nil, err_tab_basic(self) .. translate("missing / required")
-       end
-       return value
+       return _option_validate(self, value)
+end
+function user.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
--- IPv4/IPv6 - password -- #####################################################
+-- IPv4/IPv6 - password -- ####################################################
 pw = ns:taboption("basic", Value, "password",
                translate("Password"),
-               translate("Replaces [PASSWORD] in Update-URL") )
-pw.rmempty  = false
+               translate("Replaces [PASSWORD] in Update-URL (URL-encoded)") )
 pw.password = true
 function pw.validate(self, value)
-       if not value then
-               return nil, err_tab_basic(self) .. translate("missing / required")
+       return _option_validate(self, value)
+end
+function pw.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
+
+-- IPv4/IPv6 - param_enc -- ###################################################
+pe = ns:taboption("basic", Value, "param_enc",
+               translate("Optional Encoded Parameter"),
+               translate("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)") )
+function pe.validate(self, value)
+       return _option_validate(self, value)
+end
+function pe.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
+
+-- IPv4/IPv6 - param_enc -- ###################################################
+po = ns:taboption("basic", Value, "param_opt",
+               translate("Optional Parameter"),
+               translate("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)") )
+function po.validate(self, value)
+       return _option_validate(self, value)
+end
+function po.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
+
+-- handled service dependent show/display -- ##################################
+-- IPv4 --
+local cv4 = svc4:cfgvalue(section)
+if cv4 ~= "-" then
+       svs:depends ("ipv4_service_name", "-" ) -- show only if "-"
+       ush:depends ("ipv4_service_name", "?")
+       uurl:depends("ipv4_service_name", "?")
+else
+       uurl:depends("ipv4_service_name", "-")
+       ush:depends ("ipv4_service_name", "-")
+       dom:depends("ipv4_service_name", "-" )
+       user:depends("ipv4_service_name", "-" )
+       pw:depends("ipv4_service_name", "-" )
+       pe:depends("ipv4_service_name", "-" )
+       po:depends("ipv4_service_name", "-" )
+end
+for s, u in UTIL.kspairs(services4) do
+       svc4:value(s)   -- fill DropDown-List
+       if cv4 ~= s then
+               svs:depends("ipv4_service_name", s )
+       else
+               dom:depends ("ipv4_service_name", ((_option_used(dom.option, u) == 1) and s or "?") )
+               user:depends("ipv4_service_name", ((_option_used(user.option, u) == 1) and s or "?") )
+               pw:depends  ("ipv4_service_name", ((_option_used(pw.option, u) == 1) and s or "?") )
+               pe:depends  ("ipv4_service_name", ((_option_used(pe.option, u) == 1) and s or "?") )
+               po:depends  ("ipv4_service_name", ((_option_used(po.option, u) == 1) and s or "?") )
        end
-       return value
 end
+svc4:value("-", translate("-- custom --") )
+
+-- IPv6 --
+local cv6 = svc6:cfgvalue(section)
+if cv6 ~= "-" then
+       svs:depends ("ipv6_service_name", "-" )
+       uurl:depends("ipv6_service_name", "?")
+       ush:depends ("ipv6_service_name", "?")
+else
+       uurl:depends("ipv6_service_name", "-")
+       ush:depends ("ipv6_service_name", "-")
+       dom:depends("ipv6_service_name", "-" )
+       user:depends("ipv6_service_name", "-" )
+       pw:depends("ipv6_service_name", "-" )
+       pe:depends("ipv6_service_name", "-" )
+       po:depends("ipv6_service_name", "-" )
+end
+for s, u in UTIL.kspairs(services6) do
+       svc6:value(s)   -- fill DropDown-List
+       if cv6 ~= s then
+               svs:depends("ipv6_service_name", s )
+       else
+               dom:depends ("ipv6_service_name", ((_option_used(dom.option, u) == 1) and s or "?") )
+               user:depends("ipv6_service_name", ((_option_used(user.option, u) == 1) and s or "?") )
+               pw:depends  ("ipv6_service_name", ((_option_used(pw.option, u) == 1) and s or "?") )
+               pe:depends  ("ipv6_service_name", ((_option_used(pe.option, u) == 1) and s or "?") )
+               po:depends  ("ipv6_service_name", ((_option_used(po.option, u) == 1) and s or "?") )
+       end
+end
+svc6:value("-", translate("-- custom --") )
 
--- IPv4/IPv6 - use_https (NEW) -- ##############################################
+-- IPv4/IPv6 - use_https -- ###################################################
 if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
        https = ns:taboption("basic", Flag, "use_https",
                translate("Use HTTP Secure") )
        https.orientation = "horizontal"
-       https.rmempty = false -- force validate function
        function https.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
                if not has_ssl and value == "1" then
@@ -411,9 +612,6 @@ if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
                end
                return value
        end
-       function https.parse(self, section)
-               DDNS.flag_parse(self, section)
-       end
        function https.validate(self, value)
                if (value == "1" and has_ssl ) or value == "0" then return value end
                return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !"
@@ -428,7 +626,7 @@ if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
        end
 end
 
--- IPv4/IPv6 - cacert (NEW) -- #################################################
+-- IPv4/IPv6 - cacert -- ######################################################
 if has_ssl then
        cert = ns:taboption("basic", Value, "cacert",
                translate("Path to CA-Certificate"),
@@ -436,8 +634,8 @@ if has_ssl then
                translate("or") .. bold_on .. " IGNORE " .. bold_off ..
                translate("to run HTTPS without verification of server certificates (insecure)") )
        cert:depends("use_https", "1")
-       cert.rmempty = false -- force validate function
        cert.default = "/etc/ssl/certs"
+       cert.forcewrite = true
        function cert.validate(self, value)
                if https:formvalue(section) == "0" then
                        return ""       -- supress validate error if NOT https
@@ -452,10 +650,13 @@ if has_ssl then
                return nil, err_tab_basic(self) ..
                        translate("file or directory not found or not 'IGNORE'") .. " !"
        end
+       function cert.parse(self, section, novld)
+               DDNS.value_parse(self, section, novld)
+       end
 end
 
--- TAB: Advanced  ##################################################################################
--- IPv4 - ip_source -- #########################################################
+-- TAB: Advanced  #################################################################################
+-- IPv4 - ip_source -- ########################################################
 src4 = ns:taboption("advanced", ListValue, "ipv4_source",
        translate("IP address source") .. " [IPv4]",
        translate("Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider") )
@@ -501,8 +702,11 @@ function src4.write(self, section, value)
        self.map:del(section, self.option)               -- delete "ipv4_source" helper
        return self.map:set(section, "ip_source", value) -- and write "ip_source
 end
+function src4.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv6 - ip_source -- #########################################################
+-- IPv6 - ip_source -- ########################################################
 src6 = ns:taboption("advanced", ListValue, "ipv6_source",
        translate("IP address source") .. " [IPv6]",
        translate("Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider") )
@@ -553,8 +757,11 @@ function src6.write(self, section, value)
        self.map:del(section, self.option)               -- delete "ipv4_source" helper
        return self.map:set(section, "ip_source", value) -- and write "ip_source
 end
+function src6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 - ip_network (default "wan") -- ########################################
+-- IPv4 - ip_network (default "wan") -- #######################################
 ipn4 = ns:taboption("advanced", ListValue, "ipv4_network",
        translate("Network") .. " [IPv4]",
        translate("Defines the network to read systems IPv4-Address from") )
@@ -587,8 +794,11 @@ function ipn4.write(self, section, value)
                return self.map:set(section, "ip_network", value) -- and write "ip_network"
        end
 end
+function ipn4.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv6 - ip_network (default "wan6") -- #######################################
+-- IPv6 - ip_network (default "wan6") -- ######################################
 ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
        translate("Network") .. " [IPv6]" )
 ipn6:depends("ipv6_source", "network")
@@ -627,8 +837,11 @@ function ipn6.write(self, section, value)
                return self.map:set(section, "ip_network", value) -- and write "ip_network"
        end
 end
+function ipn6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 - ip_url (default "checkip.dyndns.com") -- #############################
+-- IPv4 - ip_url (default "checkip.dyndns.com") -- ############################
 iurl4 = ns:taboption("advanced", Value, "ipv4_url",
        translate("URL to detect") .. " [IPv4]",
        translate("Defines the Web page to read systems IPv4-Address from") )
@@ -669,8 +882,11 @@ function iurl4.write(self, section, value)
                return self.map:set(section, "ip_url", value)   -- and write "ip_url"
        end
 end
+function iurl4.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv6 - ip_url (default "checkipv6.dyndns.com") -- ###########################
+-- IPv6 - ip_url (default "checkipv6.dyndns.com") -- ##########################
 iurl6 = ns:taboption("advanced", Value, "ipv6_url",
        translate("URL to detect") .. " [IPv6]" )
 iurl6:depends("ipv6_source", "web")
@@ -717,8 +933,11 @@ function iurl6.write(self, section, value)
                return self.map:set(section, "ip_url", value)   -- and write "ip_url"
        end
 end
+function iurl6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 + IPv6 - ip_interface -- ###############################################
+-- IPv4 + IPv6 - ip_interface -- ##############################################
 ipi = ns:taboption("advanced", ListValue, "ip_interface",
        translate("Interface"),
        translate("Defines the interface to read systems IP-Address from") )
@@ -733,16 +952,18 @@ for _, v in pairs(SYS.net.devices()) do
        end
 end
 function ipi.validate(self, value)
-       if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface")
-       or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then
+       local fusev6 = usev6:formvalue(section)
+       if (fusev6 == "0" and src4:formvalue(section) ~= "interface")
+       or (fusev6 == "1" and src6:formvalue(section) ~= "interface") then
                return ""
        else
                return value
        end
 end
 function ipi.write(self, section, value)
-       if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface")
-       or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then
+       local fusev6 = usev6:formvalue(section)
+       if (fusev6 == "0" and src4:formvalue(section) ~= "interface")
+       or (fusev6 == "1" and src6:formvalue(section) ~= "interface") then
                return true
        else
                -- get network from device to
@@ -752,21 +973,24 @@ function ipi.write(self, section, value)
                return self.map:set(section, self.option, value)
        end
 end
+function ipi.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 + IPv6 - ip_script (NEW) -- ############################################
+-- IPv4 + IPv6 - ip_script -- #################################################
 ips = ns:taboption("advanced", Value, "ip_script",
        translate("Script"),
        translate("User defined script to read systems IP-Address") )
 ips:depends("ipv4_source", "script")   -- IPv4
 ips:depends("ipv6_source", "script")   -- or IPv6
-ips.rmempty    = false
 ips.placeholder = "/path/to/script.sh"
 function ips.validate(self, value)
+       local fusev6 = usev6:formvalue(section)
        local split
        if value then split = UTIL.split(value, " ") end
 
-       if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script")
-       or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then
+       if (fusev6 == "0" and src4:formvalue(section) ~= "script")
+       or (fusev6 == "1" and src6:formvalue(section) ~= "script") then
                return ""
        elseif not value or not (#value > 0) or not NXFS.access(split[1], "x") then
                return nil, err_tab_adv(self) ..
@@ -776,15 +1000,19 @@ function ips.validate(self, value)
        end
 end
 function ips.write(self, section, value)
-       if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script")
-       or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then
+       local fusev6 = usev6:formvalue(section)
+       if (fusev6 == "0" and src4:formvalue(section) ~= "script")
+       or (fusev6 == "1" and src6:formvalue(section) ~= "script") then
                return true
        else
                return self.map:set(section, self.option, value)
        end
 end
+function ips.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 - interface - default "wan" -- #########################################
+-- IPv4 - interface - default "wan" -- ########################################
 -- event network to monitor changes/hotplug/dynamic_dns_updater.sh
 -- only needs to be set if "ip_source"="web" or "script"
 -- if "ip_source"="network" or "interface" we use their network
@@ -799,27 +1027,32 @@ function eif4.cfgvalue(self, section)
        return DDNS.read_value(self, section, "interface")
 end
 function eif4.validate(self, value)
+       local fsrc4 = src4:formvalue(section)
        if usev6:formvalue(section) == "1"
-        or src4:formvalue(section) == "network"
-        or src4:formvalue(section) == "interface" then
+        or fsrc4 == "network"
+        or fsrc4 == "interface" then
                return ""       -- ignore IPv6, network, interface
        else
                return value
        end
 end
 function eif4.write(self, section, value)
+       local fsrc4 = src4:formvalue(section)
        if usev6:formvalue(section) == "1"
-        or src4:formvalue(section) == "network"
-        or src4:formvalue(section) == "interface" then
+        or fsrc4 == "network"
+        or fsrc4 == "interface" then
                return true     -- ignore IPv6, network, interface
        else
                self.map:del(section, self.option)               -- delete "ipv4_interface" helper
                return self.map:set(section, "interface", value) -- and write "interface"
        end
 end
+function eif4.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv6 - interface (NEW) - default "wan6" -- ##################################
--- event network to monitor changes/hotplug (NEW)
+-- IPv6 - interface - default "wan6" -- #######################################
+-- event network to monitor changes/hotplug
 -- only needs to be set if "ip_source"="web" or "script"
 -- if "ip_source"="network" or "interface" we use their network
 eif6 = ns:taboption("advanced", ListValue, "ipv6_interface",
@@ -837,9 +1070,10 @@ function eif6.cfgvalue(self, section)
        return DDNS.read_value(self, section, "interface")
 end
 function eif6.validate(self, value)
+       local fsrc6 = src6:formvalue(section)
        if usev6:formvalue(section) == "0"
-        or src4:formvalue(section) == "network"
-        or src4:formvalue(section) == "interface" then
+        or fsrc6 == "network"
+        or fsrc6 == "interface" then
                return ""       -- ignore IPv4, network, interface
        elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
@@ -848,23 +1082,26 @@ function eif6.validate(self, value)
        end
 end
 function eif6.write(self, section, value)
+       local fsrc6 = src6:formvalue(section)
        if usev6:formvalue(section) == "0"
-        or src4:formvalue(section) == "network"
-        or src4:formvalue(section) == "interface" then
+        or fsrc6 == "network"
+        or fsrc6 == "interface" then
                return true     -- ignore IPv4, network, interface
        else
                self.map:del(section, self.option)               -- delete "ipv6_interface" helper
                return self.map:set(section, "interface", value) -- and write "interface"
        end
 end
+function eif6.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4/IPv6 - bind_network -- #################################################
+-- IPv4/IPv6 - bind_network -- ################################################
 if has_ssl or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        bnet = ns:taboption("advanced", ListValue, "bind_network",
                translate("Bind Network") )
        bnet:depends("ipv4_source", "web")
        bnet:depends("ipv6_source", "web")
-       bnet.rmempty = true
        bnet.default = ""
        bnet:value("", translate("-- default --"))
        WADM.cbi_add_networks(bnet)
@@ -884,9 +1121,12 @@ if has_ssl or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
                if (value ~= "" and has_ssl ) or value == "" then return value end
                return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
        end
+       function bnet.parse(self, section, novld)
+               DDNS.value_parse(self, section, novld)
+       end
 end
 
--- IPv4 + IPv6 - force_ipversion (NEW) -- ######################################
+-- IPv4 + IPv6 - force_ipversion -- ###########################################
 -- optional to force wget/curl and host to use only selected IP version
 -- command parameter "-4" or "-6"
 if has_force or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
@@ -908,19 +1148,9 @@ if has_force or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
                if (value == "1" and has_force) or value == "0" then return value end
                return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
        end
-       function fipv.parse(self, section)
-               DDNS.flag_parse(self, section)
-       end
-       function fipv.write(self, section, value)
-               if value == "1" then
-                       return self.map:set(section, self.option, value)
-               else
-                       return self.map:del(section, self.option)
-               end
-       end
 end
 
--- IPv4 + IPv6 - dns_server (NEW) -- ###########################################
+-- IPv4 + IPv6 - dns_server -- ################################################
 -- optional DNS Server to use resolving my IP if "ip_source"="web"
 dns = ns:taboption("advanced", Value, "dns_server",
        translate("DNS-Server"),
@@ -929,7 +1159,7 @@ dns = ns:taboption("advanced", Value, "dns_server",
 dns.placeholder = "mydns.lan"
 function dns.validate(self, value)
        -- if .datatype is set, then it is checked before calling this function
-       if not value then
+       if not value or (#value == 0) then
                return ""       -- ignore on empty
        elseif not DTYP.host(value) then
                return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
@@ -947,8 +1177,11 @@ function dns.validate(self, value)
                end
        end
 end
+function dns.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- IPv4 + IPv6 - force_dnstcp (NEW) -- #########################################
+-- IPv4 + IPv6 - force_dnstcp -- ##############################################
 if has_dnstcp or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
        tcp = ns:taboption("advanced", Flag, "force_dnstcp",
                translate("Force TCP on DNS") )
@@ -970,12 +1203,9 @@ if has_dnstcp or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
                end
                return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
        end
-       function tcp.parse(self, section)
-               DDNS.flag_parse(self, section)
-       end
 end
 
--- IPv4 + IPv6 - proxy (NEW) -- ################################################
+-- IPv4 + IPv6 - proxy -- #####################################################
 -- optional Proxy to use for http/https requests  [user:password@]proxyhost[:port]
 if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
        pxy = ns:taboption("advanced", Value, "proxy",
@@ -997,7 +1227,7 @@ if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
        end
        function pxy.validate(self, value)
                -- if .datatype is set, then it is checked before calling this function
-               if not value then
+               if not value or (#value == 0) then
                        return ""       -- ignore on empty
                elseif has_proxy then
                        local ipv6  = usev6:formvalue(section) or "0"
@@ -1016,9 +1246,12 @@ if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
                        return nil, err_tab_adv(self) .. translate("PROXY-Server not supported")
                end
        end
+       function pxy.parse(self, section, novld)
+               DDNS.value_parse(self, section, novld)
+       end
 end
 
--- use_syslog -- ###############################################################
+-- use_syslog -- ##############################################################
 slog = ns:taboption("advanced", ListValue, "use_syslog",
        translate("Log to syslog"),
        translate("Writes log messages to syslog. Critical Errors will always be written to syslog.") )
@@ -1028,26 +1261,24 @@ slog:value("1", translate("Info"))
 slog:value("2", translate("Notice"))
 slog:value("3", translate("Warning"))
 slog:value("4", translate("Error"))
+function slog.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- use_logfile (NEW) -- ########################################################
+-- use_logfile -- #############################################################
 logf = ns:taboption("advanced", Flag, "use_logfile",
        translate("Log to file"),
        translate("Writes detailed messages to log file. File will be truncated automatically.") .. "<br />" ..
        translate("File") .. [[: "]] .. log_dir .. [[/]] .. section .. [[.log"]] )
 logf.orientation = "horizontal"
-logf.rmempty = false   -- we want to save in /etc/config/ddns file on "0" because
-logf.default = "1"     -- if not defined write to log by default
-function logf.parse(self, section)
-       DDNS.flag_parse(self, section)
-end
+logf.default     = "1"         -- if not defined write to log by default
 
--- TAB: Timer  #####################################################################################
--- check_interval -- ###########################################################
+-- TAB: Timer  ####################################################################################
+-- check_interval -- ##########################################################
 ci = ns:taboption("timer", Value, "check_interval",
        translate("Check Interval") )
 ci.template = "ddns/detail_value"
-ci.default  = 10
-ci.rmempty = false     -- validate ourselves for translatable error messages
+ci.default  = "10"
 function ci.validate(self, value)
        if not DTYP.uinteger(value)
        or tonumber(value) < 1 then
@@ -1062,7 +1293,7 @@ function ci.validate(self, value)
        end
 end
 function ci.write(self, section, value)
-       -- simulate rmempty=true remove default
+       -- remove when default
        local secs = DDNS.calc_seconds(value, cu:formvalue(section))
        if secs ~= 600 then     --default 10 minutes
                return self.map:set(section, self.option, value)
@@ -1071,20 +1302,22 @@ function ci.write(self, section, value)
                return self.map:del(section, self.option)
        end
 end
+function ci.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- check_unit -- ###############################################################
+-- check_unit -- ##############################################################
 cu = ns:taboption("timer", ListValue, "check_unit", "not displayed, but needed otherwise error",
        translate("Interval to check for changed IP" .. "<br />" ..
                "Values below 5 minutes == 300 seconds are not supported") )
 cu.template = "ddns/detail_lvalue"
 cu.default  = "minutes"
-cu.rmempty  = false    -- want to control write process
 cu:value("seconds", translate("seconds"))
 cu:value("minutes", translate("minutes"))
 cu:value("hours", translate("hours"))
 --cu:value("days", translate("days"))
 function cu.write(self, section, value)
-       -- simulate rmempty=true remove default
+       -- remove when default
        local secs = DDNS.calc_seconds(ci:formvalue(section), value)
        if secs ~= 600 then     --default 10 minutes
                return self.map:set(section, self.option, value)
@@ -1092,13 +1325,16 @@ function cu.write(self, section, value)
                return true
        end
 end
+function cu.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- force_interval (modified) -- ################################################
+-- force_interval (modified) -- ###############################################
 fi = ns:taboption("timer", Value, "force_interval",
        translate("Force Interval") )
 fi.template = "ddns/detail_value"
-fi.default  = 72       -- see dynamic_dns_updater.sh script
-fi.rmempty = false     -- validate ourselves for translatable error messages
+fi.default  = "72"     -- see dynamic_dns_updater.sh script
+--fi.rmempty = false   -- validate ourselves for translatable error messages
 function fi.validate(self, value)
        if not DTYP.uinteger(value)
        or tonumber(value) < 0 then
@@ -1132,15 +1368,18 @@ function fi.write(self, section, value)
                return self.map:del(section, self.option)
        end
 end
+function fi.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- force_unit -- ###############################################################
+-- force_unit -- ##############################################################
 fu = ns:taboption("timer", ListValue, "force_unit", "not displayed, but needed otherwise error",
        translate("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") )
 fu.template = "ddns/detail_lvalue"
 fu.default  = "hours"
-fu.rmempty  = false    -- want to control write process
+--fu.rmempty  = false  -- want to control write process
 --fu:value("seconds", translate("seconds"))
 fu:value("minutes", translate("minutes"))
 fu:value("hours", translate("hours"))
@@ -1154,15 +1393,17 @@ function fu.write(self, section, value)
                return true
        end
 end
+function fu.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- retry_count (NEW) -- ########################################################
+-- retry_count -- #############################################################
 rc = ns:taboption("timer", Value, "retry_count")
 rc.title       = translate("Error Retry Counter")
 rc.description = translate("On Error the script will stop execution after given number of retrys")
                .. "<br />"
                .. translate("The default setting of '0' will retry infinite.")
-rc.default     = 0
-rc.rmempty     = false -- validate ourselves for translatable error messages
+rc.default     = "0"
 function rc.validate(self, value)
        if not DTYP.uinteger(value) then
                return nil, err_tab_timer(self) .. translate("minimum value '0'")
@@ -1170,21 +1411,15 @@ function rc.validate(self, value)
                return value
        end
 end
-function rc.write(self, section, value)
-       -- simulate rmempty=true remove default
-       if tonumber(value) ~= self.default then
-               return self.map:set(section, self.option, value)
-       else
-               return self.map:del(section, self.option)
-       end
+function rc.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
--- retry_interval -- ###########################################################
+-- retry_interval -- ##########################################################
 ri = ns:taboption("timer", Value, "retry_interval",
        translate("Error Retry Interval") )
 ri.template = "ddns/detail_value"
-ri.default  = 60
-ri.rmempty  = false    -- validate ourselves for translatable error messages
+ri.default  = "60"
 function ri.validate(self, value)
        if not DTYP.uinteger(value)
        or tonumber(value) < 1 then
@@ -1203,13 +1438,16 @@ function ri.write(self, section, value)
                return self.map:del(section, self.option)
        end
 end
+function ri.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- retry_unit -- ###############################################################
+-- retry_unit -- ##############################################################
 ru = ns:taboption("timer", ListValue, "retry_unit", "not displayed, but needed otherwise error",
        translate("On Error the script will retry the failed action after given time") )
 ru.template = "ddns/detail_lvalue"
 ru.default  = "seconds"
-ru.rmempty  = false    -- want to control write process
+--ru.rmempty  = false  -- want to control write process
 ru:value("seconds", translate("seconds"))
 ru:value("minutes", translate("minutes"))
 --ru:value("hours", translate("hours"))
@@ -1223,8 +1461,11 @@ function ru.write(self, section, value)
                return true -- will be deleted by retry_interval
        end
 end
+function ru.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
--- TAB: LogView  (NEW) #############################################################################
+-- TAB: LogView  ##################################################################################
 lv = ns:taboption("logview", DummyValue, "_logview")
 lv.template = "ddns/detail_logview"
 lv.inputtitle = translate("Read / Reread log file")
index fbd3cb3..23ce4f1 100644 (file)
@@ -5,19 +5,14 @@ local NX   = require "nixio"
 local NXFS = require "nixio.fs"
 local DISP = require "luci.dispatcher"
 local SYS  = require "luci.sys"
+local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
 -- cbi-map definition -- #######################################################
 local m = Map("ddns")
-
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] 
-       .. translate("Dynamic DNS")
-
-m.description = translate("Dynamic DNS allows that your router can be reached with " ..
-                       "a fixed hostname while having a dynamically changing IP address.")
-
-m.redirect = DISP.build_url("admin", "services", "ddns")
+m.title                = CTRL.app_title_back()
+m.description  = CTRL.app_description()
+m.redirect     = DISP.build_url("admin", "services", "ddns")
 
 function m.commit_handler(self)
        if self.changed then    -- changes ?
@@ -53,17 +48,7 @@ ali.description = translate("Non-public and by default blocked IP's") .. ":"
                .. "0/8, 10/8, 100.64/10, 127/8, 169.254/16, 172.16/12, 192.168/16"
                .. [[<br /><strong>IPv6: </strong>]]
                .. "::/32, f000::/4"
-ali.reempty    = true
 ali.default    = "0"
-function ali.parse(self, section)
-       DDNS.flag_parse(self, section)
-end
-function ali.validate(self, value)
-       if value == self.default then
-               return "" -- default = empty
-       end
-       return value
-end
 
 -- date_format  -- #############################################################
 local df       = ns:option(Value, "date_format")
@@ -72,7 +57,6 @@ df.description        = [[<a href="http://www.cplusplus.com/reference/ctime/strftime/"
                .. translate("For supported codes look here") 
                .. [[</a>]]
 df.template    = "ddns/global_value"
-df.rmempty     = true
 df.default     = "%F %R"
 df.date_string = ""
 function df.cfgvalue(self, section)
@@ -81,55 +65,45 @@ function df.cfgvalue(self, section)
        self.date_string = DDNS.epoch2date(epoch, value)
        return value
 end
-function df.validate(self, value)
-       if value == self.default then
-               return "" -- default = empty
-       end
-       return value
+function df.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
 -- run_dir  -- #################################################################
 local rd       = ns:option(Value, "run_dir")
 rd.title       = translate("Status directory")
 rd.description = translate("Directory contains PID and other status information for each running section")
-rd.rmempty     = true
 rd.default     = "/var/run/ddns"
-function rd.validate(self, value)
-       if value == self.default then
-               return "" -- default = empty
-       end
-       return value
+-- no need to validate. if empty default is used everything else created by dns-scripts
+function rd.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
 -- log_dir  -- #################################################################
 local ld       = ns:option(Value, "log_dir")
 ld.title       = translate("Log directory")
 ld.description = translate("Directory contains Log files for each running section")
-ld.rmempty     = true
 ld.default     = "/var/log/ddns"
-function ld.validate(self, value)
-       if value == self.default then
-               return "" -- default = empty
-       end
-       return value
+-- no need to validate. if empty default is used everything else created by dns-scripts
+function ld.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
 end
 
 -- log_lines  -- ###############################################################
 local ll       = ns:option(Value, "log_lines")
 ll.title       = translate("Log length")
 ll.description = translate("Number of last lines stored in log files")
-ll.rmempty     = true
 ll.default     = "250"
 function ll.validate(self, value)
        local n = tonumber(value)
        if not n or math.floor(n) ~= n or n < 1 then
                return nil, self.title .. ": " .. translate("minimum value '1'")
        end
-       if value == self.default then
-               return "" -- default = empty
-       end
        return value
 end
+function ll.parse(self, section, novld)
+       DDNS.value_parse(self, section, novld)
+end
 
 -- use_curl  -- ################################################################
 if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) 
@@ -140,17 +114,7 @@ and NXFS.access("/usr/bin/curl") then
                .. [[<br />]]
                .. translate("To use cURL activate this option.")
        pc.orientation  = "horizontal"
-       pc.rmempty      = true
        pc.default      = "0"
-       function pc.parse(self, section)
-               DDNS.flag_parse(self, section)
-       end
-       function pc.validate(self, value)
-               if value == self.default then
-                       return "" -- default = empty
-               end
-               return value
-       end
 end
 
 return m
index ff7aa7a..031bf51 100644 (file)
@@ -1,9 +1,9 @@
 -- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
-local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DISP = require "luci.dispatcher"
 local SYS  = require "luci.sys"
+local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
 -- check supported options -- ##################################################
@@ -11,8 +11,6 @@ local DDNS = require "luci.tools.ddns"                -- ddns multiused functions
 has_ssl     = DDNS.check_ssl()         -- HTTPS support and --bind-network / --interface
 has_proxy   = DDNS.check_proxy()       -- Proxy support
 has_dnstcp  = DDNS.check_bind_host()   -- DNS TCP support
--- correct ddns-scripts version
-need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN)
 
 -- html constants
 font_red = [[<font color="red">]]
@@ -22,16 +20,9 @@ bold_off = [[</strong>]]
 
 -- cbi-map definition -- #######################################################
 m = Map("ddns")
-
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
-               translate("Dynamic DNS")
-
-m.description = translate("Dynamic DNS allows that your router can be reached with " ..
-                       "a fixed hostname while having a dynamically changing " ..
-                       "IP address.")
-
-m.redirect = DISP.build_url("admin", "services", "ddns")
+m.title                = CTRL.app_title_back()
+m.description  = CTRL.app_description()
+m.redirect     = DISP.build_url("admin", "services", "ddns")
 
 -- SimpleSection definition -- #################################################
 -- show Hints to optimize installation and script usage
@@ -40,7 +31,7 @@ s = m:section( SimpleSection,
        translate("Below a list of configuration tips for your system to run Dynamic DNS updates without limitations") )
 
 -- ddns_scripts needs to be updated for full functionality
-if need_update then
+if not CTRL.service_ok() then
        local dv = s:option(DummyValue, "_update_needed")
        dv.titleref = DISP.build_url("admin", "system", "packages")
        dv.rawhtml  = true
index 9e8df2d..46fc0a4 100644 (file)
@@ -2,10 +2,10 @@
 -- Licensed to the public under the Apache License 2.0.
 
 local NXFS = require "nixio.fs"
-local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DISP = require "luci.dispatcher"
 local HTTP = require "luci.http"
 local SYS  = require "luci.sys"
+local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
 -- show hints ?
@@ -15,7 +15,7 @@ show_hints = not (DDNS.check_ipv6()           -- IPv6 support
                and DDNS.check_bind_host()      -- DNS TCP support
                )
 -- correct ddns-scripts version
-need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN)
+need_update = not CTRL.service_ok()
 
 -- html constants
 font_red = [[<font color="red">]]
@@ -25,23 +25,8 @@ bold_off = [[</strong>]]
 
 -- cbi-map definition -- #######################################################
 m = Map("ddns")
-
--- first need to close <a> from cbi map template our <a> closed by template
-m.title        = [[</a><a href="javascript:alert(']]
-               .. translate("Version Information")
-               .. [[\n\nluci-app-ddns]]
-               .. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("luci-app-ddns")
-               .. [[\n\nddns-scripts ]] .. translate("required") .. [[:]]
-               .. [[\n\t]] .. translate("Version") .. [[:\t]] .. CTRL.DDNS_MIN .. [[ ]] .. translate("or higher")
-               .. [[\n\nddns-scripts ]] .. translate("installed") .. [[:]]
-               .. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("ddns-scripts")
-               .. [[\n\n]]
-       .. [[')">]]
-       .. translate("Dynamic DNS")
-
-m.description = translate("Dynamic DNS allows that your router can be reached with " ..
-                       "a fixed hostname while having a dynamically changing " ..
-                       "IP address.")
+m.title                = CTRL.app_title_main()
+m.description  = CTRL.app_description()
 
 m.on_after_commit = function(self)
        if self.changed then    -- changes ?
@@ -123,21 +108,21 @@ function ts.create(self, name)
        HTTP.redirect( self.extedit:format(name) )
 end
 
--- Domain and registered IP -- #################################################
-dom = ts:option(DummyValue, "_domainIP",
-       translate("Hostname/Domain") .. "<br />" .. translate("Registered IP") )
+-- Lookup_Host and registered IP -- #################################################
+dom = ts:option(DummyValue, "_lookupIP",
+       translate("Lookup Hostname") .. "<br />" .. translate("Registered IP") )
 dom.template = "ddns/overview_doubleline"
 function dom.set_one(self, section)
-       local domain = self.map:get(section, "domain") or ""
-       if domain ~= "" then
-               return domain
+       local lookup = self.map:get(section, "lookup_host") or ""
+       if lookup ~= "" then
+               return lookup
        else
                return [[<em>]] .. translate("config error") .. [[</em>]]
        end
 end
 function dom.set_two(self, section)
-       local domain = self.map:get(section, "domain") or ""
-       if domain == "" then return "" end
+       local lookup = self.map:get(section, "lookup_host") or ""
+       if lookup == "" then return "" end
        local dnsserver = self.map:get(section, "dnsserver") or ""
        local use_ipv6 = tonumber(self.map:get(section, "use_ipv6") or 0)
        local force_ipversion = tonumber(self.map:get(section, "force_ipversion") or 0)
@@ -146,7 +131,7 @@ function dom.set_two(self, section)
        if not NXFS.access(command, "rwx", "rx", "rx") then
                NXFS.chmod(command, 755)
        end
-       command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
+       command = command .. [[ get_registered_ip ]] .. lookup .. [[ ]] .. use_ipv6 ..
                [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
        local ip = SYS.exec(command)
        if ip == "" then ip = translate("no data") end
@@ -158,9 +143,6 @@ ena = ts:option( Flag, "enabled",
        translate("Enabled"))
 ena.template = "ddns/overview_enabled"
 ena.rmempty = false
-function ena.parse(self, section)
-       DDNS.flag_parse(self, section)
-end
 
 -- show PID and next update
 upd = ts:option( DummyValue, "_update",
index 4466063..ecc4131 100644 (file)
@@ -96,58 +96,6 @@ function get_pid(section)
        return pid
 end
 
--- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
-function ipkg_ver_compare(ver1, comp, ver2)
-       if not ver1 or not ver2
-       or not comp or not (#comp > 0) then return nil end
-       -- correct compare string
-       if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
-       elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
-       elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
-       elseif comp == "="  or comp == "==" then comp = "=="
-       elseif comp == "<<" then comp = "<"
-       elseif comp == ">>" then comp = ">"
-       else return nil end
-
-       local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
-       local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
-
-       for i = 1, math.max(table.getn(av1),table.getn(av2)), 1  do
-               local s1 = av1[i] or ""
-               local s2 = av2[i] or ""
-
-               -- first "not equal" found return true
-               if comp == "~=" and (s1 ~= s2) then return true end
-               -- first "lower" found return true
-               if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
-               -- first "greater" found return true
-               if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
-               -- not equal then return false
-               if (s1 ~= s2) then return false end
-       end
-
-       -- all equal and not compare greater or lower then true
-       return not (comp == "<" or comp == ">")
-end
-
--- read version information for given package if installed
-function ipkg_ver_installed(pkg)
-       local version = nil
-       local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
-       if control then
-               local ln
-               repeat
-                       ln = control:read("*l")
-                       if ln and ln:match("^Version: ") then
-                               version = ln:gsub("^Version: ", "")
-                               break
-                       end
-               until not ln
-               control:close()
-       end
-       return version
-end
-
 -- replacement of build-in read of UCI option
 -- modified AbstractValue.cfgvalue(self, section) from cbi.lua
 -- needed to read from other option then current value definition
@@ -172,24 +120,77 @@ function read_value(self, section, option)
        end
 end
 
--- replacement of build-in Flag.parse of cbi.lua
--- modified to mark section as changed if value changes
--- current parse did not do this, but it is done AbstaractValue.parse()
-function flag_parse(self, section)
-       local fexists = self.map:formvalue(
-               luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
+-- replacement of build-in parse of "Value"
+-- modified AbstractValue.parse(self, section, novld) from cbi.lua
+-- validate is called if rmempty/optional true or false
+-- before write check if forcewrite, value eq default, and more
+function value_parse(self, section, novld)
+       local fvalue = self:formvalue(section)
+       local fexist = ( fvalue and (#fvalue > 0) )     -- not "nil" and "not empty"
+       local cvalue = self:cfgvalue(section)
+       local rm_opt = ( self.rmempty or self.optional )
+       local eq_cfg                                    -- flag: equal cfgvalue
 
-       if fexists then
-               local fvalue = self:formvalue(section) and self.enabled or self.disabled
-               local cvalue = self:cfgvalue(section)
-               if fvalue ~= self.default or (not self.optional and not self.rmempty) then
-                       self:write(section, fvalue)
-               else
-                       self:remove(section)
+       -- If favlue and cvalue are both tables and have the same content
+       -- make them identical
+       if type(fvalue) == "table" and type(cvalue) == "table" then
+               eq_cfg = (#fvalue == #cvalue)
+               if eq_cfg then
+                       for i=1, #fvalue do
+                               if cvalue[i] ~= fvalue[i] then
+                                       eq_cfg = false
+                               end
+                       end
                end
-               if (fvalue ~= cvalue) then self.section.changed = true end
-       else
-               self:remove(section)
+               if eq_cfg then
+                       fvalue = cvalue
+               end
+       end
+
+       -- removed parameter "section" from function call because used/accepted nowhere
+       -- also removed call to function "transfer"
+       local vvalue, errtxt = self:validate(fvalue)
+
+       -- error handling; validate return "nil"
+       if not vvalue then
+               if novld then           -- and "novld" set
+                       return          -- then exit without raising an error
+               end
+
+               if fexist then          -- and there is a formvalue
+                       self:add_error(section, "invalid", errtxt)
+                       return          -- so data are invalid
+
+               elseif not rm_opt then  -- and empty formvalue but NOT (rmempty or optional) set
+                       self:add_error(section, "missing", errtxt)
+                       return          -- so data is missing
+               end
+       end
+       -- for whatever reason errtxt set and not handled above
+       assert( not (errtxt and (#errtxt > 0)), "unhandled validate error" )
+
+       -- lets continue with value returned from validate
+       eq_cfg  = ( vvalue == cvalue )                  -- update equal_config flag
+       local vexist = ( vvalue and (#vvalue > 0) )     -- not "nil" and "not empty"
+       local eq_def = ( vvalue == self.default )       -- equal_default flag
+
+       -- not forcewrite and (rmempty or optional)
+       -- and (no data or equal_default)
+       if not self.forcewrite and rm_opt
+         and (not vexist or eq_def) then
+               if self:remove(section) then            -- remove data from UCI
+                       self.section.changed = true     -- and push events
+               end
+               return
+       end
+
+       -- not forcewrite and no changes, so nothing to write
+       if not self.forcewrite and eq_cfg then
+               return
+       end
+
+       -- write data to UCI; raise event only on changes
+       if self:write(section, vvalue) and not eq_cfg then
                self.section.changed = true
        end
 end
index 494b743..fd1d5be 100644 (file)
@@ -6,7 +6,7 @@
                var txt = document.getElementById("cbid.ddns." + section + "._logview.txt");    // TextArea
                if ( !txt ) { return; } // security check
 
-               XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "logview")%>/' + section, null,
+               XHR.get('<%=url([[admin]], [[services]], [[ddns]], [[logview]])%>/' + section, null,
                        function(x) {
                                if (x.responseText == "_nodata_")
                                        txt.value = "<%:File not found or empty%>";
index ea8e4a1..b409ed0 100644 (file)
@@ -19,7 +19,7 @@
                        var section = data[i].section   // Section to handle
                        var cbx = document.getElementById("cbid.ddns." + section + ".enabled");         // Enabled
                        var btn = document.getElementById("cbid.ddns." + section + "._startstop");      // Start/Stop button
-                       var rip = document.getElementById("cbid.ddns." + section + "._domainIP.two");   // Registered IP
+                       var rip = document.getElementById("cbid.ddns." + section + "._lookupIP.two");   // Registered IP
                        var lup = document.getElementById("cbid.ddns." + section + "._update.one");     // Last Update
                        var nup = document.getElementById("cbid.ddns." + section + "._update.two");     // Next Update
                        if ( !(cbx && btn && rip && lup && nup) ) { return; }   // security check
                                        break;
                        }
 
-                       // domain
-                       // (data[i].domain ignored here
+                       // lookup
+                       // (data[i].lookup ignored here
 
                        // registered IP
                        // rip.innerHTML = "Registered IP";
-                       if (data[i].domain == "_nodomain_")
+                       if (data[i].lookup == "_nolookup_")
                                rip.innerHTML = '';
                        else if (data[i].reg_ip == "_nodata_")
                                rip.innerHTML = '<em><%:No data%></em>';
 
                // do start/stop
                var btnXHR = new XHR();
-               btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "startstop")%>/' + section + '/' + cbx.checked, null,
+               btnXHR.post('<%=url([[admin]], [[services]], [[ddns]], [[startstop]])%>/' + section + '/' + cbx.checked, { token: '<%=token%>' },
                        function(x, data) {
                                if (x.responseText == "_uncommitted_") {
                                        // we need a trick to display Ampersand "&" in stead of "&#38;" or "&amp;"
        }
 
        // force to immediate show status on page load (not waiting for XHR.poll)
-       XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+       XHR.get('<%=url([[admin]], [[services]], [[ddns]], [[status]])%>', null,
                function(x, data) {
                        if (data) { _data2elements(data); }
                }
        // define only ONE XHR.poll in a page because if one is running it blocks the other one
        // optimum is to define on Map or Section Level from here you can reach all elements
        // we need update every 15 seconds only
-       XHR.poll(15, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+       XHR.poll(5, '<%=url([[admin]], [[services]], [[ddns]], [[status]])%>', null,
                function(x, data) {
                        if (data) { _data2elements(data); }
                }
index 4ca0abb..5bdcb03 100644 (file)
                                        break;
                        }
 
-                       // domain
-                       if (data[j].domain == "_nodomain_")
+                       // lookup
+                       if (data[j].lookup == "_nolookup_")
                                tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
                        else
-                               tr.insertCell(-1).innerHTML = data[j].domain;
+                               tr.insertCell(-1).innerHTML = data[j].lookup;
 
                        // registered IP
                        switch (data[j].reg_ip) {
-                               case "_nodomain_":
+                               case "_nolookup_":
                                        tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
                                        break;
                                case "_nodata_":
        }
 
        // force to immediate show status (not waiting for XHR.poll)
-       XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+       XHR.get('<%=url([[admin]], [[services]], [[ddns]], [[status]])%>', null,
                function(x, data) {
                        if (data) { _data2elements(x, data); }
                }
        );
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+       XHR.poll(15, '<%=url([[admin]], [[services]], [[ddns]], [[status]])%>', null,
                function(x, data) {
                        if (data) { _data2elements(x, data); }
                }
 //]]></script>
 
 <fieldset class="cbi-section" id="ddns_status_section">
-       <legend><a href="<%=luci.dispatcher.build_url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
+       <legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
 
        <table class="cbi-section-table" id="ddns_status_table">
                <tr class="cbi-section-table-titles">
                        <th class="cbi-section-table-cell"><%:Configuration%></th>
                        <th class="cbi-section-table-cell"><%:Next Update%></th>
-                       <th class="cbi-section-table-cell"><%:Hostname/Domain%></th>
+                       <th class="cbi-section-table-cell"><%:Lookup Hostname%></th>
                        <th class="cbi-section-table-cell"><%:Registered IP%></th>
                        <th class="cbi-section-table-cell"><%:Network%></th>
                </tr>
index 35f13eb..8e1c8f5 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -111,6 +114,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -164,6 +173,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS dinàmic"
 
@@ -248,7 +260,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -333,6 +345,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -391,6 +409,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -421,16 +454,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -462,6 +498,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -578,7 +617,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 455c72a..bbab2d0 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -110,6 +113,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -163,6 +172,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dynamické DNS"
 
@@ -246,7 +258,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -331,6 +343,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -389,6 +407,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -419,16 +452,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -460,6 +496,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -576,7 +615,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 6ffde5d..e662adc 100644 (file)
@@ -1,15 +1,15 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: luci-app-ddns\n"
-"POT-Creation-Date: 2015-05-08 21:29+0100\n"
-"PO-Revision-Date: 2015-05-08 21:47+0100\n"
+"POT-Creation-Date: 2015-11-04 19:10-0100\n"
+"PO-Revision-Date: 2015-11-14 18:31+0100\n"
 "Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
 "Language-Team: \n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.7.5\n"
+"X-Generator: Poedit 1.8.6\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 "X-Poedit-Basepath: .\n"
@@ -70,6 +70,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr "Standard Benutzer sollten diese Einstellung nicht ändern."
 
+msgid "Change provider"
+msgstr "Anbieter wechseln"
+
 msgid "Check Interval"
 msgstr "Prüfinterval"
 
@@ -125,6 +128,12 @@ msgstr "Eigenes Update-Skript"
 msgid "DDNS Autostart disabled"
 msgstr "DDNS Autostart deaktiviert"
 
+msgid "DDNS Client Configuration"
+msgstr "DDNS Client Konfiguration"
+
+msgid "DDNS Client Documentation"
+msgstr "DDNS Client Dokumentation"
+
 msgid "DDNS Service provider"
 msgstr "DDNS-Dienstanbieter"
 
@@ -196,6 +205,9 @@ msgstr ""
 msgid "Disabled"
 msgstr "Deaktiviert"
 
+msgid "Domain"
+msgstr "Domäne"
+
 msgid "Dynamic DNS"
 msgstr "Dynamisches DNS"
 
@@ -284,8 +296,10 @@ msgstr "HTTPS nicht unterstützt"
 msgid "Hints"
 msgstr "Hinweise"
 
-msgid "Hostname/Domain"
-msgstr "Rechnername/Domäne"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
+msgstr ""
+"Hostname/FQDN um zu überprüfen, ob eine Aktualisierung stattgefunden hat "
+"oder notwendig ist"
 
 msgid "IP address source"
 msgstr "IP-Adressquelle"
@@ -385,6 +399,12 @@ msgstr "Protokoll in Datei schreiben"
 msgid "Log to syslog"
 msgstr "Systemprotokoll verwenden"
 
+msgid "Lookup Hostname"
+msgstr "Nachschlage-Hostname"
+
+msgid "NOT installed"
+msgstr "NICHT installiert"
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -454,6 +474,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr "Das Skript wird nach der gegebenen Anzahl von Fehlversuchen beendet."
 
+msgid "OpenWrt Wiki"
+msgstr "OpenWrt Wiki"
+
+msgid "Optional Encoded Parameter"
+msgstr "Optionaler codierten Parameter"
+
+msgid "Optional Parameter"
+msgstr "Optionaler Parameter"
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr "Optional: Ersetzt [PARAMENC] in der Update-URL (URL-codiert)"
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr "Optional: Ersetzt [PARAMENC] in der Update-URL (NICHT URL-codiert)"
+
 msgid "Overview"
 msgstr "Übersicht"
 
@@ -484,17 +519,20 @@ msgstr "Prozess ID"
 msgid "Read / Reread log file"
 msgstr "Protokolldatei (neu) einlesen"
 
+msgid "Really change DDNS provider?"
+msgstr "Wirklich DDNS-Anbieter wechseln?"
+
 msgid "Registered IP"
 msgstr "Registrierte IP"
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr "Ersetzt [DOMAIN] in der Update-URL"
 
-msgid "Replaces [PASSWORD] in Update-URL"
-msgstr "Ersetzt [PASSWORD] in der Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
+msgstr "Ersetzt [PASSWORD] in der Update-URL (URL-codiert)"
 
-msgid "Replaces [USERNAME] in Update-URL"
-msgstr "Ersetzt [USERNAME] in der Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
+msgstr "Ersetzt [USERNAME] in der Update-URL (URL-codiert)"
 
 msgid "Run once"
 msgstr "Einmalig ausführen"
@@ -528,7 +566,7 @@ msgstr ""
 "Optionen."
 
 msgid "The default setting of '0' will retry infinite."
-msgstr "Der Standard-Wert von '0' wird es endlosen erneut versuchen."
+msgstr "Beim Standard-Wert von '0' wird es endlos erneut versucht."
 
 msgid "There is no service configured."
 msgstr "Kein Dienst konfiguriert"
@@ -661,8 +699,8 @@ msgstr "Stunden"
 msgid "installed"
 msgstr "installiert"
 
-msgid "invalid - Sample"
-msgstr "ungültig - Beispiel"
+msgid "invalid FQDN / required - Sample"
+msgstr "ungültige FQDN / Pflichtfeld - Beispiel"
 
 msgid "minimum value '0'"
 msgstr "Minimum Wert '0'"
index edbe19d..a8bb5d6 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Δυναμικό DNS"
 
@@ -245,7 +257,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -330,6 +342,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -388,6 +406,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -418,16 +451,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -459,6 +495,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -575,7 +614,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index b706fa2..5cfaee3 100644 (file)
@@ -61,6 +61,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -107,6 +110,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -160,6 +169,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dynamic DNS"
 
@@ -243,7 +255,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -328,6 +340,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -386,6 +404,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -416,16 +449,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -457,6 +493,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -573,7 +612,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 1948155..7d96297 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS dinámico"
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 94b61b6..67535c6 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS Dynamique"
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index a6d2030..ed696d7 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -111,6 +114,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -164,6 +173,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS דינאמי"
 
@@ -247,7 +259,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -332,6 +344,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -390,6 +408,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -420,16 +453,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -461,6 +497,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -577,7 +616,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index fdd9a17..6cb3980 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -110,6 +113,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -163,6 +172,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dinamikus DNS"
 
@@ -246,7 +258,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -331,6 +343,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -389,6 +407,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -419,16 +452,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -460,6 +496,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -576,7 +615,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 48e6809..5ba86ed 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS Dinamico"
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 488bac9..04967f9 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "ダイナミックDNS"
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 5b7f0de..83cef94 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr ""
 
@@ -242,7 +254,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -327,6 +339,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -385,6 +403,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -415,16 +448,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -456,6 +492,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -572,7 +611,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index b805aa4..303972c 100644 (file)
@@ -53,6 +53,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -99,6 +102,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -152,6 +161,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dynamisk DNS"
 
@@ -235,7 +247,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -320,6 +332,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -378,6 +396,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -408,16 +441,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -449,6 +485,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -565,7 +604,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index e016cc4..53bbb9f 100644 (file)
@@ -63,6 +63,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -109,6 +112,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -162,6 +171,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dynamiczny DNS"
 
@@ -245,7 +257,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -330,6 +342,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -388,6 +406,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -418,16 +451,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -459,6 +495,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -575,7 +614,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index df2fff5..bfd1af2 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -108,6 +111,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -161,6 +170,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS Dinâmico"
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 5765492..b24e685 100644 (file)
@@ -62,6 +62,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -109,6 +112,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -162,6 +171,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS Dinâmico"
 
@@ -246,7 +258,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -331,6 +343,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -389,6 +407,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -419,16 +452,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -460,6 +496,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -576,7 +615,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 78c39d5..9d92688 100644 (file)
@@ -65,6 +65,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -111,6 +114,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -164,6 +173,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "DNS dinamic"
 
@@ -247,7 +259,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -332,6 +344,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -390,6 +408,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -420,16 +453,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -461,6 +497,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -577,7 +616,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index d4c0eb4..2f96780 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -110,6 +113,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -163,6 +172,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Динамический DNS"
 
@@ -246,7 +258,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -331,6 +343,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -389,6 +407,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -419,16 +452,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -460,6 +496,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -576,7 +615,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 3cd0f4c..c825a56 100644 (file)
@@ -57,6 +57,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -103,6 +106,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -156,6 +165,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr ""
 
@@ -237,7 +249,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -322,6 +334,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -380,6 +398,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -410,16 +443,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -451,6 +487,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -567,7 +606,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index cee36e7..b46c22b 100644 (file)
@@ -58,6 +58,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -104,6 +107,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -157,6 +166,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr ""
 
@@ -238,7 +250,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -323,6 +335,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -381,6 +399,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -411,16 +444,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -452,6 +488,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -568,7 +607,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 3538680..7ab51dd 100644 (file)
@@ -50,6 +50,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -96,6 +99,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -149,6 +158,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr ""
 
@@ -230,7 +242,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -315,6 +327,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -373,6 +391,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -403,16 +436,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -563,7 +599,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 10492bc..8df9a95 100644 (file)
@@ -64,6 +64,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -110,6 +113,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -163,6 +172,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr ""
 
@@ -244,7 +256,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -329,6 +341,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -387,6 +405,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -417,16 +450,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -458,6 +494,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -574,7 +613,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 0e2c580..1c44ef2 100644 (file)
@@ -65,6 +65,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -111,6 +114,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -164,6 +173,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Динамічний DNS"
 
@@ -247,7 +259,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -332,6 +344,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -390,6 +408,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -420,16 +453,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -461,6 +497,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -577,7 +616,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 5d5a7ed..66f7c2c 100644 (file)
@@ -63,6 +63,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -110,6 +113,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -163,6 +172,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "Dynamic DNS"
 
@@ -247,7 +259,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -332,6 +344,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -390,6 +408,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -420,16 +453,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -461,6 +497,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -577,7 +616,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 862c2a0..b1a636a 100644 (file)
@@ -12,6 +12,9 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 1.7.5\n"
 
+msgid "&"
+msgstr ""
+
 msgid "-- custom --"
 msgstr "-- 自定义 --"
 
@@ -30,10 +33,13 @@ msgstr "正在应用更改"
 msgid "Basic Settings"
 msgstr "基础设置"
 
-msgid "Below a list of configuration tips for your system to run Dynamic DNS updates without limitations"
+msgid ""
+"Below a list of configuration tips for your system to run Dynamic DNS "
+"updates without limitations"
 msgstr "以下是一个能够让你的系统不受限制地进行动态DNS更新的设置贴士."
 
-msgid "Below is a list of configured DDNS configurations and their current state."
+msgid ""
+"Below is a list of configured DDNS configurations and their current state."
 msgstr "一下是当前已经配置好的DDNS设置项列表以及它们的当前状态."
 
 msgid "Bind Network"
@@ -42,15 +48,22 @@ msgstr "使用的接口"
 msgid "Binding to a specific network not supported"
 msgstr "不支持绑定到一个指定的网络"
 
-msgid "BusyBox's nslookup and Wget do not support to specify the IP version to use for communication with DDNS Provider."
+msgid ""
+"BusyBox's nslookup and Wget do not support to specify the IP version to use "
+"for communication with DDNS Provider."
 msgstr "与DDNS供应商通讯时BusyBox的nslookup和Wget不支持设置特定的IP协议版本."
 
-msgid "BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server"
+msgid ""
+"BusyBox's nslookup does not support to specify to use TCP instead of default "
+"UDP when requesting DNS server"
 msgstr "BusyBox的nslookup不支持使用TCP协议代替UDP协议请求DNS记录"
 
 msgid "Casual users should not change this setting"
 msgstr "普通用户不应该改变这个设置"
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr "检查时间周期"
 
@@ -63,7 +76,9 @@ msgstr "配置错误"
 msgid "Configuration"
 msgstr "设置"
 
-msgid "Configure here the details for all Dynamic DNS services including this LuCI application."
+msgid ""
+"Configure here the details for all Dynamic DNS services including this LuCI "
+"application."
 msgstr "在这里修改动态DNS服务的详细配置"
 
 msgid "Configure here the details for selected Dynamic DNS service."
@@ -72,11 +87,20 @@ msgstr "在这里修改选择的DDNS服务的详细配置"
 msgid "Current setting"
 msgstr "当前设置"
 
-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 "现在,DDNS更新在开机或者接口动作时不会被触发<br />如果你手工运行DDNS脚本的话(例如使用cron时把force_interval设置为0),这是默认设置."
+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 ""
+"现在,DDNS更新在开机或者接口动作时不会被触发<br />如果你手工运行DDNS脚本的话"
+"(例如使用cron时把force_interval设置为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 "现在,DDNS更新在开机或者接口动作时不会被触发<br />你可以在这里开始/停止每一个设置的条目.它在下次重启之前一直有效."
+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 ""
+"现在,DDNS更新在开机或者接口动作时不会被触发<br />你可以在这里开始/停止每一个"
+"设置的条目.它在下次重启之前一直有效."
 
 msgid "Custom update script to be used for updating your DDNS Provider."
 msgstr "用来更新动态DNS的自定义脚本"
@@ -90,6 +114,12 @@ msgstr "自定义更新脚本"
 msgid "DDNS Autostart disabled"
 msgstr "DDNS自动启动已禁用."
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr "DDNS服务提供商"
 
@@ -117,10 +147,14 @@ msgstr "设定用来读取系统IPv4地址的网络"
 msgid "Defines the network to read systems IPv6-Address from"
 msgstr "设定用来读取系统IPv6地址的网络"
 
-msgid "Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider"
+msgid ""
+"Defines the source to read systems IPv4-Address from, that will be send to "
+"the DDNS provider"
 msgstr "设定IPv4地址的来源.这将会被发送给DDNS提供商"
 
-msgid "Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider"
+msgid ""
+"Defines the source to read systems IPv6-Address from, that will be send to "
+"the DDNS provider"
 msgstr "设定IPv6地址的来源.这将会被发送给DDNS提供商"
 
 msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
@@ -132,16 +166,22 @@ msgstr "详情:"
 msgid "Directory contains Log files for each running section"
 msgstr "保存每一个运行中的设置的运行日志的目录"
 
-msgid "Directory contains PID and other status information for each running section"
+msgid ""
+"Directory contains PID and other status information for each running section"
 msgstr "保存每个运行中的设置的PID以及其它状态信息的目录"
 
 msgid "Disabled"
 msgstr "已禁用"
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "动态DNS"
 
-msgid "Dynamic DNS allows that your router can be reached with a fixed hostname while having a dynamically changing IP address."
+msgid ""
+"Dynamic DNS allows that your router can be reached with a fixed hostname "
+"while having a dynamically changing IP address."
 msgstr "动态DNS允许为拥有动态IP的主机配置一个固定的可访问域名."
 
 msgid "Enable secure communication with DDNS provider"
@@ -171,8 +211,12 @@ msgstr "文件未找到"
 msgid "File not found or empty"
 msgstr "文件未找到或为空"
 
-msgid "Follow this link<br />You will find more hints to optimize your system to run DDNS scripts with all options"
-msgstr "打开这个链接<br />你将会得到更多关于如何通过所有设置项优化你的系统以运行DDNS脚本的提示."
+msgid ""
+"Follow this link<br />You will find more hints to optimize your system to "
+"run DDNS scripts with all options"
+msgstr ""
+"打开这个链接<br />你将会得到更多关于如何通过所有设置项优化你的系统以运行DDNS"
+"脚本的提示."
 
 msgid "For detailed information about parameter settings look here."
 msgstr "请看这里获得关于参数设置的详细信息"
@@ -201,7 +245,9 @@ msgstr "格式"
 msgid "Format: IP or FQDN"
 msgstr "格式:IP或者FQDN"
 
-msgid "GNU Wget will use the IP of given network, cURL will use the physical interface."
+msgid ""
+"GNU Wget will use the IP of given network, cURL will use the physical "
+"interface."
 msgstr "GNU Wget将会使用给定的网络的IP地址,而cURL将会使用物理接口"
 
 msgid "Global Settings"
@@ -213,8 +259,8 @@ msgstr "不支持HTTPS"
 msgid "Hints"
 msgstr "提示"
 
-msgid "Hostname/Domain"
-msgstr "主机名/域名"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
+msgstr ""
 
 msgid "IP address source"
 msgstr "IP地址来源"
@@ -228,8 +274,13 @@ msgstr "IPv4地址"
 msgid "IPv6 address must be given in square brackets"
 msgstr "IPv6地址必须填写在中括号(\"[  ]\")内"
 
-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<br />请查看OpenWrt首页的介绍以启用IPv6支持<br />或者更新你的系统到最新OpenWrt版本"
+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<br />请查看OpenWrt首页的介绍以启用IPv6支持"
+"<br />或者更新你的系统到最新OpenWrt版本"
 
 msgid "IPv6 not supported"
 msgstr "IPv6不被支持"
@@ -240,13 +291,21 @@ msgstr "IPv6地址"
 msgid "If both cURL and GNU Wget are installed, Wget is used by default."
 msgstr "如果cURL和GNU Wget同时被安装,那么Wget将会被优先使用."
 
-msgid "If this service section is disabled it could not be started.<br />Neither from LuCI interface nor from console"
-msgstr "如果服务配置被禁用那么它将不能被启动.<br />无论是通过LuCI页面或者是通过终端."
+msgid ""
+"If this service section is disabled it could not be started.<br />Neither "
+"from LuCI interface nor from console"
+msgstr ""
+"如果服务配置被禁用那么它将不能被启动.<br />无论是通过LuCI页面或者是通过终端."
 
-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 "如果你需要同时更新IPv4和IPv6地址,你需要单独添加两个配置项(例如'myddns_ipv4'和'myddns_ipv6')"
+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 ""
+"如果你需要同时更新IPv4和IPv6地址,你需要单独添加两个配置项(例"
+"如'myddns_ipv4'和'myddns_ipv6')"
 
-msgid "In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
+msgid ""
+"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
 msgstr "OpenWrt中,cURL/libcurl的某些版本编译时没有启用代理服务器支持"
 
 msgid "Info"
@@ -255,11 +314,18 @@ msgstr "信息"
 msgid "Interface"
 msgstr "接口"
 
-msgid "Interval to check for changed IP<br />Values below 5 minutes == 300 seconds are not supported"
+msgid ""
+"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
+"are not supported"
 msgstr "检查IP是否改变的时间隔<br />不支持低于5分钟(300秒)的数值."
 
-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 "强制向提供商更新DDNS的时间周期<br />把这个参数设置为0将会让脚本仅执行一次<br />不支持低于\"检查时间周期\"的数值(除了0)."
+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 ""
+"强制向提供商更新DDNS的时间周期<br />把这个参数设置为0将会让脚本仅执行一次"
+"<br />不支持低于\"检查时间周期\"的数值(除了0)."
 
 msgid "It is NOT recommended for casual users to change settings on this page."
 msgstr "强烈不建议初次使用的用户修改本页设定."
@@ -285,10 +351,20 @@ msgstr "把日志记录到文件"
 msgid "Log to syslog"
 msgstr "把日志记录到系统日志"
 
-msgid "Neither GNU Wget with SSL nor cURL installed to select a network to use for communication."
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
+"communication."
 msgstr "包含SSL支持的GNU Wget或者cURL均未被安装.无法选择一个网络用于通信."
 
-msgid "Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol."
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
+"protocol."
 msgstr "包含SSL支持的GNU Wget或者cURL均未被安装.无法使用HTTPS更新DDNS"
 
 msgid "Network"
@@ -339,6 +415,21 @@ msgstr "当出错时,脚本将会重试失败的动作的次数"
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr "当出错时,脚本将会重试该次数之后退出"
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr "总览"
 
@@ -369,17 +460,20 @@ msgstr "处理ID"
 msgid "Read / Reread log file"
 msgstr "读取/重新读取日志文件"
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr "已注册的IP地址"
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr "在更新URL中使用[DOMAIN]替换域名"
 
-msgid "Replaces [PASSWORD] in Update-URL"
-msgstr "在更新URL中使用[PASSWORD]替换密码"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
+msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
-msgstr "在更新URL中使用[USERNAME]替换用户名"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
+msgstr ""
 
 msgid "Run once"
 msgstr "运行一次"
@@ -405,9 +499,14 @@ msgstr "状态目录"
 msgid "Stopped"
 msgstr "已停止"
 
-msgid "The currently installed 'ddns-scripts' package did not support all available settings."
+msgid ""
+"The currently installed 'ddns-scripts' package did not support all available "
+"settings."
 msgstr "当前已安装的'ddns-scripts'软件包暂不支持所有可用设置项"
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr "没有已经配置好的服务项"
 
@@ -429,8 +528,11 @@ msgstr "用于检测的URL"
 msgid "Unknown error"
 msgstr "未知错误"
 
-msgid "Update URL to be used for updating your DDNS Provider.<br />Follow instructions you will find on their WEB page."
-msgstr "DDNS提供商用于更新DDNS的URL<br />跟随教程你将会在它们的网站上提供这个URL."
+msgid ""
+"Update URL to be used for updating your DDNS Provider.<br />Follow "
+"instructions you will find on their WEB page."
+msgstr ""
+"DDNS提供商用于更新DDNS的URL<br />跟随教程你将会在它们的网站上提供这个URL."
 
 msgid "Update error"
 msgstr "更新错误"
@@ -462,10 +564,13 @@ msgstr "正在应用更改..."
 msgid "Warning"
 msgstr "等待"
 
-msgid "Writes detailed messages to log file. File will be truncated automatically."
+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."
+msgid ""
+"Writes log messages to syslog. Critical Errors will always be written to "
+"syslog."
 msgstr "把日志写入系统日志.无论是否启用这项,错误信息总是会被写入系统日志"
 
 msgid "You should install BIND host package for DNS requests."
@@ -519,8 +624,8 @@ msgstr "小时"
 msgid "installed"
 msgstr "已安装"
 
-msgid "invalid - Sample"
-msgstr "不合法 - 示例"
+msgid "invalid FQDN / required - Sample"
+msgstr ""
 
 msgid "minimum value '0'"
 msgstr "最小值0"
@@ -599,3 +704,15 @@ msgstr "未指定的错误"
 
 msgid "use hostname, FQDN, IPv4- or IPv6-Address"
 msgstr "使用主机名或IPv4/IPv6地址"
+
+#~ msgid "Hostname/Domain"
+#~ msgstr "主机名/域名"
+
+#~ msgid "Replaces [PASSWORD] in Update-URL"
+#~ msgstr "在更新URL中使用[PASSWORD]替换密码"
+
+#~ msgid "Replaces [USERNAME] in Update-URL"
+#~ msgstr "在更新URL中使用[USERNAME]替换用户名"
+
+#~ msgid "invalid - Sample"
+#~ msgstr "不合法 - 示例"
index ec930f4..7671366 100644 (file)
@@ -60,6 +60,9 @@ msgstr ""
 msgid "Casual users should not change this setting"
 msgstr ""
 
+msgid "Change provider"
+msgstr ""
+
 msgid "Check Interval"
 msgstr ""
 
@@ -106,6 +109,12 @@ msgstr ""
 msgid "DDNS Autostart disabled"
 msgstr ""
 
+msgid "DDNS Client Configuration"
+msgstr ""
+
+msgid "DDNS Client Documentation"
+msgstr ""
+
 msgid "DDNS Service provider"
 msgstr ""
 
@@ -159,6 +168,9 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
+msgid "Domain"
+msgstr ""
+
 msgid "Dynamic DNS"
 msgstr "動態DNS"
 
@@ -241,7 +253,7 @@ msgstr ""
 msgid "Hints"
 msgstr ""
 
-msgid "Hostname/Domain"
+msgid "Hostname/FQDN to validate, if IP update happen or necessary"
 msgstr ""
 
 msgid "IP address source"
@@ -326,6 +338,12 @@ msgstr ""
 msgid "Log to syslog"
 msgstr ""
 
+msgid "Lookup Hostname"
+msgstr ""
+
+msgid "NOT installed"
+msgstr ""
+
 msgid ""
 "Neither GNU Wget with SSL nor cURL installed to select a network to use for "
 "communication."
@@ -384,6 +402,21 @@ msgstr ""
 msgid "On Error the script will stop execution after given number of retrys"
 msgstr ""
 
+msgid "OpenWrt Wiki"
+msgstr ""
+
+msgid "Optional Encoded Parameter"
+msgstr ""
+
+msgid "Optional Parameter"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"
+msgstr ""
+
+msgid "Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"
+msgstr ""
+
 msgid "Overview"
 msgstr ""
 
@@ -414,16 +447,19 @@ msgstr ""
 msgid "Read / Reread log file"
 msgstr ""
 
+msgid "Really change DDNS provider?"
+msgstr ""
+
 msgid "Registered IP"
 msgstr ""
 
 msgid "Replaces [DOMAIN] in Update-URL"
 msgstr ""
 
-msgid "Replaces [PASSWORD] in Update-URL"
+msgid "Replaces [PASSWORD] in Update-URL (URL-encoded)"
 msgstr ""
 
-msgid "Replaces [USERNAME] in Update-URL"
+msgid "Replaces [USERNAME] in Update-URL (URL-encoded)"
 msgstr ""
 
 msgid "Run once"
@@ -455,6 +491,9 @@ msgid ""
 "settings."
 msgstr ""
 
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
 msgid "There is no service configured."
 msgstr ""
 
@@ -571,7 +610,7 @@ msgstr ""
 msgid "installed"
 msgstr ""
 
-msgid "invalid - Sample"
+msgid "invalid FQDN / required - Sample"
 msgstr ""
 
 msgid "minimum value '0'"
index 328c4ec..c667767 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
 <p><%:The entries in the menu allow you to perform diagnostic tests on your system to aid in troubleshooting.%></p>
 <p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
 <%+footer%>
index 595cc5f..3d01453 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
 <p><%:With this menu you can configure network diagnostics, such as network device scans and ping tests.%></p>
 <p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
 <%+footer%>
index 258fdee..0424fff 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Diagnostics Tools (Device Info)
-LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo
+LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo @BROKEN
 
 include ../../luci.mk
 
index 6015ffe..4470a0d 100644 (file)
@@ -1,4 +1,4 @@
--- Copyright 2014 Álvaro Fernández Rojas <noltari@gmail.com>
+-- Copyright 2014-2015 Álvaro Fernández Rojas <noltari@gmail.com>
 -- Licensed to the public under the Apache License 2.0.
 
 m = Map("dump1090", "dump1090", translate("dump1090 is a Mode S decoder specifically designed for RTLSDR devices, here you can configure the settings."))
@@ -12,6 +12,7 @@ enable.enabled="0"
 enable.disabled="1"
 enable.default = "1"
 enable.rmempty = false
+
 respawn=s:option(Flag, "respawn", translate("Respawn"))
 respawn.default = false
 
@@ -34,6 +35,15 @@ ifile=s:option(Value, "ifile", translate("Data file"))
 ifile.rmempty = true
 ifile.datatype = "file"
 
+iformat=s:option(ListValue, "iformat", translate("Sample format for data file"))
+iformat:value("", translate("Default"))
+iformat:value("UC8")
+iformat:value("SC16")
+iformat:value("SC16Q11")
+
+throttle=s:option(Flag, "throttle", translate("When reading from a file play back in realtime, not at max speed"))
+throttle.default = false
+
 raw=s:option(Flag, "raw", translate("Show only messages hex values"))
 raw.default = false
 
@@ -76,13 +86,17 @@ net_bo_port=s:option(Value, "net_bo_port", translate("TCP Beast output listen po
 net_bo_port.rmempty = true
 net_bo_port.datatype = "port"
 
+net_fatsv_port=s:option(Value, "net_fatsv_port", translate("FlightAware TSV output port"))
+net_fatsv_port.rmempty = true
+net_fatsv_port.datatype = "port"
+
 net_ro_size=s:option(Value, "net_ro_size", translate("TCP raw output minimum size"))
 net_ro_size.rmempty = true
 net_ro_size.datatype = "uinteger"
 
-net_ro_rate=s:option(Value, "net_ro_rate", translate("TCP raw output memory flush rate"))
-net_ro_rate.rmempty = true
-net_ro_rate.datatype = "uinteger"
+net_ro_interval=s:option(Value, "net_ro_interval", translate("TCP raw output memory flush rate in seconds"))
+net_ro_interval.rmempty = true
+net_ro_interval.datatype = "uinteger"
 
 net_heartbeat=s:option(Value, "net_heartbeat", translate("TCP heartbeat rate in seconds"))
 net_heartbeat.rmempty = true
@@ -92,13 +106,23 @@ net_buffer=s:option(Value, "net_buffer", translate("TCP buffer size 64Kb * (2^n)
 net_buffer.rmempty = true
 net_buffer.datatype = "uinteger"
 
+net_verbatim=s:option(Flag, "net_verbatim", translate("Do not apply CRC corrections to messages we forward"))
+net_verbatim.default = false
+
+forward_mlat=s:option(Flag, "forward_mlat", translate("Allow forwarding of received mlat results to output ports"))
+forward_mlat.default = false
+
 lat=s:option(Value, "lat", translate("Reference/receiver latitude for surface posn"))
 lat.rmempty = true
-lat.datatype = "integer"
+lat.datatype = "float"
 
 lon=s:option(Value, "lon", translate("Reference/receiver longitude for surface posn"))
 lon.rmempty = true
-lon.datatype = "integer"
+lon.datatype = "float"
+
+max_range=s:option(Value, "max_range", translate("Absolute maximum range for position decoding"))
+max_range.rmempty = true
+max_range.datatype = "uinteger"
 
 fix=s:option(Flag, "fix", translate("Enable single-bits error correction using CRC"))
 fix.default = false
@@ -121,6 +145,9 @@ mlat.default = false
 stats=s:option(Flag, "stats", translate("Print stats at exit"))
 stats.default = false
 
+stats_range=s:option(Flag, "stats_range", translate("Collect/show range histogram"))
+stats_range.default = false
+
 stats_every=s:option(Value, "stats_every", translate("Show and reset stats every seconds"))
 stats_every.rmempty = true
 stats_every.datatype = "uinteger"
@@ -131,15 +158,42 @@ onlyaddr.default = false
 metric=s:option(Flag, "metric", translate("Use metric units"))
 metric.default = false
 
-snip=s:option(Flag, "snip", translate("Strip IQ file removing samples"))
+snip=s:option(Value, "snip", translate("Strip IQ file removing samples"))
 snip.rmempty = true
 snip.datatype = "uinteger"
 
-debug_mode=s:option(Flag, "debug", translate("Debug mode flags"))
+debug_mode=s:option(Value, "debug", translate("Debug mode flags"))
 debug_mode.rmempty = true
 
-ppm=s:option(Flag, "ppm", translate("Set receiver error in parts per million"))
+ppm=s:option(Value, "ppm", translate("Set receiver error in parts per million"))
 ppm.rmempty = true
 ppm.datatype = "uinteger"
 
+html_dir=s:option(Value, "html_dir", translate("Base directory for the internal HTTP server"))
+html_dir.rmempty = true
+html_dir.datatype = "directory"
+
+write_json=s:option(Value, "write_json", translate("Periodically write json output to a directory"))
+write_json.rmempty = true
+write_json.datatype = "directory"
+
+write_json_every=s:option(Flag, "write_json_every", translate("Write json output every t seconds"))
+write_json_every.rmempty = true
+write_json_every.datatype = "uinteger"
+
+json_location_accuracy=s:option(ListValue, "json_location_accuracy", translate("Accuracy of receiver location in json metadata"))
+json_location_accuracy:value("", translate("Default"))
+json_location_accuracy:value("0", "No location")
+json_location_accuracy:value("1", "Approximate")
+json_location_accuracy:value("2", "Exact")
+
+oversample=s:option(Flag, "oversample", translate("Use the 2.4MHz demodulator"))
+oversample.default = false
+
+dcfilter=s:option(Flag, "dcfilter", translate("Apply a 1Hz DC filter to input data"))
+dcfilter.default = false
+
+measure_noise=s:option(Flag, "measure_noise", translate("Measure noise power"))
+measure_noise.default = false
+
 return m
index 0cb30b5..60af531 100644 (file)
@@ -316,4 +316,34 @@ else
                translate("Passes additional arguments to iptables. Use with care!"))
 end
 
+o = s:option(MultiValue, "weekdays", translate("Week Days"))
+o.oneline = true
+o.widget = "checkbox"
+o:value("sun", translate("Sunday"))
+o:value("mon", translate("Monday"))
+o:value("tue", translate("Tuesday"))
+o:value("wed", translate("Wednesday"))
+o:value("thu", translate("Thursday"))
+o:value("fri", translate("Friday"))
+o:value("sat", translate("Saturday"))
+
+o = s:option(MultiValue, "monthdays", translate("Month Days"))
+o.oneline = true
+o.widget = "checkbox"
+for i = 1,31 do
+       o:value(translate(i))
+end
+
+o = s:option(Value, "start_time", translate("Start Time (hh:mm:ss)"))
+o.datatype = "timehhmmss"
+o = s:option(Value, "stop_time", translate("Stop Time (hh:mm:ss)"))
+o.datatype = "timehhmmss"
+o = s:option(Value, "start_date", translate("Start Date (yyyy-mm-dd)"))
+o.datatype = "dateyyyymmdd"
+o = s:option(Value, "stop_date", translate("Stop Date (yyyy-mm-dd)"))
+o.datatype = "dateyyyymmdd"
+
+o = s:option(Flag, "utc_time", translate("Time in UTC"))
+o.default = o.disabled
+
 return m
index 46b3744..c8b8f22 100644 (file)
@@ -60,7 +60,7 @@ s:tab("advanced", translate("Advanced Settings"))
 name = s:taboption("general", Value, "name", translate("Name"))
 name.optional = false
 name.forcewrite = true
-name.datatype = "uciname"
+name.datatype = "and(uciname,maxlength(11))"
 
 function name.write(self, section, value)
        if zone:name() ~= value then
@@ -76,15 +76,6 @@ function name.write(self, section, value)
        }
 end
 
-function name.validate(self, value)
-       -- fw3 defines 14 as the maximum length of zone name
-       if #value > 14 then
-               return nil, translate("Zone name is too long")
-       else
-               return value
-       end
-end
-
 p = {
        s:taboption("general", ListValue, "input", translate("Input")),
        s:taboption("general", ListValue, "output", translate("Output")),
index 18be74d..2ccd25c 100644 (file)
@@ -301,7 +301,7 @@ msgid "Restrict Masquerading to given destination subnets"
 msgstr "Ogranicz maskaradę do wskazanych sieci docelowych"
 
 msgid "Restrict Masquerading to given source subnets"
-msgstr "Ogranicz maskaradÄ\99 do wskazanych sieci Å¼ródłowych"
+msgstr "Ogranicz maskaradÄ\99 do wskazanych sieci Åºródłowych"
 
 # Wstawiłem rodzinę gdyż gdzieś wcześniej było tak opisane ale klasa pasuje mi tu bardziej.
 # Obsy - niestety ale "rodzina". W gui dotyczy to wyboru IPv4/IPv6, więc "rodzina" a nie klasa.
@@ -317,7 +317,7 @@ msgid ""
 "Rewrite matched traffic to the given source port. May be left empty to only "
 "rewrite the IP address."
 msgstr ""
-"Przepisz dopasowany ruch do danego portu Å¼ródłowego. Można zostawić puste "
+"Przepisz dopasowany ruch do danego portu Åºródłowego. Można zostawić puste "
 "aby przepisać tylko adres IP"
 
 msgid "Rewrite to source %s"
@@ -339,7 +339,7 @@ msgid "Source MAC address"
 msgstr "Źródłowy adres MAC"
 
 msgid "Source NAT"
-msgstr "NAT Å¼ródłowy"
+msgstr "NAT Åºródłowy"
 
 # http://www.digipedia.pl/def/doc/id/677604507/name/SNAT/
 msgid ""
@@ -348,7 +348,7 @@ msgid ""
 "multiple WAN addresses to internal subnets."
 msgstr ""
 "SNAT używany jest wtedy, gdy zmieniane są adresy pakietów połączenia "
-"wychodzÄ\85cego, czyli pakiety Å¼ródłowe. Wykonywany jest zawsze po routowaniu "
+"wychodzÄ\85cego, czyli pakiety Åºródłowe. Wykonywany jest zawsze po routowaniu "
 "(POSTROUTING), a więc w chwili, gdy pakiety są gotowe opuścić host. "
 "IPmasquerading jest formą SNAT."
 
index 2f4914e..fe205d0 100644 (file)
@@ -34,7 +34,7 @@ local has_traceroute6 = fs.access("/usr/bin/traceroute6")
                        legend.parentNode.style.display = 'block';
                        legend.style.display = 'inline';
 
-                       stxhr.get('<%=luci.dispatcher.build_url("freifunk", "status")%>/diag_' + tool + protocol + '/' + addr, null,
+                       stxhr.get('<%=url('freifunk/status')%>/diag_' + tool + protocol + '/' + addr, null,
                                function(x)
                                {
                                        if (x.responseText)
@@ -55,7 +55,7 @@ local has_traceroute6 = fs.access("/usr/bin/traceroute6")
 
 <form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
        <div class="cbi-map">
-               <h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+               <h2 name="content"><%:Diagnostics%></h2>
 
                <fieldset class="cbi-section">
                        <legend><%:Network Utilities%></legend>
index e319f15..f2e2fb9 100644 (file)
@@ -33,7 +33,7 @@ end
 <div id="<%=name%>" style="width:<%=width%>;float:left">
        <h2><%=title%></h2>
        <div id="form_<%=name%>">
-               <form name="searchform" id="search_<%=name%>" action="<%=luci.dispatcher.build_url('freifunk', 'search_redirect')%>">
+               <form name="searchform" id="search_<%=name%>" action="<%=url('freifunk/search_redirect')%>">
                        <input type="text" name="searchterms" style="margin-bottom:15px; width: 90%"><br />
                        <%
                        local checked = " checked"
index 234f909..d861ef9 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "telephony", "status")%>', null,
+XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
        function(x, st)
        {
                var tb = document.getElementById('telephony_status_table');
index 098a72a..866eded 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin/services/minidlna_status")%>', null,
+       XHR.poll(5, '<%=url("admin/services/minidlna_status")%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('minidlna_status');
index 5cd722f..ecb374d 100644 (file)
@@ -37,9 +37,15 @@ msgstr ""
 msgid "Drop frames smaller then this limit"
 msgstr ""
 
+msgid "Enable MJPG-streamer"
+msgstr ""
+
 msgid "Enable YUYV format"
 msgstr ""
 
+msgid "Enabled"
+msgstr ""
+
 msgid "Exceed"
 msgstr ""
 
@@ -63,9 +69,15 @@ msgstr ""
 msgid "Frames per second"
 msgstr ""
 
+msgid "General"
+msgstr ""
+
 msgid "HTTP output"
 msgstr ""
 
+msgid "Input plugin"
+msgstr ""
+
 msgid "Interval between saving pictures"
 msgstr ""
 
@@ -90,9 +102,15 @@ msgstr ""
 msgid "On"
 msgstr ""
 
+msgid "Output plugin"
+msgstr ""
+
 msgid "Password"
 msgstr ""
 
+msgid "Plugin settings"
+msgstr ""
+
 msgid "Port"
 msgstr ""
 
index 3ad9a4a..8b51f6a 100644 (file)
@@ -13,25 +13,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
-
-msgid "Enabled"
-msgstr "启用"
-
-msgid "Enable MJPG-streamer"
-msgstr "启用MJPG-streamer"
-
-msgid "General"
-msgstr "一般设置"
-
-msgid "Plugin settings"
-msgstr "插件设置"
-
-msgid "Input plugin"
-msgstr "输入插件"
-
-msgid "Output plugin"
-msgstr "输出插件"
-
 msgid "Allow ringbuffer to exceed limit by this amount"
 msgstr "允许环形缓冲区最多超过这个数值"
 
@@ -68,9 +49,15 @@ msgstr "不要初始化dynctrls"
 msgid "Drop frames smaller then this limit"
 msgstr "丢弃小于该尺寸限制的帧"
 
+msgid "Enable MJPG-streamer"
+msgstr "启用MJPG-streamer"
+
 msgid "Enable YUYV format"
 msgstr "启用YUYV格式"
 
+msgid "Enabled"
+msgstr "启用"
+
 msgid "Exceed"
 msgstr "超出"
 
@@ -94,9 +81,15 @@ msgstr "保存网页的文件夹"
 msgid "Frames per second"
 msgstr "帧每秒"
 
+msgid "General"
+msgstr "一般设置"
+
 msgid "HTTP output"
 msgstr "HTTP输出"
 
+msgid "Input plugin"
+msgstr "输入插件"
+
 msgid "Interval between saving pictures"
 msgstr "图片保存时间间隔"
 
@@ -121,9 +114,15 @@ msgstr "关"
 msgid "On"
 msgstr "开"
 
+msgid "Output plugin"
+msgstr "输出插件"
+
 msgid "Password"
 msgstr "密码"
 
+msgid "Plugin settings"
+msgstr "插件设置"
+
 msgid "Port"
 msgstr "端口"
 
index 8c4127b..03bfad1 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "multiwan", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/network/multiwan/status')%>', null,
                function(x, st)
                {
                        var tx = document.getElementById('multiwan_status_text');
index 1a54f75..4d2447e 100644 (file)
@@ -118,7 +118,7 @@ msgid "WAN Interfaces"
 msgstr "Interfaces WAN"
 
 msgid "WAN Uplink"
-msgstr "Enalce saliente WAN"
+msgstr "Enlace saliente WAN"
 
 msgid "all"
 msgstr "todos"
index dbeaaf8..79c6ddb 100644 (file)
@@ -28,7 +28,7 @@ function index()
                call("ocserv_status")).leaf = true
 
        entry({"admin", "services", "ocserv", "disconnect"},
-               call("ocserv_disconnect")).leaf = true
+               post("ocserv_disconnect")).leaf = true
 
 end
 
index d1cc155..74edaf4 100644 (file)
@@ -74,12 +74,6 @@ o.default = "plain"
 o:value("plain")
 o:value("PAM")
 
-o = s:taboption("general", Value, "zone", translate("Firewall Zone"),
-       translate("The firewall zone that the VPN clients will be set to"))
-o.nocreate = true
-o.default = "lan"
-o.template = "cbi/firewall_zonelist"
-
 s:taboption("general", Value, "port", translate("Port"),
        translate("The same UDP and TCP ports will be used"))
 s:taboption("general", Value, "max_clients", translate("Max clients"))
@@ -102,22 +96,6 @@ local cisco = s:taboption("general", Flag, "cisco_compat", translate("AnyConnect
        translate("Enable support for CISCO AnyConnect clients"))
 cisco.default = "1"
 
-ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"))
-ipaddr.datatype = "ip4addr"
-ipaddr.default = "192.168.100.1"
-
-nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
-nm.datatype = "ip4addr"
-nm.default = "255.255.255.0"
-nm:value("255.255.255.0")
-nm:value("255.255.0.0")
-nm:value("255.0.0.0")
-
-if has_ipv6 then
-       ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"))
-       ip6addr.datatype = "ip6addr"
-end
-
 
 tmpl = s:taboption("template", Value, "_tmpl",
        translate("Edit the template that is used for generating the ocserv configuration."))
@@ -144,10 +122,36 @@ function ca.cfgvalue(self, section)
        return nixio.fs.readfile("/etc/ocserv/ca.pem")
 end
 
+--[[Networking options]]--
+
+local parp = s:taboption("general", Flag, "proxy_arp", translate("Enable proxy arp"),
+       translate("Provide addresses to clients from a subnet of LAN; if enabled the network below must be a subnet of LAN. Note that the first address of the specified subnet will be reserved by ocserv, so it should not be in use. If you have a network in LAN covering 192.168.1.0/24 use 192.168.1.192/26 to reserve the upper 62 addresses."))
+parp.default = "0"
+
+ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"),
+        translate("The IPv4 subnet address to provide to clients; this should be some private network different than the LAN addresses unless proxy ARP is enabled. Leave empty to attempt auto-configuration."))
+ipaddr.datatype = "ip4addr"
+ipaddr.default = "192.168.100.1"
+
+nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
+        translate("The mask of the subnet above."))
+nm.datatype = "ip4addr"
+nm.default = "255.255.255.0"
+nm:value("255.255.255.0")
+nm:value("255.255.0.0")
+nm:value("255.0.0.0")
+
+if has_ipv6 then
+       ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"),
+                             translate("The IPv6 subnet address to provide to clients; leave empty to attempt auto-configuration."))
+       ip6addr.datatype = "ip6addr"
+end
+
+
 --[[DNS]]--
 
 s = m:section(TypedSection, "dns", translate("DNS servers"),
-       translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4"))
+       translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4. Typically you should include the address of this device"))
 s.anonymous = true
 s.addremove = true
 s.template = "cbi/tblsection"
index fabc1bc..03a9ed7 100644 (file)
@@ -1,7 +1,7 @@
 <script type="text/javascript">//<![CDATA[
 
        function ocserv_disconnect(idx) {
-               XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ocserv", "disconnect")%>/' + idx, null,
+               (new XHR()).post('<%=url('admin/services/ocserv/disconnect')%>/' + idx, { token: '<%=token%>' },
                        function(x)
                        {
                                var tb = document.getElementById('ocserv_status_table');
@@ -11,7 +11,7 @@
                );
        }
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "ocserv", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/services/ocserv/status')%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('ocserv_status_table');
index 0e59c61..476150d 100644 (file)
@@ -149,7 +149,7 @@ end
 
 
 
-       <h2><a id="content" name="content"><%:Services%></a></h2>
+       <h2 name="content"><%:Services%></h2>
 
        <fieldset class="cbi-section">
        <legend><%:Internal services%></legend>
index cfadd9b..9a997bd 100644 (file)
@@ -171,11 +171,12 @@ function action_neigh(json)
 
        for _, dev in ipairs(devices) do
                for _, net in ipairs(dev:get_wifinets()) do
+                       local radio = net:get_device()
                        assoclist[#assoclist+1] = {} 
-                       assoclist[#assoclist]['ifname'] = net.iwdata.ifname
-                       assoclist[#assoclist]['network'] = net.iwdata.network
-                       assoclist[#assoclist]['device'] = net.iwdata.device
-                       assoclist[#assoclist]['list'] = net.iwinfo.assoclist
+                       assoclist[#assoclist]['ifname'] = net:ifname()
+                       assoclist[#assoclist]['network'] = net:network()[1]
+                       assoclist[#assoclist]['device'] = radio and radio:name() or nil
+                       assoclist[#assoclist]['list'] = net:assoclist()
                end
        end
 
index d997670..eb41219 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:OLSR Daemon%></a></h2>
+<h2 name="content"><%:OLSR Daemon%></h2>
 <p class="error"><%:Unable to connect to the OLSR daemon!%></p>
 <p><%:Make sure that OLSRd is running, the "jsoninfo" plugin is loaded, configured on port 9090 and accepts connections from "127.0.0.1".%></p>
 <%+footer%>
index 89e4436..5ea7b74 100644 (file)
@@ -73,7 +73,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
 );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Active host net announcements%></a></h2>
+<h2 name="content"><%:Active host net announcements%></h2>
 
 <div id="togglebuttons"></div>
 <fieldset class="cbi-section">
index 3fb3a58..81d0a3d 100644 (file)
@@ -11,7 +11,7 @@ local i = 1
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Interfaces%></a></h2>
+<h2 name="content"><%:Interfaces%></h2>
 
 <div id="togglebuttons"></div>
 
index 3c10bd6..f658288 100644 (file)
@@ -10,7 +10,7 @@ local i = 1
 %>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Active MID announcements%></a></h2>
+<h2 name="content"><%:Active MID announcements%></h2>
 
 <div id="togglebuttons"></div> 
 <fieldset class="cbi-section">
index 9ad0d8f..31dd7d0 100644 (file)
@@ -105,7 +105,7 @@ end
 //]]></script>
 
 
-<h2><a id="content" name="content"><%:OLSR connections%></a></h2>
+<h2 name="content"><%:OLSR connections%></h2>
 
 <div id="togglebuttons"></div>
 
index fa32315..61e17b3 100644 (file)
@@ -155,7 +155,7 @@ XHR.poll(10, '<%=REQUEST_URI%>/json', { },
 
 <div id="error" class="error"></div>
 
-<h2><a id="content" name="content">OLSR <%:Overview%></a></h2>
+<h2 name="content">OLSR <%:Overview%></h2>
 
 <fieldset class="cbi-section">
         <legend><%:Network%></legend>
index d2b0c1b..8e46daa 100644 (file)
@@ -89,7 +89,7 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
 
 
 
-<h2><a id="content" name="content"><%:Known OLSR routes%></a></h2>
+<h2 name="content"><%:Known OLSR routes%></h2>
 
 <div id="togglebuttons"></div>
 
index 45f6515..6aa7a75 100644 (file)
@@ -86,7 +86,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:SmartGW announcements%></a></h2>
+<h2 name="content"><%:SmartGW announcements%></h2>
 
 <div id="togglebuttons"></div>
 
index ee69f72..b3abeae 100644 (file)
@@ -11,7 +11,7 @@ local olsrtools = require "luci.tools.olsr"
 %>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Active OLSR nodes%></a></h2>
+<h2 name="content"><%:Active OLSR nodes%></h2>
 
 <div id="togglebuttons"></div>
 
index fa15300..af515fc 100644 (file)
@@ -74,6 +74,7 @@ local knownParams = {
                { Value,                "route_gateway",                                "10.234.1.1",                                                                                                   translate("Specify a default gateway for routes") },
                { Value,                "route_delay",                                  0,                                                                                                                              translate("Delay n seconds after connection") },
                { Flag,                 "route_noexec",                                 0,                                                                                                                              translate("Don't add routes automatically") },
+               { Flag,                 "route_nopull",                                 0,                                                                                                                              translate("Don't pull routes automatically") },
 
                { ListValue,    "mtu_disc",                                             { "yes", "maybe", "no" },                                                                               translate("Enable Path MTU discovery") },
                { Flag,                 "mtu_test",                                             0,                                                                                                                              translate("Empirically measure MTU") },
@@ -153,7 +154,7 @@ local knownParams = {
        } },
 
        { "Cryptography", {
-               { Value,                "secret",                                               "/etc/openvpn/secret.key 1",                                                                    translate("Enable Static Key encryption mode (non-TLS)") },
+               { FileUpload,   "secret",                                               "/etc/openvpn/secret.key",                                                                      translate("Enable Static Key encryption mode (non-TLS)") },
                { Value,                "auth",                                                 "SHA1",                                                                                                                 translate("HMAC authentication for packets") }, -- parse
                { Value,                "cipher",                                               "BF-CBC",                                                                                                               translate("Encryption cipher for packets") }, -- parse
                { Value,                "keysize",                                              1024,                                                                                                                   translate("Size of cipher key") }, -- parse
@@ -181,13 +182,16 @@ local knownParams = {
                { Value,                "tran_window",                                  3600,                                                                                                                   translate("Key transition window") },
                { Flag,                 "single_session",                               0,                                                                                                                              translate("Allow only one session") },
                { Flag,                 "tls_exit",                                             0,                                                                                                                              translate("Exit on TLS negotiation failure") },
-               { Value,                "tls_auth",                                             "/etc/openvpn/tlsauth.key 1",                                                                   translate("Additional authentication over TLS") },
+               { Value,                "tls_auth",                                             "/etc/openvpn/tlsauth.key",                                                                     translate("Additional authentication over TLS") },
                --{ Value,              "askpass",                                              "[file]",                                                                                                               translate("Get PEM password from controlling tty before we daemonize") },
                { Flag,                 "auth_nocache",                                 0,                                                                                                                              translate("Don't cache --askpass or --auth-user-pass passwords") },
                { Value,                "tls_remote",                                   "remote_x509_name",                                                                                             translate("Only accept connections from given X509 name") },
                { ListValue,    "ns_cert_type",                                 { "client", "server" },                                                                                 translate("Require explicit designation on certificate") },
                { ListValue,    "remote_cert_tls",                              { "client", "server" },                                                                                 translate("Require explicit key usage on certificate") },
                { Value,                "crl_verify",                                   "/etc/easy-rsa/keys/crl.pem",                                                                   translate("Check peer certificate against a CRL") },
+               { Value,        "tls_version_min",              "1.0",                                                                                                                  translate("The lowest supported TLS version") },
+               { Value,        "tls_version_max",              "1.2",                                                                                                                  translate("The highest supported TLS version") },
+               { Value,        "key_direction",                "1",                                                                                                                    translate("The key direction for 'tls-auth' and 'secret' options") },
        } }
 }
 
index 561b0dd..8385839 100644 (file)
@@ -24,13 +24,14 @@ local basicParams = {
        { ListValue,"comp_lzo",{"yes","no","adaptive"}, translate("Use fast LZO compression") },
        { Value,"keepalive","10 60", translate("Helper directive to simplify the expression of --ping and --ping-restart in server mode configurations") },
 
-       { ListValue,"proto",{ "udp", "tcp" }, translate("Use protocol") },
+       { ListValue,"proto",{ "udp", "udp6", "tcp", "tcp6" }, translate("Use protocol") },
 
        { Flag,"client",0, translate("Configure client mode") },
        { Flag,"client_to_client",0, translate("Allow client-to-client traffic") },
        { DynamicList,"remote","vpnserver.example.org", translate("Remote host name or ip address") },
 
-       { FileUpload,"secret","/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") },
+       { FileUpload,"secret","/etc/openvpn/secret.key", translate("Enable Static Key encryption mode (non-TLS)") },
+       { Value,"key_direction","1", translate("The key direction for 'tls-auth' and 'secret' options") },
        { FileUpload,"pkcs12","/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") },
        { FileUpload,"ca","/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") },
        { FileUpload,"dh","/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") },
index ac5c893..f22cb68 100644 (file)
@@ -6,14 +6,14 @@
 
 <fieldset class="cbi-section">
        <legend>
-               <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn")%>"><%:Overview%></a> &raquo;
+               <a href="<%=url('admin/services/openvpn')%>"><%:Overview%></a> &raquo;
                <%=luci.i18n.translatef("Instance \"%s\"", self.instance)%>
        </legend>
 
        <% if self.mode == "basic" then %>
-               <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn", "advanced", self.instance, "Service")%>"><%:Switch to advanced configuration »%></a>
+               <a href="<%=url('admin/services/openvpn/advanced', self.instance, "Service")%>"><%:Switch to advanced configuration »%></a>
        <% else %>
-               <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn", "basic", self.instance)%>"><%:« Switch to basic configuration%></a>
+               <a href="<%=url('admin/services/openvpn/basic', self.instance)%>"><%:« Switch to basic configuration%></a>
                <hr style="margin:0.5em 0" />
                <%:Configuration category%>:
                <% for i, c in ipairs(self.categories) do %>
index 67de6b2..77a9415 100644 (file)
@@ -154,6 +154,9 @@ msgstr "No heretis les opcions globals enviades pel servidor"
 msgid "Don't log timestamps"
 msgstr "No registris les marques horàries"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "No rellegeixis la clau al reiniciar"
 
index c5ed42d..dcb3f33 100644 (file)
@@ -149,6 +149,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index e6cfdae..7dd5020 100644 (file)
@@ -152,6 +152,9 @@ msgstr "Nur teilnehmerspezifische Optionen übertragen"
 msgid "Don't log timestamps"
 msgstr "Keine Zeitangaben protokollieren"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Schlüssel bei Neustarts beibehalten"
 
index c5368d7..401862f 100644 (file)
@@ -153,6 +153,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index e8d8961..e3cf641 100644 (file)
@@ -152,6 +152,9 @@ msgstr "Don't inherit global push options"
 msgid "Don't log timestamps"
 msgstr "Don't log timestamps"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Don't re-read key on restart"
 
index 7c9a2d4..ade7446 100644 (file)
@@ -151,6 +151,9 @@ msgstr "No heredar opciones push globales"
 msgid "Don't log timestamps"
 msgstr "No guardar en registro horas"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "No releer la clave al rearrancar"
 
index cbfd1f5..c2726ca 100644 (file)
@@ -161,6 +161,9 @@ msgstr "Ne pas hériter des options d'envoi globales"
 msgid "Don't log timestamps"
 msgstr "Ne pas journaliser les horodatages"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Ne pas relire la clef au redémarrage"
 
index 55953b9..b7dd90c 100644 (file)
@@ -147,6 +147,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 3e93918..f967d1e 100644 (file)
@@ -151,6 +151,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr "Időbélyegeket ne naplózza"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 0304437..59855f1 100644 (file)
@@ -153,6 +153,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr "Non loggare il timestamps"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Non rileggere le chiavi al riavvio"
 
index dc558a8..2b888a4 100644 (file)
@@ -151,6 +151,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr "時刻をログに書き込まない"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "再起動時にキーの再読み込みを行わない"
 
index 0ed8909..97b699b 100644 (file)
@@ -146,6 +146,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 55953b9..b7dd90c 100644 (file)
@@ -147,6 +147,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 7fa9fe2..aa98b8c 100644 (file)
@@ -152,6 +152,9 @@ msgstr "Nie dziedzicz globalnej opcji push"
 msgid "Don't log timestamps"
 msgstr "Nie zapisuj czasu w logu"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Nie wczytuj ponownie klucza podczas restartu"
 
index 27aef00..f472337 100644 (file)
@@ -153,6 +153,9 @@ msgstr "Não herdar as opções globais de envio (push)"
 msgid "Don't log timestamps"
 msgstr "Não registar a data/hora"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Não reler a chave entre os reinícios"
 
index 76d2091..f69231e 100644 (file)
@@ -153,6 +153,9 @@ msgstr "Não herdar as opções globais de envio (push)"
 msgid "Don't log timestamps"
 msgstr "Não registar timestamps"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Não reler a chave entre reinicios"
 
index 1ca6782..50dca53 100644 (file)
@@ -148,6 +148,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 8a4635a..21ddcfc 100644 (file)
@@ -155,6 +155,9 @@ msgstr "Не наследовать глобальные параметры push
 msgid "Don't log timestamps"
 msgstr "Не записывать отметки времени в журнал"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Не считывать заново ключ при перезапуске"
 
index 7c885a8..cad751e 100644 (file)
@@ -146,6 +146,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index c4e30ac..c475a23 100644 (file)
@@ -147,6 +147,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 8fa13d1..4fe6af4 100644 (file)
@@ -139,6 +139,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index dcb0ec4..e379636 100644 (file)
@@ -146,6 +146,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index e603237..caa4246 100644 (file)
@@ -150,6 +150,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 2c19e69..d21ef93 100644 (file)
@@ -152,6 +152,9 @@ msgstr "Đừng thừa hưởng tùy chọn đẩy toàn cầu"
 msgid "Don't log timestamps"
 msgstr "Đừng log timestamps"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "Đừng đọc lại key ở chế độ khởi động "
 
index 1c210dc..fc85727 100644 (file)
@@ -151,6 +151,9 @@ msgstr "不继承全局主动发送选项"
 msgid "Don't log timestamps"
 msgstr "不记录时间戳"
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr "服务重启时不重读密钥值"
 
index d010f4b..60539b6 100644 (file)
@@ -145,6 +145,9 @@ msgstr ""
 msgid "Don't log timestamps"
 msgstr ""
 
+msgid "Don't pull routes automatically"
+msgstr ""
+
 msgid "Don't re-read key on restart"
 msgstr ""
 
index 9ff2ed9..a6087e9 100644 (file)
@@ -92,7 +92,7 @@ s = m:section(NamedSection, "voicemail_smtp", "voicemail", translate("Outgoing m
 s.anonymous = true
 
 serv = s:option(Value, "smtp_server", translate("SMTP Server Hostname or IP Address"))
-serv.datatype = "host"
+serv.datatype = "host(0)"
 
 port = s:option(Value, "smtp_port", translate("SMTP Port Number"))
 port.datatype = "port"
index 5d4f135..34288c6 100644 (file)
@@ -264,7 +264,7 @@ h = s:taboption("remote_usage", Value, "externhost", translate("Domain/IP Addres
                 The best thing to input is a static IP address. If your IP address is dynamic and it changes, \
                 your configuration will become invalid. Hence, it's recommended to set up Dynamic DNS in this case. \
                 and enter your Dynamic DNS hostname here. You can configure Dynamic DNS with the luci-app-ddns package."))
-h.datatype = "host"
+h.datatype = "host(0)"
 
 p = s:taboption("remote_usage", Value, "bindport", translate("External SIP Port"),
                 translate("Pick a random port number between 6500 and 9500 for the service to listen on. \
index ed1ed1e..9b46202 100644 (file)
@@ -84,7 +84,7 @@ function pwd.write(self, section, value)
 end
 
 h = s:option(Value, "host", translate("SIP Server/Registrar"))
-h.datatype = "host"
+h.datatype = "host(0)"
 
 p = s:option(ListValue, "register", translate("Enable Incoming Calls (Register via SIP)"),
              translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\) \
@@ -103,7 +103,7 @@ p.default = "yes"
 from = s:option(Value, "fromdomain",
                 translate("SIP Realm (needed by some providers)"))
 from.optional = true
-from.datatype = "host"
+from.datatype = "host(0)"
 
 port = s:option(Value, "port", translate("SIP Server/Registrar Port"))
 port.optional = true
@@ -111,6 +111,6 @@ port.datatype = "port"
 
 op = s:option(Value, "outboundproxy", translate("Outbound Proxy"))
 op.optional = true
-op.datatype = "host"
+op.datatype = "host(0)"
 
 return m
index c2695ca..007d2d5 100644 (file)
@@ -9,7 +9,7 @@ local port = uci:get("polipo", "general", "proxyPort") or "8123"
 <%+header%>
 
 <div class="cbi-map">
-       <h2><a id="content" name="content"><%:Polipo Status%></a></h2>
+       <h2 name="content"><%:Polipo Status%></h2>
        <div class="cbi-section">
                <iframe id="sf" src="http://<%=luci.http.getenv('SERVER_NAME')%>:<%=port%>/polipo/" style="width:100%; height:350px; border:none"></iframe>
        </div>
index e16eb41..260f840 100644 (file)
@@ -10,11 +10,11 @@ PKG_NAME:=luci-app-privoxy
 
 # Version == major.minor.patch
 # increase "minor" on new functionality and "patch" on patches/optimization
-PKG_VERSION:=1.0.4
+PKG_VERSION:=1.0.5
 
 # Release == build
 # increase on changes of translation files
-PKG_RELEASE:=2
+PKG_RELEASE:=1
 
 PKG_LICENSE:=Apache-2.0
 PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
index 58ba807..0cedab4 100644 (file)
@@ -15,7 +15,7 @@ PRIVOXY_MIN = "3.0.22-0"      -- minimum version of service required
 function index()
        entry( {"admin", "services", "privoxy"}, cbi("privoxy"), _("Privoxy WEB proxy"), 59)
        entry( {"admin", "services", "privoxy", "logview"}, call("logread") ).leaf = true
-       entry( {"admin", "services", "privoxy", "startstop"}, call("startstop") ).leaf = true
+       entry( {"admin", "services", "privoxy", "startstop"}, post("startstop") ).leaf = true
        entry( {"admin", "services", "privoxy", "status"}, call("get_pid") ).leaf = true
 end
 
index c415f8e..8ea2496 100644 (file)
@@ -14,7 +14,7 @@ local HELP = [[<a href="http://www.privoxy.org/user-manual/config.html#%s" targe
 local VERINST = CTRL.ipkg_ver_installed("privoxy")
 local VEROK   = CTRL.ipkg_ver_compare(VERINST,">=",CTRL.PRIVOXY_MIN)
 
-local TITLE = [[</a><a href="javascript:alert(']]
+local TITLE = [[<a href="javascript:alert(']]
                .. translate("Version Information")
                .. [[\n\nluci-app-privoxy]]
                .. [[\n\t]] .. translate("Version") .. [[:\t]]
@@ -26,6 +26,7 @@ local TITLE = [[</a><a href="javascript:alert(']]
                .. [[\n\n]]
        .. [[')">]]
        .. translate("Privoxy WEB proxy")
+       .. [[</a>]]
 
 local DESC = translate("Privoxy is a non-caching web proxy with advanced filtering "
                .. "capabilities for enhancing privacy, modifying web page data and HTTP headers, "
index 3e19070..ab0019b 100644 (file)
@@ -6,7 +6,7 @@
                var txt = document.getElementById("cbid.privoxy.privoxy._logview.txt"); // TextArea
                if ( !txt ) { return; } // security check
                var lvXHR = new XHR();
-               lvXHR.get('<%=luci.dispatcher.build_url("admin", "services", "privoxy", "logview")%>', null,
+               lvXHR.get('<%=url('admin/services/privoxy/logview')%>', null,
                        function(x) {
                                if (x.responseText == "_nodata_")
                                        txt.value = "<%:File not found or empty%>";
index b9de886..85975ac 100644 (file)
        function onclick_startstop(id) {
                // do start/stop
                var btnXHR = new XHR();
-               btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "privoxy", "startstop")%>', null,
+               btnXHR.post('<%=url('admin/services/privoxy/startstop')%>', { token: '<%=token%>' },
                        function(x) { _data2elements(x); }
                );
        }
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "privoxy", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/services/privoxy/status')%>', null,
                function(x, data) { _data2elements(x); }
        );
 
index a8ea57e..177b17b 100644 (file)
@@ -41,6 +41,16 @@ t:value("Priority", translate("priority"))
 t:value("Express", translate("express"))
 t:value("Normal", translate("normal"))
 t:value("Bulk", translate("low"))
+
+local uci = require "luci.model.uci"
+uci.cursor():foreach("qos", "class",
+    function (section)
+        local n = section[".name"]
+        if string.sub(n,-string.len("_down"))~="_down" then
+            t:value(n)
+        end
+    end)
+
 t.default = "Normal"
 
 srch = s:option(Value, "srchost", translate("Source host"))
index 7871b12..e1430f1 100644 (file)
@@ -59,9 +59,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Qualitat de Servei"
 
-msgid "Service"
-msgstr "Servei"
-
 msgid "Source host"
 msgstr "Host d'origen"
 
@@ -97,6 +94,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioritat"
 
+#~ msgid "Service"
+#~ msgstr "Servei"
+
 #~ msgid "Downlink"
 #~ msgstr "Enllaç de baixada"
 
index 361e4d5..884310f 100644 (file)
@@ -59,9 +59,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Služba"
-
 msgid "Source host"
 msgstr "Zdrojová adresa"
 
@@ -97,6 +94,9 @@ msgstr "normální priorita"
 msgid "priority"
 msgstr "nejvyšší priorita (malé rámce)"
 
+#~ msgid "Service"
+#~ msgstr "Služba"
+
 #~ msgid "Downlink"
 #~ msgstr "Stahování"
 
index 6ba5701..46060de 100644 (file)
@@ -57,9 +57,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Dienst"
-
 msgid "Source host"
 msgstr "Quelladresse"
 
@@ -94,6 +91,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "Priorität"
 
+#~ msgid "Service"
+#~ msgstr "Dienst"
+
 #~ msgid "Downlink"
 #~ msgstr "Downlink"
 
index b417b8b..9c8a985 100644 (file)
@@ -60,9 +60,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr "Ποιότητα Υπηρεσίας"
 
-msgid "Service"
-msgstr "Υπηρεσία"
-
 #, fuzzy
 msgid "Source host"
 msgstr "Διεύθυνση πηγής"
@@ -100,6 +97,9 @@ msgstr "κανονική"
 msgid "priority"
 msgstr "προτεραιότητα"
 
+#~ msgid "Service"
+#~ msgstr "Υπηρεσία"
+
 #, fuzzy
 #~ msgid "Downlink"
 #~ msgstr "Ταχύτητα κατεβάσματος"
index aeb7b27..b20180f 100644 (file)
@@ -53,9 +53,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Service"
-
 msgid "Source host"
 msgstr "Source host"
 
@@ -89,3 +86,6 @@ msgstr "normal"
 
 msgid "priority"
 msgstr "priority"
+
+#~ msgid "Service"
+#~ msgstr "Service"
index 3c8206d..83ace8d 100644 (file)
@@ -55,9 +55,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Calidad de Servicio"
 
-msgid "Service"
-msgstr "Servicio"
-
 msgid "Source host"
 msgstr "Máquina origen"
 
@@ -92,6 +89,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioritario"
 
+#~ msgid "Service"
+#~ msgstr "Servicio"
+
 #~ msgid "Downlink"
 #~ msgstr "Enlace de bajada"
 
index a4a81f1..38e9ce8 100644 (file)
@@ -55,9 +55,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr "Qualité de service"
 
-msgid "Service"
-msgstr "Service"
-
 msgid "Source host"
 msgstr "Hôte source"
 
@@ -93,5 +90,8 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioritaire"
 
+#~ msgid "Service"
+#~ msgstr "Service"
+
 #~ msgid "qos_connbytes"
 #~ msgstr "qos_connbytes"
index 71c2e3c..e2d42ef 100644 (file)
@@ -55,9 +55,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index d69ff08..c77ac3c 100644 (file)
@@ -57,9 +57,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Szolgáltatás"
-
 msgid "Source host"
 msgstr "Forrás gép"
 
@@ -95,6 +92,9 @@ msgstr "normál"
 msgid "priority"
 msgstr "prioritás"
 
+#~ msgid "Service"
+#~ msgstr "Szolgáltatás"
+
 #~ msgid "Downlink"
 #~ msgstr "Downlink"
 
index 00fb331..686c745 100644 (file)
@@ -55,9 +55,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Qualità del Servizio"
 
-msgid "Service"
-msgstr "Servizi"
-
 msgid "Source host"
 msgstr "Host sorgente"
 
@@ -92,6 +89,9 @@ msgstr "normale"
 msgid "priority"
 msgstr "priorità"
 
+#~ msgid "Service"
+#~ msgstr "Servizi"
+
 #~ msgid "Downlink"
 #~ msgstr "Collegamento discendente"
 
index 857cf5b..deeb23f 100644 (file)
@@ -55,9 +55,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "サービス"
-
 msgid "Source host"
 msgstr "送信元ホスト"
 
@@ -91,3 +88,6 @@ msgstr "標準"
 
 msgid "priority"
 msgstr "最優先"
+
+#~ msgid "Service"
+#~ msgstr "サービス"
index ab30492..f8d4ab3 100644 (file)
@@ -54,9 +54,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index a560b0f..6b390a1 100644 (file)
@@ -50,9 +50,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Service"
-
 msgid "Source host"
 msgstr "Kilde vert"
 
@@ -87,6 +84,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioritet"
 
+#~ msgid "Service"
+#~ msgstr "Service"
+
 #~ msgid "Downlink"
 #~ msgstr "Nedlinje"
 
index 7b740c7..3c6a28c 100644 (file)
@@ -56,9 +56,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Jakość usługi (ang. Quality of Service)"
 
-msgid "Service"
-msgstr "Usługa"
-
 msgid "Source host"
 msgstr "Host źródłowy"
 
@@ -93,6 +90,9 @@ msgstr "normalny"
 msgid "priority"
 msgstr "priorytetowy"
 
+#~ msgid "Service"
+#~ msgstr "Usługa"
+
 #~ msgid "Downlink"
 #~ msgstr "Ruch przychodzący"
 
index 1ebaea2..43cd6e2 100644 (file)
@@ -58,9 +58,6 @@ msgstr "<abbr title=\"Quality of Service, Qualidade de serviço\">QoS</abbr>"
 msgid "Quality of Service"
 msgstr "Qualidade de Serviço"
 
-msgid "Service"
-msgstr "Serviço"
-
 msgid "Source host"
 msgstr "Endereço de origem"
 
@@ -96,6 +93,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioritário"
 
+#~ msgid "Service"
+#~ msgstr "Serviço"
+
 #~ msgid "Downlink"
 #~ msgstr "Link para download"
 
index 2299a78..449ddce 100644 (file)
@@ -57,9 +57,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Qualidade de Serviço"
 
-msgid "Service"
-msgstr "Serviço"
-
 msgid "Source host"
 msgstr "Host de origem"
 
@@ -94,6 +91,9 @@ msgstr "normal"
 msgid "priority"
 msgstr "prioridade"
 
+#~ msgid "Service"
+#~ msgstr "Serviço"
+
 #~ msgid "Downlink"
 #~ msgstr "Link para download"
 
index 239c1f8..9c88f7c 100644 (file)
@@ -58,9 +58,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Quality of Service"
 
-msgid "Service"
-msgstr "Serviciu"
-
 msgid "Source host"
 msgstr ""
 
@@ -93,5 +90,8 @@ msgstr "normala"
 msgid "priority"
 msgstr "ridicata"
 
+#~ msgid "Service"
+#~ msgstr "Serviciu"
+
 #~ msgid "Internet Connection"
 #~ msgstr "Conexiune internet"
index 6c36392..811cbf1 100644 (file)
@@ -57,9 +57,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Качество обслуживания (QoS)"
 
-msgid "Service"
-msgstr "Служба"
-
 msgid "Source host"
 msgstr "Хост источника"
 
@@ -94,6 +91,9 @@ msgstr "обычный"
 msgid "priority"
 msgstr "приоритетный"
 
+#~ msgid "Service"
+#~ msgstr "Служба"
+
 #~ msgid "Downlink"
 #~ msgstr "Нисходящий канал"
 
index 102e5a9..b4d10ab 100644 (file)
@@ -50,9 +50,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index 44f8a35..1ba407e 100644 (file)
@@ -51,9 +51,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index 26ea8f7..48333e4 100644 (file)
@@ -43,9 +43,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index 74647be..d2f3611 100644 (file)
@@ -55,9 +55,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr ""
 
-msgid "Service"
-msgstr ""
-
 msgid "Source host"
 msgstr ""
 
index d48100b..5ec9f37 100644 (file)
@@ -58,9 +58,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "Якість обслуговування (QoS)"
 
-msgid "Service"
-msgstr "Сервіс"
-
 msgid "Source host"
 msgstr "Вихідний вузол"
 
@@ -96,6 +93,9 @@ msgstr "звичайний"
 msgid "priority"
 msgstr "пріоритетний"
 
+#~ msgid "Service"
+#~ msgstr "Сервіс"
+
 #~ msgid "Downlink"
 #~ msgstr "Низхідний канал"
 
index 8249272..32e7ed1 100644 (file)
@@ -60,9 +60,6 @@ msgstr ""
 msgid "Quality of Service"
 msgstr "Chất lượng dịch vụ "
 
-msgid "Service"
-msgstr ""
-
 #, fuzzy
 msgid "Source host"
 msgstr "Địa chỉ nguồn"
index 92ff7d0..0a5cd62 100644 (file)
@@ -55,9 +55,6 @@ msgstr "QoS"
 msgid "Quality of Service"
 msgstr "QOS服务"
 
-msgid "Service"
-msgstr "服务"
-
 msgid "Source host"
 msgstr "源主机"
 
@@ -90,6 +87,9 @@ msgstr "普通"
 msgid "priority"
 msgstr "最高"
 
+#~ msgid "Service"
+#~ msgstr "服务"
+
 #~ msgid "Downlink"
 #~ msgstr "下行"
 
index 5cc338b..a011e9c 100644 (file)
@@ -53,9 +53,6 @@ msgstr "先進先出頻寬管理"
 msgid "Quality of Service"
 msgstr "連線品質服務"
 
-msgid "Service"
-msgstr "服務"
-
 msgid "Source host"
 msgstr "來源主機"
 
@@ -90,6 +87,9 @@ msgstr "一般優先權"
 msgid "priority"
 msgstr "優先權"
 
+#~ msgid "Service"
+#~ msgstr "服務"
+
 #~ msgid "Downlink"
 #~ msgstr "下載"
 
index 960618d..1501d4f 100644 (file)
@@ -10,7 +10,7 @@ PKG_NAME:=luci-app-radicale
 
 # Version == major.minor.patch
 # increase "minor" on new functionality and "patch" on patches/optimization
-PKG_VERSION:=1.0.1
+PKG_VERSION:=1.0.2
 
 # Release == build
 # increase on changes of translation files
index d384b00..10ec1fe 100644 (file)
@@ -15,7 +15,7 @@ function index()
        entry( {"admin", "services", "radicale"}, alias("admin", "services", "radicale", "edit"), _("CalDAV/CardDAV"), 58)
        entry( {"admin", "services", "radicale", "edit"}, cbi("radicale") ).leaf = true
        entry( {"admin", "services", "radicale", "logview"}, call("_logread") ).leaf = true
-       entry( {"admin", "services", "radicale", "startstop"}, call("_startstop") ).leaf = true
+       entry( {"admin", "services", "radicale", "startstop"}, post("_startstop") ).leaf = true
        entry( {"admin", "services", "radicale", "status"}, call("_status") ).leaf = true
 end
 
@@ -82,7 +82,7 @@ function service_ok()
 end
 
 function app_title_main()
-       return  [[</a><a href="javascript:alert(']]
+       return  [[<a href="javascript:alert(']]
                        .. I18N.translate("Version Information")
                        .. [[\n\n]] .. luci_app_name()
                        .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
@@ -100,12 +100,14 @@ function app_title_main()
                        .. [[\n\n]]
                .. [[')">]]
                .. I18N.translate("Radicale CalDAV/CardDAV Server")
+               .. [[</a>]]
 end
 function app_title_back()
-       return  [[</a><a href="]]
+       return  [[<a href="]]
                        .. DISP.build_url("admin", "services", "radicale")
                .. [[">]]
                .. I18N.translate("Radicale CalDAV/CardDAV Server")
+               .. [[</a>]]
 end
 function app_description()
        return  I18N.translate("The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.") .. [[<br />]]
index 79d1c36..dbf4ddd 100644 (file)
        function onclick_startstop(id) {
                // do start/stop
                var btnXHR = new XHR();
-               btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "radicale", "startstop")%>', null,
+               btnXHR.post('<%=url('admin/services/radicale/startstop')%>', { token: '<%=token%>' },
                        function(x) { _data2elements(x); }
                );
        }
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "radicale", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/services/radicale/status')%>', null,
                function(x, data) { _data2elements(x); }
        );
 
index c2bde96..81bbcb7 100644 (file)
@@ -1,80 +1,86 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-msgid "ShadowSocks-libev"
+msgid "Access Control"
 msgstr ""
 
-msgid "ShadowSocks-libev is running"
+msgid "Allow all except listed"
 msgstr ""
 
-msgid "ShadowSocks-libev is not running"
+msgid "Allow listed only"
 msgstr ""
 
-msgid "Global Setting"
+msgid "Bypassed IP"
 msgstr ""
 
-msgid "Enable"
+msgid "Connection Timeout"
 msgstr ""
 
-msgid "Enabled"
+msgid "Custom"
 msgstr ""
 
 msgid "Disabled"
 msgstr ""
 
-msgid "Custom"
+msgid "Enable"
 msgstr ""
 
-msgid "Server Address"
+msgid "Enabled"
 msgstr ""
 
-msgid "Server Port"
+msgid "Encrypt Method"
 msgstr ""
 
-msgid "Local Port"
+msgid "Forwarded IP"
 msgstr ""
 
-msgid "Connection Timeout"
+msgid "Forwarding Tunnel"
 msgstr ""
 
-msgid "Password"
+msgid "Global Setting"
 msgstr ""
 
-msgid "Encrypt Method"
+msgid "Ignore List"
 msgstr ""
 
-msgid "Ignore List"
+msgid "LAN"
 msgstr ""
 
-msgid "UDP Relay"
+msgid "LAN IP List"
+msgstr ""
+
+msgid "Local Port"
+msgstr ""
+
+msgid "Password"
 msgstr ""
 
 msgid "Relay Mode"
 msgstr ""
 
-msgid "UDP Forward"
+msgid "Server Address"
 msgstr ""
 
-msgid "UDP Local Port"
+msgid "Server Port"
 msgstr ""
 
-msgid "Forwarding Tunnel"
+msgid "ShadowSocks-libev"
 msgstr ""
 
-msgid "Access Control"
+msgid "ShadowSocks-libev is not running"
 msgstr ""
 
-msgid "Allow listed only"
+msgid "ShadowSocks-libev is running"
 msgstr ""
 
-msgid "Allow all except listed"
+msgid "UDP Forward"
 msgstr ""
 
-msgid "LAN IP List"
+msgid "UDP Local Port"
 msgstr ""
 
-msgid "Bypassed IP"
+msgid "UDP Relay"
 msgstr ""
 
-msgid "Forwarded IP"
+msgid "WAN"
 msgstr ""
index 90a0eff..f86eee7 100644 (file)
@@ -12,17 +12,26 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Pootle 2.0.6\n"
 
-msgid "ShadowSocks-libev"
-msgstr "ShadowSocks-libev"
+msgid "Access Control"
+msgstr "访问控制"
 
-msgid "ShadowSocks-libev is running"
-msgstr "ShadowSocks-libev 运行中"
+msgid "Allow all except listed"
+msgstr "仅允许列表外"
 
-msgid "ShadowSocks-libev is not running"
-msgstr "ShadowSocks-libev 未运行"
+msgid "Allow listed only"
+msgstr "仅允许列表内"
 
-msgid "Global Setting"
-msgstr "全局设置"
+msgid "Bypassed IP"
+msgstr "被忽略的IP"
+
+msgid "Connection Timeout"
+msgstr "连接超时"
+
+msgid "Custom"
+msgstr "自定义"
+
+msgid "Disabled"
+msgstr "已禁用"
 
 msgid "Enable"
 msgstr "启用"
@@ -30,62 +39,59 @@ msgstr "启用"
 msgid "Enabled"
 msgstr "已启用"
 
-msgid "Disabled"
-msgstr "å·²ç¦\81ç\94¨"
+msgid "Encrypt Method"
+msgstr "å\8a å¯\86æ\96¹å¼\8f"
 
-msgid "Custom"
-msgstr "è\87ªå®\9aä¹\89"
+msgid "Forwarded IP"
+msgstr "走代ç\90\86ç\9a\84IP"
 
-msgid "Server Address"
-msgstr "服务器地址"
+msgid "Forwarding Tunnel"
+msgstr "UDP转发地址"
 
-msgid "Server Port"
-msgstr "服务器端口"
+msgid "Global Setting"
+msgstr "全局设置"
+
+msgid "Ignore List"
+msgstr "忽略列表"
+
+msgid "LAN"
+msgstr ""
+
+msgid "LAN IP List"
+msgstr "内网IP列表"
 
 msgid "Local Port"
 msgstr "本地端口"
 
-msgid "Connection Timeout"
-msgstr "连接超时"
-
 msgid "Password"
 msgstr "密码"
 
-msgid "Encrypt Method"
-msgstr "加密方式"
-
-msgid "Ignore List"
-msgstr "忽略列表"
-
-msgid "UDP Relay"
-msgstr "UDP中继"
-
 msgid "Relay Mode"
 msgstr "中继模式"
 
-msgid "UDP Forward"
-msgstr "UDP转发"
+msgid "Server Address"
+msgstr "服务器地址"
 
-msgid "UDP Local Port"
-msgstr "UDP本地端口"
+msgid "Server Port"
+msgstr "服务器端口"
 
-msgid "Forwarding Tunnel"
-msgstr "UDP转发地址"
+msgid "ShadowSocks-libev"
+msgstr "ShadowSocks-libev"
 
-msgid "Access Control"
-msgstr "访问控制"
+msgid "ShadowSocks-libev is not running"
+msgstr "ShadowSocks-libev 未运行"
 
-msgid "Allow listed only"
-msgstr "仅允许列表内"
+msgid "ShadowSocks-libev is running"
+msgstr "ShadowSocks-libev 运行中"
 
-msgid "Allow all except listed"
-msgstr "仅允许列表外"
+msgid "UDP Forward"
+msgstr "UDP转发"
 
-msgid "LAN IP List"
-msgstr "内网IP列表"
+msgid "UDP Local Port"
+msgstr "UDP本地端口"
 
-msgid "Bypassed IP"
-msgstr "被忽略的IP"
+msgid "UDP Relay"
+msgstr "UDP中继"
 
-msgid "Forwarded IP"
-msgstr "走代理的IP"
+msgid "WAN"
+msgstr ""
index 4add435..13b8edc 100644 (file)
@@ -16,7 +16,7 @@ function index()
        node("splash", "splash").target   = template("splash_splash/splash")
        node("splash", "blocked").target  = template("splash/blocked")
 
-       entry({"admin", "status", "splash"}, call("action_status_admin"), _("Client-Splash"))
+       entry({"admin", "status", "splash"}, post("action_status_admin"), _("Client-Splash"))
 
        local page  = node("splash", "publicstatus")
        page.target = call("action_status_public")
index 831fa75..3415c20 100644 (file)
@@ -210,11 +210,11 @@ end
 
 
 <div id="cbi-splash-leases" class="cbi-map">
-       <h2><a id="content" name="content"><%:Client-Splash%></a></h2>
+       <h2 name="content"><%:Client-Splash%></h2>
        <fieldset id="cbi-table-table" class="cbi-section">
                <legend><%:Active Clients%></legend>
                <div class="cbi-section-node">
-                       <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><% end %>
+                       <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><input type="hidden" name="token" value="<%=token%>" /><% end %>
                        <table class="cbi-section-table">
                                <thead>
                                        <tr class="cbi-section-table-titles">
index 406139b..c27e2fa 100644 (file)
@@ -9,7 +9,7 @@ local contacturl = luci.dispatcher.build_url("freifunk", "contact")
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Blocked%></a></h2>
+<h2 name="content"><%:Blocked%></h2>
 
 <p><%:Your access to this network has been blocked, most likely because you did something that our rules explicitly forbid.%></p>
 <p><%:To ask for the reason why you have been blocked or ask for access again you can try to contact the owner of this access point:%> <a href="<%=contacturl%>"><%:Contact%></a></p>
index 7626b60..8d84463 100644 (file)
@@ -72,7 +72,7 @@ if has_custom_splash then
 
 <% else %>
 
-       <h2><a id="content" name="content"><%:Welcome%></a></h2>
+       <h2 name="content"><%:Welcome%></h2>
 
        <p><%:You are now connected to the free wireless mesh network%> <a href="<%=homepage%>"><%=community%></a>.
        <%:Please note that we are not an internet service provider but an experimental community network.%></p>
index 49eab5a..3f26aee 100644 (file)
@@ -20,7 +20,7 @@ function index()
 
        local labels = {
                s_output        = _("Output plugins"),
-               s_system        = _("System plugins"),
+               s_general       = _("General plugins"),
                s_network       = _("Network plugins"),
 
                conntrack       = _("Conntrack"),
@@ -42,9 +42,11 @@ function index()
                network         = _("Network"),
                nut                     = _("UPS"),
                olsrd           = _("OLSRd"),
+               openvpn         = _("OpenVPN"),
                ping            = _("Ping"),
                processes       = _("Processes"),
                rrdtool         = _("RRDTool"),
+               sensors     = _("Sensors"),
                splash_leases = _("Splash Leases"),
                tcpconns        = _("TCP Connections"),
                unixsock        = _("UnixSock"),
@@ -54,15 +56,15 @@ function index()
        -- our collectd menu
        local collectd_menu = {
                output  = { "csv", "network", "rrdtool", "unixsock" },
-               system  = { "cpu", "df", "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "uptime" },
-               network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "ping", "splash_leases", "tcpconns", "iwinfo" }
+               general = { "cpu", "df", "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "sensors", "uptime" },
+               network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "openvpn", "ping", "splash_leases", "tcpconns", "iwinfo" }
        }
 
        -- create toplevel menu nodes
        local st = entry({"admin", "statistics"}, template("admin_statistics/index"), _("Statistics"), 80)
        st.index = true
 
-       entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Collectd"), 10).subindex = true
+       entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Setup"), 20).subindex = true
 
 
        -- populate collectd plugin menu
@@ -87,7 +89,7 @@ function index()
        end
 
        -- output views
-       local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 80)
+       local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 10)
              page.setuser  = "nobody"
              page.setgroup = "nogroup"
 
@@ -170,7 +172,7 @@ function statistics_render()
        if #instances == 0 then
                --instances = { graph.tree:plugin_instances( plugin )[1] }
                instances = graph.tree:plugin_instances( plugin )
-               is_index = true
+               is_index = (#instances > 1)
 
        -- index instance requested
        elseif instances[1] == "-" then
index 59266e5..950d7a7 100644 (file)
@@ -12,7 +12,7 @@ enable.default = 0
 
 host = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from"))
 host.placeholder = "127.0.0.1"
-host.datatype = "host"
+host.datatype = "host(1)"
 host.rmempty = true
 
 port = s:option(Value, "Port", translate("Port"))
diff --git a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua
new file mode 100644 (file)
index 0000000..193f044
--- /dev/null
@@ -0,0 +1,56 @@
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+require "luci.sys"
+
+local m, s, o
+
+
+m = Map("luci_statistics",
+       translate("OpenVPN Plugin Configuration"),
+       translate("The OpenVPN plugin gathers information about the current vpn connection status."))
+
+s = m:section( NamedSection, "collectd_openvpn", "luci_statistics" )
+
+
+o = s:option( Flag, "enable", translate("Enable this plugin") )
+o.default = "0"
+
+
+o = s:option(Flag, "CollectIndividualUsers", translate("Generate a separate graph for each logged user"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "CollectUserCount", translate("Aggregate number of connected users"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "CollectCompression", translate("Gather compression statistics"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "ImprovedNamingSchema", translate("Use improved naming schema"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(DynamicList, "StatusFile", translate("OpenVPN status files"))
+o.rmempty = true
+o:depends("enable", 1)
+
+local status_files = nixio.fs.glob("/var/run/openvpn.*.status")
+if status_files then
+       local status_file
+       for status_file in status_files do
+               o:value(status_file)
+       end
+end
+
+return m
diff --git a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua
new file mode 100644 (file)
index 0000000..77e36bf
--- /dev/null
@@ -0,0 +1,125 @@
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+require "luci.sys"
+
+local m, s, o
+local sensor_types = {
+       ["12v"] = "voltage",
+       ["2.0v"] = "voltage",
+       ["2.5v"] = "voltage",
+       ["3.3v"] = "voltage",
+       ["5.0v"] = "voltage",
+       ["5v"] = "voltage",
+       ["ain1"] = "voltage",
+       ["ain2"] = "voltage",
+       ["cpu_temp"] = "temperature",
+       ["fan1"] = "fanspeed",
+       ["fan2"] = "fanspeed",
+       ["fan3"] = "fanspeed",
+       ["fan4"] = "fanspeed",
+       ["fan5"] = "fanspeed",
+       ["fan6"] = "fanspeed",
+       ["fan7"] = "fanspeed",
+       ["in0"] = "voltage",
+       ["in10"] = "voltage",
+       ["in2"] = "voltage",
+       ["in3"] = "voltage",
+       ["in4"] = "voltage",
+       ["in5"] = "voltage",
+       ["in6"] = "voltage",
+       ["in7"] = "voltage",
+       ["in8"] = "voltage",
+       ["in9"] = "voltage",
+       ["power1"] = "power",
+       ["remote_temp"] = "temperature",
+       ["temp1"] = "temperature",
+       ["temp2"] = "temperature",
+       ["temp3"] = "temperature",
+       ["temp4"] = "temperature",
+       ["temp5"] = "temperature",
+       ["temp6"] = "temperature",
+       ["temp7"] = "temperature",
+       ["temp"] = "temperature",
+       ["vccp1"] = "voltage",
+       ["vccp2"] = "voltage",
+       ["vdd"] = "voltage",
+       ["vid1"] = "voltage",
+       ["vid2"] = "voltage",
+       ["vid3"] = "voltage",
+       ["vid4"] = "voltage",
+       ["vid5"] = "voltage",
+       ["vid"] = "voltage",
+       ["vin1"] = "voltage",
+       ["vin2"] = "voltage",
+       ["vin3"] = "voltage",
+       ["vin4"] = "voltage",
+       ["volt12"] = "voltage",
+       ["volt5"] = "voltage",
+       ["voltbatt"] = "voltage",
+       ["vrm"] = "voltage"
+
+}
+
+
+m = Map("luci_statistics",
+       translate("Sensors Plugin Configuration"),
+       translate("The sensors plugin uses the Linux Sensors framework to gather environmental statistics."))
+
+s = m:section( NamedSection, "collectd_sensors", "luci_statistics" )
+
+
+o = s:option( Flag, "enable", translate("Enable this plugin") )
+o.default = 0
+
+
+o = s:option(Flag, "__all", translate("Monitor all sensors"))
+o:depends("enable", 1)
+o.default = 1
+o.write = function() end
+o.cfgvalue = function(self, sid)
+       local v = self.map:get(sid, "Sensor")
+       if v == nil or (type(v) == "table" and #v == 0) or (type(v) == "string" and #v == 0) then
+               return "1"
+       end
+end
+
+
+o = s:option(MultiValue, "Sensor", translate("Sensor list"), translate("Hold Ctrl to select multiple items or to deselect entries."))
+o:depends({enable = 1, __all = "" })
+o.widget = "select"
+o.rmempty = true
+o.size = 0
+
+local sensorcli = io.popen("/usr/sbin/sensors -u -A")
+if sensorcli then
+       local bus, sensor
+
+       while true do
+               local ln = sensorcli:read("*ln")
+               if not ln then
+                       break
+               elseif ln:match("^[%w-]+$") then
+                       bus = ln
+               elseif ln:match("^[%w-]+:$") then
+                       sensor = ln:sub(0, -2):lower()
+                       if bus and sensor_types[sensor] then
+                               o:value("%s/%s-%s" %{ bus, sensor_types[sensor], sensor })
+                               o.size = o.size + 1
+                       end
+               elseif ln == "" then
+                       bus = nil
+                       sensor = nil
+               end
+       end
+
+       sensorcli:close()
+end
+
+
+o = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
+o.default = 0
+o.rmempty = true
+o:depends({ enable = 1, __all = "" })
+
+return m
index 5a2800d..7877e61 100644 (file)
@@ -26,15 +26,6 @@ function Instance._subst( self, str, val )
        return str
 end
 
-function Instance._translate( self, key, alt )
-       local val = self.i18n.string(key)
-       if val ~= key then
-               return val
-       else
-               return alt
-       end
-end
-
 function Instance.title( self, plugin, pinst, dtype, dinst, user_title )
 
        local title = user_title or
@@ -73,24 +64,17 @@ end
 
 function Instance.ds( self, source )
 
-       local label = source.title or self:_translate(
-               string.format( "stat_ds_%s_%s_%s", source.type, source.instance, source.ds ),
-               self:_translate(
-                       string.format( "stat_ds_%s_%s", source.type, source.instance ),
-                       self:_translate(
-                               string.format( "stat_ds_label_%s__%s", source.type, source.ds ),
-                               self:_translate(
-                                       string.format( "stat_ds_%s", source.type ),
-                                       source.type .. "_" .. source.instance:gsub("[^%w]","_") .. "_" .. source.ds
-                               )
-                       )
-               )
-       )
+       local label = source.title or
+               "dt=%s/di=%s/ds=%s" % {
+                       (source.type     and #source.type     > 0) and source.type     or "(nil)",
+                       (source.instance and #source.instance > 0) and source.instance or "(nil)",
+                       (source.ds       and #source.ds       > 0) and source.ds       or "(nil)"
+               }
 
        return self:_subst( label, {
                dtype = source.type,
                dinst = source.instance,
                dsrc  = source.ds
-       } )
+       } ):gsub(":", "\\:")
 
 end
index d8317a8..5d4ad98 100644 (file)
@@ -397,6 +397,7 @@ function Graph._generic( self, opts, plugin, plugin_instance, dtype, index )
                                        transform_rpn = dopts.transform_rpn or "0,+",
                                        noarea   = dopts.noarea  or false,
                                        title    = dopts.title   or nil,
+                                       weight   = dopts.weight  or nil,
                                        ds       = dsource,
                                        type     = dtype,
                                        instance = dinst,
@@ -469,6 +470,12 @@ function Graph._generic( self, opts, plugin, plugin_instance, dtype, index )
                        for i, o in ipairs(opts.rrdopts) do _ti( _args, o ) end
                end
 
+               -- sort sources
+               table.sort(_sources, function(a, b)
+                       local x = a.weight or a.index or 0
+                       local y = b.weight or b.index or 0
+                       return x < y
+               end)
 
                -- create DEF statements for each instance
                for i, source in ipairs(_sources) do
index efa631d..6f687d2 100644 (file)
@@ -66,36 +66,40 @@ function rrdargs( graph, plugin, plugin_instance )
                        options = {
                                -- processed packets (tx DS)
                                if_packets__tx = {
+                                       weight  = 1,
                                        overlay = true,         -- don't summarize
                                        total   = true,         -- report total amount of bytes
                                        color   = "00ff00",     -- processed tx is green
-                                       title   = "Processed (tx)"
+                                       title   = "Processed (TX)"
                                },
 
                                -- processed packets (rx DS)
                                if_packets__rx = {
+                                       weight  = 2,
                                        overlay = true,         -- don't summarize
                                        flip    = true,         -- flip rx line
                                        total   = true,         -- report total amount of bytes
                                        color   = "0000ff",     -- processed rx is blue
-                                       title   = "Processed (rx)"
+                                       title   = "Processed (RX)"
                                },
 
                                -- packet errors (tx DS)
                                if_errors__tx = {
+                                       weight  = 0,
                                        overlay = true,         -- don't summarize
                                        total   = true,         -- report total amount of packets
                                        color   = "ff5500",     -- tx errors are orange
-                                       title   = "Errors (tx)"
+                                       title   = "Errors    (TX)"
                                },
 
                                -- packet errors (rx DS)
                                if_errors__rx = {
+                                       weight  = 3,
                                        overlay = true,         -- don't summarize
                                        flip    = true,         -- flip rx line
                                        total   = true,         -- report total amount of packets
                                        color   = "ff0000",     -- rx errors are red
-                                       title   = "Errors (rx)"
+                                       title   = "Errors    (RX)"
                                }
                        }
                }
index 3ca3381..194afd6 100644 (file)
@@ -74,6 +74,8 @@ function rrdargs( graph, plugin, plugin_instance )
        local stations = {
                title = "%H: Associated stations on %pi",
                vlabel = "Stations",
+               y_min = "0",
+               alt_autoscale_max = true,
                number_format = "%3.0lf",
                data = {
                        types = { "stations" },
index b4f2ac1..7b6acf3 100644 (file)
@@ -22,11 +22,13 @@ function rrdargs( graph, plugin, plugin_instance )
                        -- special options for single data lines
                        options = {
                                if_octets__tx = {
+                                       title = "Bytes (TX)",
                                        total = true,           -- report total amount of bytes
                                        color = "00ff00"        -- tx is green
                                },
 
                                if_octets__rx = {
+                                       title = "Bytes (RX)",
                                        flip  = true,           -- flip rx line
                                        total = true,           -- report total amount of bytes
                                        color = "0000ff"        -- rx is blue
@@ -59,6 +61,8 @@ function rrdargs( graph, plugin, plugin_instance )
                        options = {
                                -- processed packets (tx DS)
                                if_packets__tx = {
+                                       weight  = 2,
+                                       title   = "Total   (TX)",
                                        overlay = true,         -- don't summarize
                                        total   = true,         -- report total amount of bytes
                                        color   = "00ff00"      -- processed tx is green
@@ -66,6 +70,8 @@ function rrdargs( graph, plugin, plugin_instance )
 
                                -- processed packets (rx DS)
                                if_packets__rx = {
+                                       weight  = 3,
+                                       title   = "Total   (RX)",
                                        overlay = true,         -- don't summarize
                                        flip    = true,         -- flip rx line
                                        total   = true,         -- report total amount of bytes
@@ -74,6 +80,8 @@ function rrdargs( graph, plugin, plugin_instance )
 
                                -- dropped packets (tx DS)
                                if_dropped__tx = {
+                                       weight  = 1,
+                                       title   = "Dropped (TX)",
                                        overlay = true,         -- don't summarize
                                        total   = true,         -- report total amount of bytes
                                        color   = "660055"      -- dropped tx is ... dunno ;)
@@ -81,14 +89,18 @@ function rrdargs( graph, plugin, plugin_instance )
 
                                -- dropped packets (rx DS)
                                if_dropped__rx = {
+                                       weight  = 4,
+                                       title   = "Dropped (RX)",
                                        overlay = true,         -- don't summarize
                                        flip    = true,         -- flip rx line
                                        total   = true,         -- report total amount of bytes
-                                       color   = "440066"      -- dropped rx is violett
+                                       color   = "ff00ff"      -- dropped rx is violett
                                },
 
                                -- packet errors (tx DS)
                                if_errors__tx = {
+                                       weight  = 0,
+                                       title   = "Errors  (TX)",
                                        overlay = true,         -- don't summarize
                                        total   = true,         -- report total amount of packets
                                        color   = "ff5500"      -- tx errors are orange
@@ -96,6 +108,8 @@ function rrdargs( graph, plugin, plugin_instance )
 
                                -- packet errors (rx DS)
                                if_errors__rx = {
+                                       weight  = 5,
+                                       title   = "Errors  (RX)",
                                        overlay = true,         -- don't summarize
                                        flip    = true,         -- flip rx line
                                        total   = true,         -- report total amount of packets
@@ -122,6 +136,7 @@ function rrdargs( graph, plugin, plugin_instance )
                        options = {
                                -- multicast packets
                                if_multicast = {
+                                       title = "Packets",
                                        total = true,           -- report total amount of packets
                                        color = "0000ff"        -- multicast is blue
                                }
@@ -146,6 +161,7 @@ function rrdargs( graph, plugin, plugin_instance )
                        options = {
                                -- collision rate
                                if_collisions = {
+                                       title = "Collisions",
                                        total = true,           -- report total amount of packets
                                        color = "ff0000"        -- collsions are red
                                }
@@ -173,15 +189,19 @@ function rrdargs( graph, plugin, plugin_instance )
                        },
 
                        -- special options for single data lines
-                       options = {     -- XXX: fixme (define colors...)
-                               if_tx_errors = {
-                                       total = true
-                               },
-
-                               if_rx_errors = {
-                                       flip  = true,
-                                       total = true
-                               }
+                       options = {
+                               if_tx_errors_aborted_value   = { total = true, color = "ffff00", title = "Aborted   (TX)" },
+                               if_tx_errors_carrier_value   = { total = true, color = "ffcc00", title = "Carrier   (TX)" },
+                               if_tx_errors_fifo_value      = { total = true, color = "ff9900", title = "Fifo      (TX)" },
+                               if_tx_errors_heartbeat_value = { total = true, color = "ff6600", title = "Heartbeat (TX)" },
+                               if_tx_errors_window_value    = { total = true, color = "ff3300", title = "Window    (TX)" },
+
+                               if_rx_errors_length_value    = { flip = true, total = true, color = "ff0000", title = "Length    (RX)" },
+                               if_rx_errors_missed_value    = { flip = true, total = true, color = "ff0033", title = "Missed    (RX)" },
+                               if_rx_errors_over_value      = { flip = true, total = true, color = "ff0066", title = "Over      (RX)" },
+                               if_rx_errors_crc_value       = { flip = true, total = true, color = "ff0099", title = "CRC       (RX)" },
+                               if_rx_errors_fifo_value      = { flip = true, total = true, color = "ff00cc", title = "Fifo      (RX)" },
+                               if_rx_errors_frame_value     = { flip = true, total = true, color = "ff00ff", title = "Frame     (RX)" }
                        }
                }
        }
index 6dc81bc..8b04ab8 100644 (file)
@@ -44,9 +44,6 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
                y_max = "100",
                number_format = "%5.1lf%%",
                data = {
-                       sources = {
-                               percent = { "percent" }
-                       },
                        instances = {
                                percent = "charge"
                        },
@@ -77,9 +74,6 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
                vlabel = "Minutes",
                number_format = "%.1lfm",
                data = {
-                       sources = {
-                               timeleft = { "timeleft" }
-                       },
                        instances = {
                                timeleft = { "battery" }
                        },
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua
new file mode 100644 (file)
index 0000000..876e871
--- /dev/null
@@ -0,0 +1,48 @@
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.openvpn", package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance )
+       local inst = plugin_instance:gsub("^openvpn%.(.+)%.status$", "%1")
+
+       return {
+               {
+                       title = "%%H: OpenVPN \"%s\" - Traffic" % inst,
+                       vlabel = "Bytes/s",
+                       data = {
+                               instances = {
+                                       if_octets = { "traffic", "overhead" }
+                               },
+                               sources = {
+                                       if_octets = { "tx", "rx" }
+                               },
+                               options = {
+                                       if_octets_traffic_tx  = { weight = 0, title = "Bytes    (TX)", total = true, color = "00ff00" },
+                                       if_octets_overhead_tx = { weight = 1, title = "Overhead (TX)", total = true, color = "ff9900" },
+                                       if_octets_overhead_rx = { weight = 2, title = "Overhead (RX)", total = true, flip = true, color = "ff00ff" },
+                                       if_octets_traffic_rx  = { weight = 3, title = "Bytes    (RX)", total = true, flip = true, color = "0000ff" }
+                               }
+                       }
+               },
+
+               {
+                       title = "%%H: OpenVPN \"%s\" - Compression" % inst,
+                       vlabel = "Bytes/s",
+                       data = {
+                               instances = {
+                                       compression = { "data_out", "data_in" }
+                               },
+                               sources = {
+                                       compression = { "uncompressed", "compressed" }
+                               },
+                               options = {
+                                       compression_data_out_uncompressed = { weight = 0, title = "Uncompressed (TX)", total = true, color = "00ff00" },
+                                       compression_data_out_compressed   = { weight = 1, title = "Compressed   (TX)", total = true, color = "008800" },
+                                       compression_data_in_compressed    = { weight = 2, title = "Compressed   (RX)", total = true, flip = true, color = "000088" },
+                                       compression_data_in_uncompressed  = { weight = 3, title = "Uncompressed (RX)", total = true, flip = true, color = "0000ff" }
+                               }
+                       }
+               }
+       }
+end
index 347d756..f0a5948 100644 (file)
@@ -6,24 +6,33 @@ module("luci.statistics.rrdtool.definitions.ping", package.seeall)
 function rrdargs( graph, plugin, plugin_instance, dtype )
        return {
                -- Ping roundtrip time
-               { title = "%H: ICMP Round Trip Time", vlabel = "ms",
-                 number_format = "%5.1lf ms", data = {
+               { title = "%H: ICMP Round Trip Time",
+                 vlabel = "ms",
+                 number_format = "%5.1lf ms",
+                 data = {
                        sources = { ping = { "value" } },
-                       options = { ping__value = { noarea = true, title = "%di" } }
+                       options = { ping__value = {
+                               noarea = true, overlay = true, title = "%di" } }
                } },
 
                -- Ping droprate
-               { title = "%H: ICMP Drop Rate", vlabel = "%",
-                 number_format = "%5.2lf %%", data = {
+               { title = "%H: ICMP Drop Rate",
+                 vlabel = "%",
+                 number_format = "%5.2lf %%",
+                 data = {
                        types   = { "ping_droprate" },
-                       options = { ping_droprate = { title = "%di" } }
+                       options = { ping_droprate = {
+                               noarea = true, overlay = true, title = "%di" } }
                } },
 
                -- Ping standard deviation
-               { title = "%H: ICMP Standard Deviation", vlabel = "ms",
-                 number_format = "%5.2lf ms", data = {
+               { title = "%H: ICMP Standard Deviation",
+                 vlabel = "ms",
+                 number_format = "%5.2lf ms",
+                 data = {
                        types   = { "ping_stddev" },
-                       options = { ping_stddev = { title = "%di" } }
+                       options = { ping_stddev = {
+                               noarea = true, overlay = true, title = "%di" } }
                } },
        }
 end
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua
new file mode 100644 (file)
index 0000000..f8bddb9
--- /dev/null
@@ -0,0 +1,24 @@
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.sensors", package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance )
+       return {
+               {
+                       per_instance = true,
+                       title = "%H: %pi - %di",
+                       vlabel = "\176C",
+                       number_format = "%4.1lf\176C",
+                       data = {
+                               types = { "temperature" },
+                               options = {
+                                       temperature__value = {
+                                               color = "ff0000",
+                                               title = "Temperature"
+                                       }
+                               }
+                       }
+               }
+       }
+end
index 0fb3d56..3827199 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Statistics%></a></h2>
+<h2 name="content"><%:Statistics%></h2>
 
 <p><%_The statistics package uses <a href="https://collectd.org/">Collectd</a>
 to gather data and <a href="http://oss.oetiker.ch/rrdtool/">RRDtool</a> to
index 7716951..ebc78ba 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Statistics%></a></h2>
+<h2 name="content"><%:Statistics%></h2>
 
 <form action="" method="get">
        <select name="host">
index ba47db0..5ccaa4a 100644 (file)
@@ -30,6 +30,9 @@ msgstr "Afegeix múltiples hosts separats per espai."
 msgid "Add notification command"
 msgstr "Afegeix ordre de notificació"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Directori base"
 
@@ -63,9 +66,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Configuració Collectd"
 
@@ -132,6 +132,12 @@ msgstr "Adreça electrònica"
 msgid "Enable this plugin"
 msgstr "Activa aquest connector"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -150,6 +156,15 @@ msgstr "Neteja la memòria cau després de"
 msgid "Forwarding between listen and server addresses"
 msgstr "Readreçant entre adreces que reben connexions i adreces de servidors"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Gràfics"
 
@@ -179,6 +194,9 @@ msgstr ""
 "Ací pots definir diversos criteris pels que es seleccionaran les regles "
 "iptables monitoritzades ."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Host"
 
@@ -242,6 +260,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr "Monitoritza tots els ports locals que reben connexions"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitoritza dispositius"
 
@@ -305,6 +326,15 @@ msgstr "Configuració del connector OLSRd"
 msgid "Only create average RRAs"
 msgstr "Crea només RRAs mitjans"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Opcions"
 
@@ -362,12 +392,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Segons"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Màquina servidor"
 
 msgid "Server port"
 msgstr "Port del servidor"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Monitoreig de classe shaping"
 
@@ -418,9 +460,6 @@ msgstr "Marques de temps emmagatzemades"
 msgid "System Load"
 msgstr "Càrrega de sistema"
 
-msgid "System plugins"
-msgstr "Connectors de sistema"
-
 msgid "TCP Connections"
 msgstr "Connexions TCP"
 
@@ -445,6 +484,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -492,6 +536,9 @@ msgstr ""
 "es fa servir en conjunció amb Mail::SpamAssassin::Plugin. Plugin::Collectd "
 "també es pot utilitzar d'altres maneres."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -580,19 +627,20 @@ msgstr ""
 "Això pot inutilitzar el dispositiu!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"El paquet d'estadísitiques està basat en <a href=\"http://collectd.org/index."
-"shtml\">Collectd</a> i utilitza l'eina <a href=\"http://oss.oetiker.ch/"
-"rrdtool/\">RRD</a> per renderitzar imatges de diagrama de les dades "
-"recoliildes."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -648,6 +696,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Fitxer PID usat"
 
@@ -663,6 +714,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "p.e. br-ff"
 
@@ -684,6 +739,22 @@ msgstr "segons; múltiples separats per espais"
 msgid "server interfaces"
 msgstr "interfícies de servidor"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Connectors de sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "El paquet d'estadísitiques està basat en <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> i utilitza l'eina <a href=\"http://oss.oetiker."
+#~ "ch/rrdtool/\">RRD</a> per renderitzar imatges de diagrama de les dades "
+#~ "recoliildes."
+
 #~ msgid ""
 #~ "The wireless plugin collects statistics about wireless signal strength, "
 #~ "noise and quality."
index 9a3ab67..bfa1b89 100644 (file)
@@ -26,6 +26,9 @@ msgstr "Přidat více hostů, oddělených mezerou"
 msgid "Add notification command"
 msgstr "Přidat příkaz pro upozornění"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Základní adresář"
 
@@ -59,9 +62,6 @@ msgstr "CollectRoutes"
 msgid "CollectTopology"
 msgstr "CollectTopology"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Nastavení Collectd"
 
@@ -128,6 +128,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Povolit tento plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -146,6 +152,15 @@ msgstr "Vyprázdnit cache po"
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Grafy"
 
@@ -173,6 +188,9 @@ msgstr ""
 "Zde můžete definovat různá kritéria, podle kterých budou vybrána sledovaná "
 "pravidla iptables."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Hostitel"
 
@@ -237,6 +255,9 @@ msgstr "Sledovat vše kromě vybraných"
 msgid "Monitor all local listen ports"
 msgstr "Monitorovat všechny naslouchající porty"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Sledovat zařízení"
 
@@ -300,6 +321,15 @@ msgstr "Nastavení pluginu OLSRd"
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Možnosti"
 
@@ -358,12 +388,24 @@ msgstr "Skript"
 msgid "Seconds"
 msgstr "Sekundy"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Hostitel serveru"
 
 msgid "Server port"
 msgstr "Port serveru"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -412,9 +454,6 @@ msgstr ""
 msgid "System Load"
 msgstr "Zatížení systému"
 
-msgid "System plugins"
-msgstr "Systémové pluginy"
-
 msgid "TCP Connections"
 msgstr "TCP spojení"
 
@@ -439,6 +478,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr "Plugin Conntrack shromažďuje statistiky o počtu sledovaných spojení."
@@ -485,6 +529,9 @@ msgstr ""
 "použití ve spojení s Mail::SpamAssasin::Plugin::Collectd, ale stejně dobře "
 "může být využit jinak."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -566,18 +613,20 @@ msgstr ""
 "</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Balíček Statistiky je založen na <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> a využívá <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> pro kreslení diagramů z collectd."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -631,6 +680,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Použitý soubor PID (identifikátoru procesu)"
 
@@ -646,6 +698,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Nastavení pluginu Wireless Iwinfo"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "např. br-ff"
 
@@ -667,6 +723,21 @@ msgstr "sekundy, více hodnot oddělených mezerou"
 msgid "server interfaces"
 msgstr "rozhraní serveru"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Systémové pluginy"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Balíček Statistiky je založen na <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> a využívá <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> pro kreslení diagramů z collectd."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Instalované síťové pluginy:"
 
index 6c93589..91baf0e 100644 (file)
@@ -28,6 +28,9 @@ msgstr "Mehrere Hosts durch Leerzeichen getrennt hinzufuegen"
 msgid "Add notification command"
 msgstr "Benachrichtigungskommando hinzufügen"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Basisverzeichnis"
 
@@ -61,9 +64,6 @@ msgstr "Informationen über Routen sammeln (CollectRoutes)"
 msgid "CollectTopology"
 msgstr "Informationen über die Netzwerktopologie sammeln (CollectTopology)"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd Einstellungen"
 
@@ -130,6 +130,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Plugin aktivieren"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -148,6 +154,15 @@ msgstr "Leerungsintervall für Zwischenspeicher"
 msgid "Forwarding between listen and server addresses"
 msgstr "Weiterleitung zwischen Listen- und Server-Adressen"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Diagramme"
 
@@ -179,6 +194,9 @@ msgstr ""
 "Hier werden die Kriterien festgelegt nach welchen die zu überwachenden "
 "Firewall-Regeln ausgewählt werden."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Host"
 
@@ -244,6 +262,9 @@ msgstr "Alle bis auf Angegebene überwachen"
 msgid "Monitor all local listen ports"
 msgstr "Alle durch lokale Dienste genutzten Ports überwachen"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Geräte überwachen"
 
@@ -307,6 +328,15 @@ msgstr "OLSRd-Plugin-Konfiguration"
 msgid "Only create average RRAs"
 msgstr "Nur &#39;average&#39; RRAs erzeugen"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Optionen"
 
@@ -364,12 +394,24 @@ msgstr "Skript"
 msgid "Seconds"
 msgstr "Sekunden"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Server-Host"
 
 msgid "Server port"
 msgstr "Server-Port"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Shapingklassen überwachen"
 
@@ -418,9 +460,6 @@ msgstr "gespeicherte Zeitspannen"
 msgid "System Load"
 msgstr "Systemlast"
 
-msgid "System plugins"
-msgstr "Systemplugins"
-
 msgid "TCP Connections"
 msgstr "TCP-Verbindungen"
 
@@ -448,6 +487,11 @@ msgstr ""
 "Erweiterung."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -497,6 +541,9 @@ msgstr ""
 "Plugin ist primär für die Verwendung zusammen mit Mail::SpamAssasin::Plugin::"
 "Collectd gedacht, kann aber auch anderweitig verwendet werden."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -585,18 +632,20 @@ msgstr ""
 "machen, da Systemspeicher für den regulären Betrieb fehlt!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Das Statistik-Paket basiert auf <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> und nutzt <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> um die gesammelten Daten in Diagramme zu rendern."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -652,6 +701,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Pfad zu PID-Datei"
 
@@ -667,6 +719,10 @@ msgstr "Drahtlos"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Wireless-iwinfo Plugin Konfiguration"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "z.B. br-ff"
 
@@ -688,6 +744,21 @@ msgstr "mehrere mit Leerzeichen trennen"
 msgid "server interfaces"
 msgstr "Server-Schnittstellen"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Systemplugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Das Statistik-Paket basiert auf <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> und nutzt <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> um die gesammelten Daten in Diagramme zu rendern."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Installierte Netzwerk-Plugins:"
 
index 0893e2e..746284f 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 #, fuzzy
 msgid "Base Directory"
 msgstr "Κατάλογος βάσης"
@@ -62,9 +65,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Ρυθμίσεις Collectd"
 
@@ -132,6 +132,12 @@ msgstr "Ηλ. Ταχυδρομείο"
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -150,6 +156,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Γραφήματα"
 
@@ -172,6 +187,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -235,6 +253,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -298,6 +319,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -355,12 +385,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Δευτερόλεπτα"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -409,9 +451,6 @@ msgstr ""
 msgid "System Load"
 msgstr "Φόρτος Συστήματος"
 
-msgid "System plugins"
-msgstr "Πρόσθετα συστήματος"
-
 msgid "TCP Connections"
 msgstr "Συνδέσεις TCP"
 
@@ -436,6 +475,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -470,6 +514,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -530,18 +577,20 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Το πακέτο στατιστικών βασίζεται στο <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> και χρησιμοποιεί το <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> για να σχεδιάσει διαγράμματα από τα συλλεγόμενα δεδομένα."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -589,6 +638,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Αρχείο PID σε χρήση"
 
@@ -604,6 +656,10 @@ msgstr "Ασύρματο"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "π.χ. br-ff"
 
@@ -624,3 +680,19 @@ msgstr ""
 
 msgid "server interfaces"
 msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Πρόσθετα συστήματος"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Το πακέτο στατιστικών βασίζεται στο <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> και χρησιμοποιεί το <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> για να σχεδιάσει διαγράμματα από τα συλλεγόμενα "
+#~ "δεδομένα."
index 4d94313..79f710c 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr "Add notification command"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Base Directory"
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd Settings"
 
@@ -130,6 +130,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Enable this plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -148,6 +154,15 @@ msgstr "Flush cache after"
 msgid "Forwarding between listen and server addresses"
 msgstr "Forwarding between listen and server addresses"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Graphs"
 
@@ -177,6 +192,9 @@ msgstr ""
 "Here you can define various criteria by which the monitored iptables rules "
 "are selected."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -240,6 +258,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr "Monitor all local listen ports"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitor devices"
 
@@ -303,6 +324,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr "Only create average RRAs"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Options"
 
@@ -360,12 +390,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Seconds"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Server host"
 
 msgid "Server port"
 msgstr "Server port"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Shaping class monitoring"
 
@@ -414,9 +456,6 @@ msgstr "Stored timespans"
 msgid "System Load"
 msgstr "System Load"
 
-msgid "System plugins"
-msgstr "System plugins"
-
 msgid "TCP Connections"
 msgstr "TCP Connections"
 
@@ -441,6 +480,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -487,6 +531,9 @@ msgstr ""
 "to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
 "be used in other ways as well."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -568,18 +615,20 @@ msgstr ""
 "directory. This can render the device unusable!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -634,6 +683,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Used PID file"
 
@@ -649,6 +701,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "e.g. br-ff"
 
@@ -670,6 +726,21 @@ msgstr "seconds; multiple separated by space"
 msgid "server interfaces"
 msgstr "server interfaces"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+
 #~ msgid ""
 #~ "The wireless plugin collects statistics about wireless signal strength, "
 #~ "noise and quality."
index f43ea4c..7067710 100644 (file)
@@ -28,6 +28,9 @@ msgstr "Añadir múltiples máquinas separadas por espacio."
 msgid "Add notification command"
 msgstr "Añadir comando de notificación"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Directorio Base"
 
@@ -61,9 +64,6 @@ msgstr "Rutas"
 msgid "CollectTopology"
 msgstr "Topología"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Configuración de Collectd"
 
@@ -130,6 +130,12 @@ msgstr "Correo electrónico"
 msgid "Enable this plugin"
 msgstr "Activar este plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -148,6 +154,15 @@ msgstr "Vaciar caché tras"
 msgid "Forwarding between listen and server addresses"
 msgstr "Retransmitir entre las direcciones de escucha y servidor"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Gráficas"
 
@@ -176,6 +191,9 @@ msgstr ""
 "Aquí puede definir varios criterios de selección de reglas de iptables "
 "monitorizadas."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Máquina"
 
@@ -239,6 +257,9 @@ msgstr "Monitorizar todos menos los especificados"
 msgid "Monitor all local listen ports"
 msgstr "Monitorizar todos los puertos de escucha locales"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Dispositivos a monitonizar"
 
@@ -302,6 +323,15 @@ msgstr "Configuración del plugin \"OLSRd\""
 msgid "Only create average RRAs"
 msgstr "Crear sólo RRAs medias"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Opciones"
 
@@ -359,12 +389,24 @@ msgstr "Guión"
 msgid "Seconds"
 msgstr "Segundos"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Máquina servidor"
 
 msgid "Server port"
 msgstr "Puerto servidor"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Monitorización de la clase shaping"
 
@@ -413,9 +455,6 @@ msgstr "Intervalos almacenados"
 msgid "System Load"
 msgstr "Carga del sistema"
 
-msgid "System plugins"
-msgstr "Plugins del sistema"
-
 msgid "TCP Connections"
 msgstr "Conexiones TCP"
 
@@ -444,6 +483,11 @@ msgstr ""
 "txtinfo de OLSRd."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -495,6 +539,9 @@ msgstr ""
 "utilizado en conjunto con Mail::SpamAssasin::Plugin::Collectd pero puede "
 "utilizarse de diferentes formas."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -581,18 +628,20 @@ msgstr ""
 "puede hacer que el dispositivo funcione mal!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"El paquete \"estadísticas\" está basado en <a href=\"http://collectd.org/"
-"index.shtml\">Collectd</a> y utiliza <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para dibujar gráficos con los datos recogidos."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -648,6 +697,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Archivo PID utilizado"
 
@@ -663,6 +715,10 @@ msgstr "Red inalámbrica"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Configuración plugin \"Wireless iwinfo\""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "p.e. br-ff"
 
@@ -684,6 +740,21 @@ msgstr "segundos (varios separados por espacio)"
 msgid "server interfaces"
 msgstr "interfaces servidores"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugins del sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "El paquete \"estadísticas\" está basado en <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> y utiliza <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> para dibujar gráficos con los datos recogidos."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Plugins de red instalados:"
 
index 643c268..194a220 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr "Ajoute une commande de notification"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Répertoire de base"
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Paramètres Collectd"
 
@@ -130,6 +130,12 @@ msgstr "Courriel"
 msgid "Enable this plugin"
 msgstr "Activer ce greffon"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -148,6 +154,15 @@ msgstr "Vidanger le cache après"
 msgid "Forwarding between listen and server addresses"
 msgstr "Transfert entre les adresses en écoute et du serveur"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Graphiques"
 
@@ -178,6 +193,9 @@ msgstr ""
 "Vous pouvez définir ici les critères variés pour sélectionner les règles "
 "iptables à surveiller."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -241,6 +259,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr "Surveiller tous les ports en écoute locaux"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Périphériques à surveiller"
 
@@ -304,6 +325,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr "Créer seulement des RRAs moyens"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Options"
 
@@ -361,12 +391,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Secondes"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Hôte du serveur"
 
 msgid "Server port"
 msgstr "Port du serveur"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Surveillance liées à la priorité"
 
@@ -415,9 +457,6 @@ msgstr "Durée de la période enregistrée"
 msgid "System Load"
 msgstr "Charge-système"
 
-msgid "System plugins"
-msgstr "Greffons liés au système"
-
 msgid "TCP Connections"
 msgstr "Connexions TCP"
 
@@ -442,6 +481,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -488,6 +532,9 @@ msgstr ""
 "Ce greffon est d'abord destiné à être utilisé avec Mail::SpamAssasin::"
 "Plugin::Collectd mais peut être utilisé d'autres manières également."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -576,19 +623,20 @@ msgstr ""
 "le matériel inutilisable !</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Ce paquet d'outils statistiques s'appuie sur le logiciel <a href=\"http://"
-"collectd.org/index.shtml\">Collectd</a> et utilise <a href=\"http://oss."
-"oetiker.ch/rrdtool/\">RRD Tool</a> pour calculer les graphes issus des "
-"données collectées."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -642,6 +690,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Fichier PID utilisé"
 
@@ -657,6 +708,10 @@ msgstr "Sans-fil"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "p.ex. br-ff"
 
@@ -678,6 +733,22 @@ msgstr "En secondes ; séparer différentes valeurs par des espaces"
 msgid "server interfaces"
 msgstr "Interfaces du serveur"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Greffons liés au système"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Ce paquet d'outils statistiques s'appuie sur le logiciel <a href=\"http://"
+#~ "collectd.org/index.shtml\">Collectd</a> et utilise <a href=\"http://oss."
+#~ "oetiker.ch/rrdtool/\">RRD Tool</a> pour calculer les graphes issus des "
+#~ "données collectées."
+
 #~ msgid ""
 #~ "The wireless plugin collects statistics about wireless signal strength, "
 #~ "noise and quality."
index 542a9c0..10e8a12 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -127,6 +127,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -145,6 +151,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -167,6 +182,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -230,6 +248,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -293,6 +314,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -350,12 +380,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -404,9 +446,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -431,6 +470,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -465,6 +509,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -525,14 +572,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -581,6 +633,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -596,6 +651,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index b91db79..5d38414 100644 (file)
@@ -26,6 +26,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr "Értesítési parancs hozzáadása"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Alapkönyvtár"
 
@@ -59,9 +62,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd beállítások"
 
@@ -128,6 +128,12 @@ msgstr "E-mail"
 msgid "Enable this plugin"
 msgstr "Bővítmény engedélyezése"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -146,6 +152,15 @@ msgstr "Gyorsítótár ürítése ezután:"
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Grafikonok"
 
@@ -176,6 +191,9 @@ msgstr ""
 "Itt addhatók meg különböző feltételek, amelyek alapján a megfigyelt iptables "
 "szabályok kiválasztásra kerülnek."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Gép"
 
@@ -242,6 +260,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Eszközök figyelése"
 
@@ -305,6 +326,15 @@ msgstr "OLSRd bővítmény beállítása"
 msgid "Only create average RRAs"
 msgstr "Csak átlag RRA-k létrehozása"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Lehetőségek"
 
@@ -362,12 +392,24 @@ msgstr "Parancsfájl"
 msgid "Seconds"
 msgstr "másodperc"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Kiszolgáló gép"
 
 msgid "Server port"
 msgstr "Kiszolgáló port"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -420,9 +462,6 @@ msgstr "Tárolt időszakok"
 msgid "System Load"
 msgstr "Rendszerterhelés"
 
-msgid "System plugins"
-msgstr "Rendszer bővítmények"
-
 msgid "TCP Connections"
 msgstr "TCP kapcsolatok"
 
@@ -449,6 +488,11 @@ msgstr ""
 "txttinfo bővítményén keresztül."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -499,6 +543,9 @@ msgstr ""
 "elsősorban a Mail::SpamAssasin::Plugin::Collectd bővítménnyel együtt történő "
 "használatra szolgál, de egyéb módokon is használható."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -568,19 +615,20 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"A statisztikai csomag a <a href=\"http://collectd.org/index.shtml"
-"\">collectd</a> segédprogramon alapul és az <a href=\"http://oss.oetiker.ch/"
-"rrdtool/\">RRD Tool</a> segédprogramot használja a grafikonok elkészítésére "
-"az összegyűjtött adatokból."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -634,6 +682,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Használt PID fájl"
 
@@ -649,6 +700,10 @@ msgstr "Vezeték nélküli"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "iwinfo vezeték nélküli bővítmény beállítása"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "pl. br-ff"
 
@@ -670,6 +725,22 @@ msgstr "másodpercek; több szóközzel elválasztott érték is megadható"
 msgid "server interfaces"
 msgstr "kiszolgáló interfész"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Rendszer bővítmények"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "A statisztikai csomag a <a href=\"http://collectd.org/index.shtml"
+#~ "\">collectd</a> segédprogramon alapul és az <a href=\"http://oss.oetiker."
+#~ "ch/rrdtool/\">RRD Tool</a> segédprogramot használja a grafikonok "
+#~ "elkészítésére az összegyűjtött adatokból."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Telepített hálózati bővítmények:"
 
index d101536..ab5a783 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -130,6 +130,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr "Abilita questo plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -148,6 +154,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -175,6 +190,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -240,6 +258,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -303,6 +324,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -360,12 +390,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -414,9 +456,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -441,6 +480,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -475,6 +519,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -535,14 +582,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -591,6 +643,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -606,6 +661,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 7a4657d..7ee9ae0 100644 (file)
@@ -28,6 +28,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "ベース・ディレクトリ"
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd 設定"
 
@@ -127,6 +127,12 @@ msgstr "Eメール"
 msgid "Enable this plugin"
 msgstr "プラグイン設定を有効にする"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -145,6 +151,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "グラフ"
 
@@ -167,6 +182,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -230,6 +248,9 @@ msgstr "設定値以外の全てのインターフェースをモニターする
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -293,6 +314,15 @@ msgstr "OLSRd プラグイン設定"
 msgid "Only create average RRAs"
 msgstr "平均値のRRAsのみ作成する"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "オプション"
 
@@ -350,12 +380,24 @@ msgstr "スクリプト"
 msgid "Seconds"
 msgstr "秒"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -404,9 +446,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr "システムプラグイン"
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -431,6 +470,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -465,6 +509,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -528,14 +575,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -584,6 +636,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "使用するPIDファイルの保存場所"
 
@@ -599,6 +654,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "無線LAN iwinfo プラグイン設定"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
@@ -619,3 +678,9 @@ msgstr ""
 
 msgid "server interfaces"
 msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "システムプラグイン"
index c82120b..02dfae9 100644 (file)
@@ -25,6 +25,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -58,9 +61,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -124,6 +124,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -142,6 +148,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -164,6 +179,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -227,6 +245,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -290,6 +311,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -347,12 +377,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -401,9 +443,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -428,6 +467,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -462,6 +506,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -522,14 +569,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -578,6 +630,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -593,6 +648,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 0e46dd1..c4300bc 100644 (file)
@@ -19,6 +19,9 @@ msgstr "Legg til flere verter adskilt med mellomrom."
 msgid "Add notification command"
 msgstr "Legg til varsling kommando"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Hoved Katalog"
 
@@ -52,9 +55,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd Innstillinger"
 
@@ -121,6 +121,12 @@ msgstr "Epost"
 msgid "Enable this plugin"
 msgstr "Aktiver denne plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Program"
 
@@ -139,6 +145,15 @@ msgstr "Tømme hurtigbufferen etter"
 msgid "Forwarding between listen and server addresses"
 msgstr "Videresending mellom lyttende og server adresser"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Grafer"
 
@@ -166,6 +181,9 @@ msgid ""
 "are selected."
 msgstr "Her kan du definere kriterier for reglene som overvåker iptables."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -229,6 +247,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr "Overvåk alle lokale lyttende porter"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Overvåk enheter"
 
@@ -292,6 +313,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr "Lag kun gjennomsnittlige RRAs"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Alternativer"
 
@@ -349,12 +379,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Sekunder"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Server vert"
 
 msgid "Server port"
 msgstr "Server port"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Shaping class overvåking"
 
@@ -403,9 +445,6 @@ msgstr "Lagrede tidsperioder"
 msgid "System Load"
 msgstr "System Belastning"
 
-msgid "System plugins"
-msgstr "System plugins"
-
 msgid "TCP Connections"
 msgstr "TCP Forbindelser"
 
@@ -430,6 +469,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -476,6 +520,9 @@ msgstr ""
 "bli brukt i forbindelse med Mail::SpamAssasin::Plugin::Collectd men kan også "
 "brukes på andre måter."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -556,18 +603,20 @@ msgstr ""
 "katalogen (temp). Dette kan gjøre enheten ubrukelig!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Statistikk pakken er basert på <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> og bruker <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> for å tegne diagram bilder fra innsamlede data."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -623,6 +672,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Brukt PID fil"
 
@@ -638,6 +690,10 @@ msgstr "Trådløs"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "f.eks. br-ff"
 
@@ -659,6 +715,21 @@ msgstr "sekunder; flere adskilt med mellomrom"
 msgid "server interfaces"
 msgstr "Server grensesnitt"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Statistikk pakken er basert på <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> og bruker <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> for å tegne diagram bilder fra innsamlede data."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Installerte nettverks plugin:"
 
index de86176..d352bed 100644 (file)
@@ -29,6 +29,9 @@ msgstr "Dodaj wiele hostów rozdzielonych spacjami."
 msgid "Add notification command"
 msgstr "Dodaj komendę powiadamiającą"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Główny katalog"
 
@@ -62,9 +65,6 @@ msgstr "CollectRoutes"
 msgid "CollectTopology"
 msgstr "CollectTopology"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Ustawienia Collectd"
 
@@ -131,6 +131,12 @@ msgstr "E-mail"
 msgid "Enable this plugin"
 msgstr "Włącz tę wtyczkę"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -149,6 +155,15 @@ msgstr "Opróżnić cache po"
 msgid "Forwarding between listen and server addresses"
 msgstr "Przekazać przez słuchacza na adres serwera"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Wykresy"
 
@@ -178,6 +193,9 @@ msgstr ""
 "Tutaj można zdefiniować różne kryteria według których wybierane są "
 "monitorowane reguły iptables."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Host"
 
@@ -243,6 +261,9 @@ msgstr "Monitoruj wszystko oprócz podanych"
 msgid "Monitor all local listen ports"
 msgstr "Monitoruj wszystkie lokalne otwarte porty"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitoruj urządzenia"
 
@@ -306,6 +327,15 @@ msgstr "Konfiguracja wtyczki OLSRd"
 msgid "Only create average RRAs"
 msgstr "Twórz tylko średnie archiwa RRA"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Opcje"
 
@@ -363,12 +393,24 @@ msgstr "Skrypt"
 msgid "Seconds"
 msgstr "Sekundy"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Host serwer"
 
 msgid "Server port"
 msgstr "Port serwera"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Shaping Klasa Monitoring"
 
@@ -418,9 +460,6 @@ msgstr "Przechowywane okresy czasu"
 msgid "System Load"
 msgstr "Obciążenie systemu"
 
-msgid "System plugins"
-msgstr "Wtyczki systemowe"
-
 msgid "TCP Connections"
 msgstr "Połączenia TCP"
 
@@ -447,6 +486,11 @@ msgstr ""
 "OLSRd."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr "Wtyczka Conntrack zbiera statystyki o liczbie śledzonych połączeń."
@@ -493,6 +537,9 @@ msgstr ""
 "with Mail::SpamAssasin::Plugin::Collectd but can be used in other ways as "
 "well."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -576,18 +623,20 @@ msgstr ""
 "do użytku! </strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Statystyki bazuja na <a href=\"http://collectd.org/index.shtml\">Collectd</"
-"a> oraz wykorzystują <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD Tool</a> "
-"do generowania diagramów i wykresów z zebranych danych."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -641,6 +690,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Używany plik PID"
 
@@ -656,6 +708,10 @@ msgstr "WiFi"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Konfiguracja bezprzewodowego pluginu iwinfo"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "np. br-ff"
 
@@ -677,6 +733,21 @@ msgstr "sekundy; wielokrotnie oddzielone spacją"
 msgid "server interfaces"
 msgstr "interfejsy serwera"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Wtyczki systemowe"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Statystyki bazuja na <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> oraz wykorzystują <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> do generowania diagramów i wykresów z zebranych danych."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Zainstalowane wtyczki sieciowe:"
 
index f7b6616..9abba49 100644 (file)
@@ -28,6 +28,9 @@ msgstr "Adicione múltiplos equipamentos separados por espaço."
 msgid "Add notification command"
 msgstr "Adicionar o comando de notificação"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Diretório Base"
 
@@ -61,9 +64,6 @@ msgstr "Coleção de Rotas"
 msgid "CollectTopology"
 msgstr "Coleção de Topologias"
 
-msgid "Collectd"
-msgstr "Coletar"
-
 msgid "Collectd Settings"
 msgstr "Configurações do Coletadas"
 
@@ -130,6 +130,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Habilitar este plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -149,6 +155,15 @@ msgid "Forwarding between listen and server addresses"
 msgstr ""
 "Encaminhamento entre o endereço de escuta e os endereços dos servidores"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Gráficos"
 
@@ -178,6 +193,9 @@ msgstr ""
 "Aqui você pode definir diversos critérios para as regras iptables "
 "selecionadas serem monitoradas."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Equipamento"
 
@@ -243,6 +261,9 @@ msgstr "Monitore tudo exceto se especificado"
 msgid "Monitor all local listen ports"
 msgstr "Monitorar todas as portas locais"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitorar dispositivos"
 
@@ -306,6 +327,15 @@ msgstr "Configuração do Plugin OLSRd"
 msgid "Only create average RRAs"
 msgstr "Somente criar RRAs de média"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Opções"
 
@@ -363,12 +393,24 @@ msgstr "Script"
 msgid "Seconds"
 msgstr "Segundos"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Endereço do servidor"
 
 msgid "Server port"
 msgstr "Porta do servidor"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Monitoramento das Classes de Shaping"
 
@@ -417,9 +459,6 @@ msgstr "Intervalos armazenados"
 msgid "System Load"
 msgstr "Carga do Sistema"
 
-msgid "System plugins"
-msgstr "Plugins de sistema"
-
 msgid "TCP Connections"
 msgstr "Conexões TCP"
 
@@ -446,6 +485,11 @@ msgstr ""
 "txtinfo do OLSRd."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -495,6 +539,9 @@ msgstr ""
 "destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
 "Plugin::Collectd mas pode ser utilizado de outras maneiras também."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -581,18 +628,20 @@ msgstr ""
 "Isso pode tornar o equipamento inutilizável!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para renderização das imagens a partir dos dados coletados."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -648,6 +697,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Arquivo PID usado"
 
@@ -663,6 +715,10 @@ msgstr "Rede Sem Fio (Wireless)"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Configuração do Plugin iwinfo da Rede Sem Fio (Wireless)"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "ex: br-ff"
 
@@ -684,6 +740,22 @@ msgstr "segundos; vários valores, separar com espaço"
 msgid "server interfaces"
 msgstr "interfaces do servidor"
 
+#~ msgid "Collectd"
+#~ msgstr "Coletar"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugins de sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> para renderização das imagens a partir dos dados "
+#~ "coletados."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Plugins de rede instalados:"
 
index 54f5803..34b435c 100644 (file)
@@ -28,6 +28,9 @@ msgstr "Adicionar hosts múltiplos separados por espaço."
 msgid "Add notification command"
 msgstr "Adicionar o comando de notificação"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Diretório Base"
 
@@ -61,9 +64,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Configurações do Collectd"
 
@@ -130,6 +130,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Habilitar este plugin"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -148,6 +154,15 @@ msgstr "Limpar cache após"
 msgid "Forwarding between listen and server addresses"
 msgstr "Transmissão entre o endereço de escuta e dos servidores"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Gráficos"
 
@@ -177,6 +192,9 @@ msgstr ""
 "Aqui você pode definir diversos critérios para as regras iptables "
 "selecionadas serem monitoradas."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -242,6 +260,9 @@ msgstr "Monitorizar tudo excepto os especificados"
 msgid "Monitor all local listen ports"
 msgstr "Monitorar todas as portas locais"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitorar dispositivos"
 
@@ -305,6 +326,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr "Somente criar RRAs de média"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Opções"
 
@@ -362,12 +392,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Segundos"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "IP/Hostname do servidor"
 
 msgid "Server port"
 msgstr "Porta do servidor"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Monitoramento das Classes de Shaping"
 
@@ -416,9 +458,6 @@ msgstr "Intervalos armazenados"
 msgid "System Load"
 msgstr "Carga do Sistema"
 
-msgid "System plugins"
-msgstr "Plugis de Sistema"
-
 msgid "TCP Connections"
 msgstr "Conexões TCP"
 
@@ -443,6 +482,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -490,6 +534,9 @@ msgstr ""
 "destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
 "Plugin::Collectd mas pode ser utilizado de outras maneiras também."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -574,18 +621,20 @@ msgstr ""
 "Isso pode tornar o equipamento inutilizável!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para renderização das imagens à partir dos dados coletados."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -641,6 +690,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Arquivo PID usado"
 
@@ -656,6 +708,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "ex. br-ff"
 
@@ -677,6 +733,22 @@ msgstr "segundos; vários valores, separar com espaço"
 msgid "server interfaces"
 msgstr "Interfaces do servidor"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugis de Sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> para renderização das imagens à partir dos dados "
+#~ "coletados."
+
 #~ msgid ""
 #~ "The wireless plugin collects statistics about wireless signal strength, "
 #~ "noise and quality."
index f6c049f..7990970 100644 (file)
@@ -29,6 +29,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Directorul de baza"
 
@@ -62,9 +65,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Setarile Collectd"
 
@@ -131,6 +131,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -149,6 +155,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Grafice"
 
@@ -171,6 +186,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -234,6 +252,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -297,6 +318,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -354,12 +384,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Secunde"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -408,9 +450,6 @@ msgstr ""
 msgid "System Load"
 msgstr "Incarcarea de sistem"
 
-msgid "System plugins"
-msgstr "Pluginuri de sistem"
-
 msgid "TCP Connections"
 msgstr "Conexiuni TCP"
 
@@ -435,6 +474,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -471,6 +515,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -531,14 +578,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -587,6 +639,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Fisierul pentru PID folosit"
 
@@ -602,6 +657,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
@@ -622,3 +681,9 @@ msgstr ""
 
 msgid "server interfaces"
 msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Pluginuri de sistem"
index da47dff..d41248f 100644 (file)
@@ -30,6 +30,9 @@ msgstr "Добавить несколько хостов, разделённых
 msgid "Add notification command"
 msgstr "Добавить команду уведомления"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Базовая директория"
 
@@ -63,9 +66,6 @@ msgstr "Сбор информации о маршрутах (CollectRoutes)"
 msgid "CollectTopology"
 msgstr "Сбор информации о топологии (CollectTopology)"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Настройки Collectd"
 
@@ -131,6 +131,12 @@ msgstr "E-mail"
 msgid "Enable this plugin"
 msgstr "Включить этот модуль"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -150,6 +156,15 @@ msgstr "Сбросить кэш после"
 msgid "Forwarding between listen and server addresses"
 msgstr "Перенаправление между локальным адресом и адресом сервера"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Графики"
 
@@ -179,6 +194,9 @@ msgstr ""
 "Здесь вы можете указать различные критерии, по которым будут выбраны правила "
 "для сбора статистики."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "Хост"
 
@@ -244,6 +262,9 @@ msgstr "Собирать статистику со всех, кроме указ
 msgid "Monitor all local listen ports"
 msgstr "Собирать статистику со всех портов, ожидающих соединения"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Собирать статистику с устройств"
 
@@ -307,6 +328,15 @@ msgstr "Настройка плагина OLSRd"
 msgid "Only create average RRAs"
 msgstr "Создавать только средние RRA"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Опции"
 
@@ -366,12 +396,24 @@ msgstr "Скрипт"
 msgid "Seconds"
 msgstr "Секунды"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Хост сервера"
 
 msgid "Server port"
 msgstr "Порт сервера"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Мониторинг классов шейпинга"
 
@@ -420,9 +462,6 @@ msgstr "Сохранённые промежутки времени"
 msgid "System Load"
 msgstr "Загрузка системы"
 
-msgid "System plugins"
-msgstr "Системные модули"
-
 msgid "TCP Connections"
 msgstr "TCPConns"
 
@@ -448,6 +487,11 @@ msgstr ""
 "Модуль OLSRd считывает информацию о узловых сетях с модуля txtinfo OLSRd."
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -494,6 +538,9 @@ msgstr ""
 "модуль предназначен для использования вместе с Mail::SpamAssasin::Plugin::"
 "Collectd."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -572,18 +619,20 @@ msgstr ""
 "директории. Это, в свою очередь, может привести к отказу устройства!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Данная статистика основана на программе <a href=\"http://collectd.org/index."
-"shtml\">Collectd</a> и использует <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> для построения диаграмм."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -640,6 +689,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Используемый PID-файл"
 
@@ -655,6 +707,10 @@ msgstr "Wireless"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "Конфигурация модуля Iwinfo"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "напр. br-ff"
 
@@ -677,6 +733,21 @@ msgstr "секунды; разделяются пробелом"
 msgid "server interfaces"
 msgstr "интерфейсы сервера"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Системные модули"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Данная статистика основана на программе <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> и использует <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> для построения диаграмм."
+
 #~ msgid "Installed network plugins:"
 #~ msgstr "Установленные сетевые модули:"
 
index b0672f9..e0400c2 100644 (file)
@@ -23,6 +23,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -56,9 +59,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -122,6 +122,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -140,6 +146,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -162,6 +177,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -225,6 +243,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -288,6 +309,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -345,12 +375,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -399,9 +441,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -426,6 +465,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -460,6 +504,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -520,14 +567,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -576,6 +628,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -591,6 +646,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 26f60fd..9c7b217 100644 (file)
@@ -24,6 +24,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -57,9 +60,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -123,6 +123,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -141,6 +147,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -163,6 +178,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -226,6 +244,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -289,6 +310,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -346,12 +376,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -400,9 +442,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -427,6 +466,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -461,6 +505,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -521,14 +568,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -577,6 +629,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -592,6 +647,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 2162c66..2b4ba7f 100644 (file)
@@ -16,6 +16,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -49,9 +52,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -115,6 +115,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -133,6 +139,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -155,6 +170,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -218,6 +236,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -281,6 +302,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -338,12 +368,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -392,9 +434,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -419,6 +458,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -453,6 +497,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -513,14 +560,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -569,6 +621,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -584,6 +639,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index c3267da..505b5a1 100644 (file)
@@ -24,6 +24,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -57,9 +60,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -123,6 +123,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -141,6 +147,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -163,6 +178,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -226,6 +244,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -289,6 +310,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -346,12 +376,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -400,9 +442,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -427,6 +466,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -461,6 +505,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -521,14 +568,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -577,6 +629,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -592,6 +647,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 88b2337..ee5ea8f 100644 (file)
@@ -29,6 +29,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -62,9 +65,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -128,6 +128,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -146,6 +152,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -168,6 +183,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -231,6 +249,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -294,6 +315,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -351,12 +381,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -405,9 +447,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -432,6 +471,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -466,6 +510,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -526,14 +573,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -582,6 +634,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -597,6 +652,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index 02e06fb..28bc8b4 100644 (file)
@@ -29,6 +29,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr "Thêm lệnh thông báo"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "Thư mục Cơ sở"
 
@@ -62,9 +65,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Những cài đặt collectd"
 
@@ -131,6 +131,12 @@ msgstr "Email"
 msgid "Enable this plugin"
 msgstr "Kích hoạt plugin này"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -149,6 +155,15 @@ msgstr "Flush cache sau khi"
 msgid "Forwarding between listen and server addresses"
 msgstr "chuyển tiếp giữa listen và địa chỉ server"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "Graphs"
 
@@ -178,6 +193,9 @@ msgstr ""
 "Ở đây bạn có thể định nghĩa những tiêu chuẩn khác nhau để monitor iptables "
 "rules được chọn."
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -241,6 +259,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr "Monitor tất cả local listen port"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "Monitor devices"
 
@@ -304,6 +325,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr "Chỉ tạo trung bình RRAs"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "Tùy chọn"
 
@@ -361,12 +391,24 @@ msgstr ""
 msgid "Seconds"
 msgstr "Giây"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "Server host"
 
 msgid "Server port"
 msgstr "Server port"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "Shaping class monitoring"
 
@@ -415,9 +457,6 @@ msgstr "Lưu timspans"
 msgid "System Load"
 msgstr "System Load"
 
-msgid "System plugins"
-msgstr "System plugins"
-
 msgid "TCP Connections"
 msgstr "Kết nối TCP"
 
@@ -442,6 +481,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -488,6 +532,9 @@ msgstr ""
 "Mail::SpamAssasin::Plugin::Collectd nhưng cũng có thể dùng trong những cách  "
 "khác."
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -574,18 +621,20 @@ msgstr ""
 "sử dụng được</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"Gói thống kê dựa trên <a href=\"http://collectd.org/index.shtml\">Collectd</"
-"a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD Tool</a> vẽ lại "
-"sơ đồ hình ảnh từ dữ liệu thu thập ."
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -638,6 +687,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "Tập tin PID đã sử dụng"
 
@@ -653,6 +705,10 @@ msgstr "Mạng không dây"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "e.g. br-ff"
 
@@ -674,6 +730,21 @@ msgstr "giây; nhiều phân tách bởi khoảng trống"
 msgid "server interfaces"
 msgstr "giao diện server"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Gói thống kê dựa trên <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> vẽ lại sơ đồ hình ảnh từ dữ liệu thu thập ."
+
 #~ msgid ""
 #~ "The wireless plugin collects statistics about wireless signal strength, "
 #~ "noise and quality."
index 669d5f0..4714ab5 100644 (file)
@@ -28,6 +28,9 @@ msgstr "使用空格分隔多个主机"
 msgid "Add notification command"
 msgstr "新增通知命令"
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr "基本目录"
 
@@ -61,9 +64,6 @@ msgstr "收集路由"
 msgid "CollectTopology"
 msgstr "收集拓扑"
 
-msgid "Collectd"
-msgstr "Collectd"
-
 msgid "Collectd Settings"
 msgstr "Collectd设置"
 
@@ -129,6 +129,12 @@ msgstr "电子邮件"
 msgid "Enable this plugin"
 msgstr "启用该插件"
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr "Exec"
 
@@ -147,6 +153,15 @@ msgstr "清空缓存后"
 msgid "Forwarding between listen and server addresses"
 msgstr "转发监听服务器和应用服务器之间数据"
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr "图表"
 
@@ -173,6 +188,9 @@ msgid ""
 "are selected."
 msgstr "在这里,你可以定义各种监控iptables规则临界值。"
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr "主机"
 
@@ -236,6 +254,9 @@ msgstr "监测所有(除特别注明外)"
 msgid "Monitor all local listen ports"
 msgstr "监测所有本地监听端口"
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr "监测设备"
 
@@ -299,6 +320,15 @@ msgstr "OLSRd插件配置"
 msgid "Only create average RRAs"
 msgstr "仅创建平均RRAs"
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr "选项"
 
@@ -356,12 +386,24 @@ msgstr "脚本"
 msgid "Seconds"
 msgstr "秒"
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr "服务器主机"
 
 msgid "Server port"
 msgstr "服务器端口"
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr "整形类监控"
 
@@ -410,9 +452,6 @@ msgstr "存储时间跨度"
 msgid "System Load"
 msgstr "系统加载"
 
-msgid "System plugins"
-msgstr "系统插件"
-
 msgid "TCP Connections"
 msgstr "TCP连接数"
 
@@ -437,6 +476,11 @@ msgid ""
 msgstr "OLSRd插件通过txtinfo获取meshed网络信息。"
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr "conntrack插件获取连接数信息。"
@@ -474,6 +518,9 @@ msgstr ""
 "这个插件主要目的是结合使用Mail::SpamAssasin::Pulgin::Collectd,但可以用在其他"
 "方面。"
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -543,18 +590,20 @@ msgstr ""
 "使用!</strong>"
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
-"统计软件包是基于<a href=\"http://collectd.org/index.shtml\">Collectd</a>,并"
-"使用<a href=\"http://oss.oetiker.ch/rrdtool/\">RRD工具</a>来渲染图表,用于收"
-"集数据。"
 
 msgid ""
 "The tcpconns plugin collects informations about open tcp connections on "
@@ -602,6 +651,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr "正在使用的PID文件"
 
@@ -617,6 +669,10 @@ msgstr "无线"
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr "无线iwinfo插件配置"
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr "例如:br-ff"
 
@@ -638,5 +694,20 @@ msgstr "秒数;多个使用空格分隔"
 msgid "server interfaces"
 msgstr "服务器接口"
 
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "系统插件"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "统计软件包是基于<a href=\"http://collectd.org/index.shtml\">Collectd</a>,"
+#~ "并使用<a href=\"http://oss.oetiker.ch/rrdtool/\">RRD工具</a>来渲染图表,用"
+#~ "于收集数据。"
+
 #~ msgid "group name"
 #~ msgstr "群名称"
index b87e114..367f567 100644 (file)
@@ -22,6 +22,9 @@ msgstr ""
 msgid "Add notification command"
 msgstr ""
 
+msgid "Aggregate number of connected users"
+msgstr ""
+
 msgid "Base Directory"
 msgstr ""
 
@@ -55,9 +58,6 @@ msgstr ""
 msgid "CollectTopology"
 msgstr ""
 
-msgid "Collectd"
-msgstr ""
-
 msgid "Collectd Settings"
 msgstr ""
 
@@ -121,6 +121,12 @@ msgstr ""
 msgid "Enable this plugin"
 msgstr ""
 
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
 msgid "Exec"
 msgstr ""
 
@@ -139,6 +145,15 @@ msgstr ""
 msgid "Forwarding between listen and server addresses"
 msgstr ""
 
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
 msgid "Graphs"
 msgstr ""
 
@@ -161,6 +176,9 @@ msgid ""
 "are selected."
 msgstr ""
 
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -224,6 +242,9 @@ msgstr ""
 msgid "Monitor all local listen ports"
 msgstr ""
 
+msgid "Monitor all sensors"
+msgstr ""
+
 msgid "Monitor devices"
 msgstr ""
 
@@ -287,6 +308,15 @@ msgstr ""
 msgid "Only create average RRAs"
 msgstr ""
 
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
 msgid "Options"
 msgstr ""
 
@@ -344,12 +374,24 @@ msgstr ""
 msgid "Seconds"
 msgstr ""
 
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
 msgid "Server host"
 msgstr ""
 
 msgid "Server port"
 msgstr ""
 
+msgid "Setup"
+msgstr ""
+
 msgid "Shaping class monitoring"
 msgstr ""
 
@@ -398,9 +440,6 @@ msgstr ""
 msgid "System Load"
 msgstr ""
 
-msgid "System plugins"
-msgstr ""
-
 msgid "TCP Connections"
 msgstr ""
 
@@ -425,6 +464,11 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
 "The conntrack plugin collects statistics about the number of tracked "
 "connections."
 msgstr ""
@@ -459,6 +503,9 @@ msgid ""
 "be used in other ways as well."
 msgstr ""
 
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
 msgid ""
 "The exec plugin starts external commands to read values from or to notify "
 "external processes when certain threshold values have been reached."
@@ -519,14 +566,19 @@ msgid ""
 msgstr ""
 
 msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
 "The splash leases plugin uses libuci to collect statistics about splash "
 "leases."
 msgstr ""
 
 msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
 msgstr ""
 
 msgid ""
@@ -575,6 +627,9 @@ msgstr ""
 msgid "Uptime Plugin Configuration"
 msgstr ""
 
+msgid "Use improved naming schema"
+msgstr ""
+
 msgid "Used PID file"
 msgstr ""
 
@@ -590,6 +645,10 @@ msgstr ""
 msgid "Wireless iwinfo Plugin Configuration"
 msgstr ""
 
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
 msgid "e.g. br-ff"
 msgstr ""
 
index abcee3e..de16f29 100644 (file)
@@ -140,6 +140,9 @@ config statistics 'collectd_processes'
        option enable '0'
        option Processes 'uhttpd dnsmasq dropbear'
 
+config statistics 'collectd_sensors'
+       option enable '0'
+
 config statistics 'collectd_splash_leases'
        option enable '0'
 
index 8acae46..49d8a09 100755 (executable)
@@ -187,9 +187,9 @@ function _list_expand( c, l, nopad )
                        end
 
                        if n:find("(%w+)ses") then
-                               k = n:gsub("(%w+)ses", "%1s")
+                               k = n:gsub("(%w+)ses$", "%1s")
                        else
-                               k = n:gsub("(%w+)s", "%1")
+                               k = n:gsub("(%w+)s$", "%1")
                        end
 
                        str = str .. _expand( c[n], k, nopad )
@@ -375,6 +375,12 @@ plugins = {
                { }
        },
 
+       openvpn = {
+               { },
+               { "CollectIndividualUsers", "CollectUserCount", "CollectCompression", "ImprovedNamingSchema" },
+               { "StatusFile" }
+       },
+
        ping    = {
                { "TTL", "Interval" },
                { },
@@ -393,6 +399,12 @@ plugins = {
                { "RRATimespans" }
        },
 
+       sensors = {
+               { },
+               { "IgnoreSelected" },
+               { "Sensor" }
+       },
+
         splash_leases = {
           { },
           { },
index 19bdd9a..11f34fb 100644 (file)
@@ -227,7 +227,7 @@ ta = s:option(Value, "target", translate("Target host"),
 
 ta.rmempty = true
 ta.placeholder = "0.0.0.0/0"
-ta.datatype = "host"
+ta.datatype = "host(1)"
 
 
 v = s:option(Value, "via", translate("Via proxy"),
@@ -235,5 +235,6 @@ v = s:option(Value, "via", translate("Via proxy"),
 
 v:depends({type="proxy"})
 v.placeholder = "10.0.0.1:8080"
+v.datatype = "ip4addrport"
 
 return m
index c85a206..d43a887 100644 (file)
@@ -41,7 +41,7 @@ end
 <%+header%>
 
 <div class="cbi-map">
-       <h2><a id="content" name="content"><%:Tinyproxy Status%></a></h2>
+       <h2 name="content"><%:Tinyproxy Status%></h2>
        <div class="cbi-section">
                <iframe src="<%=REQUESTURL%>?frame=1" style="width:100%; height:350px; border:none"></iframe>
        </div>
index 790bf29..c60b7c4 100644 (file)
@@ -11,11 +11,11 @@ function index()
 
        local page
 
-       page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPNP"))
+       page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPnP"))
        page.dependent = true
 
        entry({"admin", "services", "upnp", "status"}, call("act_status")).leaf = true
-       entry({"admin", "services", "upnp", "delete"}, call("act_delete")).leaf = true
+       entry({"admin", "services", "upnp", "delete"}, post("act_delete")).leaf = true
 end
 
 function act_status()
index d50ed0c..e358dcd 100644 (file)
@@ -1,6 +1,6 @@
 <script type="text/javascript">//<![CDATA[
        function upnp_delete_fwd(idx) {
-               XHR.get('<%=luci.dispatcher.build_url("admin", "services", "upnp", "delete")%>/' + idx, null,
+               (new XHR()).post('<%=url('admin/services/upnp/delete')%>/' + idx, { token: '<%=token%>' },
                        function(x)
                        {
                                var tb = document.getElementById('upnp_status_table');
@@ -10,7 +10,7 @@
                );
        }
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "upnp", "status")%>', null,
+       XHR.poll(5, '<%=url('admin/services/upnp/status')%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('upnp_status_table');
index 3176bb5..bb9f88f 100644 (file)
@@ -124,8 +124,8 @@ msgstr "Inicia el servei UPnP i NAP-PMP"
 msgid "There are no active redirects."
 msgstr "No hi ha redireccions actives."
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index a712f82..3cefdcc 100644 (file)
@@ -120,8 +120,8 @@ msgstr "Spustit službu UPnP a NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Nejsou zde žádná aktivní přesměrování"
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index 2edd93c..fe6532d 100644 (file)
@@ -122,7 +122,7 @@ msgstr "UPnP und NAT-PMP Dienst starten"
 msgid "There are no active redirects."
 msgstr "Es gibt keine aktiven Weiterleitungen."
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index 775a7f7..8b4fa0c 100644 (file)
@@ -119,7 +119,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 72d21ba..215b34c 100644 (file)
@@ -119,7 +119,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 79a2800..91e1393 100644 (file)
@@ -122,7 +122,7 @@ msgstr "Arrancar servicio UPnP y NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Sin redirecciones activas."
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index 0cdb86d..4390d0f 100644 (file)
@@ -125,8 +125,8 @@ msgstr "Démarrer les services UPnP et NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Il n'y a pas de redirections actives."
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index d673550..6e4d1f1 100644 (file)
@@ -115,7 +115,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index e4c5e12..c5a2c26 100644 (file)
@@ -122,8 +122,8 @@ msgstr "UPnP és NAT-PMP szolgáltatás elindítása"
 msgid "There are no active redirects."
 msgstr "Nincsenek aktív átírányítások."
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index a8ef2e9..9ef09ea 100644 (file)
@@ -122,8 +122,8 @@ msgstr "Avvia il servizo UPnP e NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Non ci sono mappature attive."
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index 79e2153..ec9208d 100644 (file)
@@ -122,7 +122,7 @@ msgstr "UPnP及びNAT-PMPサービスを開始する"
 msgid "There are no active redirects."
 msgstr "有効なリダイレクトはありません。"
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index c3e7184..b4dce32 100644 (file)
@@ -114,7 +114,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 37ff9bf..d528aa5 100644 (file)
@@ -113,7 +113,7 @@ msgstr "Start UPnP og NAT-PMP tjenesten"
 msgid "There are no active redirects."
 msgstr "Det finnes ingen aktive viderekoblinger"
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index e891dce..ab78180 100644 (file)
@@ -121,7 +121,7 @@ msgstr "Uruchom usługi UPnP i NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Nie ma aktywnych przekierowań"
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index ae9e7fe..c16aa11 100644 (file)
@@ -123,7 +123,7 @@ msgstr "Dispare os serviços de UPnP e NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Não existe redirecionamentos ativos."
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 "<abbr title=\"Universal Plug and Play, Plugue e Use Universal\">UPnP</abbr>"
 
index 91c94f3..1d001b6 100644 (file)
@@ -119,7 +119,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 84f5158..f9c9500 100644 (file)
@@ -121,8 +121,8 @@ msgstr "Porneste UPnP si serviciul NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Nu exista redirecturi active."
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index 626672b..30b94ce 100644 (file)
@@ -124,7 +124,7 @@ msgstr "Запустить службы UPnP и NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Активные переадресации отсутствуют."
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index 5763163..c725333 100644 (file)
@@ -115,7 +115,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 11c20c1..f0b564b 100644 (file)
@@ -116,7 +116,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 86aaee3..ae390c4 100644 (file)
@@ -108,7 +108,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index bf0e59a..cff3be2 100644 (file)
@@ -115,7 +115,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 7646109..93afd22 100644 (file)
@@ -122,7 +122,7 @@ msgstr "Запускати служби UPnP та NAT-PMP"
 msgid "There are no active redirects."
 msgstr "Немає активних переспрямувань"
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPnP"
 
 msgid ""
index 7c7ea9d..5f95499 100644 (file)
@@ -120,7 +120,7 @@ msgstr ""
 msgid "There are no active redirects."
 msgstr ""
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr ""
 
 msgid ""
index 1749b9e..693bbc1 100644 (file)
@@ -120,8 +120,8 @@ msgstr "启动UPnP与NAT-PMP服务"
 msgid "There are no active redirects."
 msgstr "没有活动的重定向"
 
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
 
 msgid ""
 "UPnP allows clients in the local network to automatically configure the "
index 356801b..dde94ae 100644 (file)
@@ -118,7 +118,7 @@ msgstr "啓用UPnP跟NAT-PMP服務"
 msgid "There are no active redirects."
 msgstr "目前無作用中的從導"
 
-msgid "UPNP"
+msgid "UPnP"
 msgstr "UPNP通用序列埠協定"
 
 msgid ""
index 2b50255..2b8d9ff 100644 (file)
@@ -56,7 +56,7 @@ dbdir = dbdir or "/var/lib/vnstat"
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:VnStat Graphs%></a></h2>
+<h2 name="content"><%:VnStat Graphs%></h2>
 
 <form action="" method="get">
 
index 3641bdd..32c476c 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Voice Software (Core)
-LUCI_DEPENDS:=
+LUCI_DEPENDS:=@BROKEN
 
 include ../../luci.mk
 
index a3503f8..e14862e 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content">Voice</a></h2>
+<h2 name="content">Voice</h2>
 <p>Here you can control OpenWRT voice-related settings and see
   voice-related information from OpenWRT</p>
 <p>In particular Asterisk configuration and information is displayed
index e3e88b3..c4466cb 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content">Phones</a></h2>
+<h2 name="content">Phones</h2>
 <p>Here you can control phone configuration and information in OpenWRT</p>
 <p>You can control the setup of phone clients and servers and see
   information such as diagnostics related to phone devices from this menu.
index c9c9a20..2d47918 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Voice Software (Diagnostics)
-LUCI_DEPENDS:=+luci-app-diag-devinfo
+LUCI_DEPENDS:=+luci-app-diag-devinfo @BROKEN
 
 include ../../luci.mk
 
index 15ccc39..e324fab 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
 <p><%:Under this menu are options that allow you to configure and perform tests on the voice operations of your system.  These are known as diagnostics.%></p>
 <p><%:The diagnostics available on your device depend on the modules that you have installed.%></p>
 <%+footer%>
index 883416b..f64370b 100644 (file)
@@ -38,7 +38,7 @@ period = s:option(Value, "period",
 pinghost = s:option(Value, "pinghosts", 
                    translate("Ping host"),
                    translate("Host address to ping"))
-pinghost.datatype = "host"
+pinghost.datatype = "host(1)"
 pinghost.default = "8.8.8.8"
 pinghost:depends({mode="ping"})
 
index b85651a..84c5ce1 100644 (file)
@@ -10,40 +10,40 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgid "Downlink"
-msgstr ""
+msgstr "Ner-länk"
 
 msgid "Downstream bandwidth in kbit/s"
-msgstr ""
+msgstr "Nerströms bandbredd i kbit/s"
 
 msgid "Host or Network in CIDR notation."
 msgstr ""
 
 msgid "Interface"
-msgstr ""
+msgstr "Gränssnitt"
 
 msgid "Low priority destination ports"
-msgstr ""
+msgstr "Destinations-portar med låg prioritet"
 
 msgid "Low priority hosts (Destination)"
-msgstr ""
+msgstr "Värdar med låg prioritet (Destination)"
 
 msgid "Low priority hosts (Source)"
-msgstr ""
+msgstr "Värdar med låg prioritet (Källa)"
 
 msgid "Low priority source ports"
-msgstr ""
+msgstr "Käll-portar med låg prioritet"
 
 msgid "Uplink"
-msgstr ""
+msgstr "Upplänk"
 
 msgid "Upstream bandwidth in kbit/s"
-msgstr ""
+msgstr "Bandbredd uppströms i kbit/s"
 
 msgid "Wondershaper"
-msgstr ""
+msgstr "Wondershaper"
 
 msgid "Wondershaper settings"
-msgstr ""
+msgstr "Inställningar för Wondershaper"
 
 msgid ""
 "Wondershaper shapes traffic to ensure low latencies for interactive traffic "
diff --git a/contrib/package/community-profiles/files/etc/config/profile_bno b/contrib/package/community-profiles/files/etc/config/profile_bno
deleted file mode 100644 (file)
index 2d0f0f5..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-config 'community' 'profile'
-       option 'name' 'Berlin NordOst'
-       option 'homepage' 'http://www.freifunk-bno.de/'
-       option 'ssid' 'olsr.freifunk.net'
-       option 'mesh_network' '104.0.0.0/8'
-       option 'splash_network' '10.104.0.0/16'
-       option 'splash_prefix' '27'
-       option 'latitude' '52.55010'
-       option 'longitude' '13.45889'
-       option 'suffix' 'olsr'
-        list 'owm_api' 'http://api.openwifimap.net'
-        list 'owm_api' 'http://owmapi.pberg.freifunk.net'
-        option 'mapserver' 'http://map.pberg.freifunk.net/'
-
-config 'defaults' 'wifi_device'
-       option 'channel' '10'
-
-config 'defaults' 'interface'
-       option 'netmask' '255.0.0.0'
-
-config 'defaults' 'olsr_interface'
-       option 'Ip4Broadcast' '255.255.255.255'
-       option 'HelloInterval' '3.0'
-       option 'HelloValidityTime' '125.0'
-       option 'TcInterval'  '2.0'
-       option 'TcValidityTime' '500.0'
-       option 'MidInterval' '25.0'
-       option 'MidValidityTime'  '500.0'
-       option 'HnaInterval' '10.0'
-       option 'HnaValidityTime' '125.0'
-
-config 'defaults' 'olsrd'
-       option 'AllowNoInt' 'yes'
-       option 'FIBMetric' 'flat'
-       option 'Pollrate' '0.025'
-       option 'TcRedundancy' '2'
-       option 'NatThreshold' '0.75'
-       option 'LinkQualityAlgorithm' 'etx_ff'
diff --git a/contrib/package/community-profiles/files/etc/config/profile_cottbus b/contrib/package/community-profiles/files/etc/config/profile_cottbus
new file mode 100644 (file)
index 0000000..143c505
--- /dev/null
@@ -0,0 +1,37 @@
+config 'community' 'profile'
+       option 'name' 'Freifunk Cottbus'
+       option 'homepage' 'http://cottbus.freifunk.net'
+       option 'ssid' 'cottbus.freifunk.net'
+       option 'ssid_scheme' 'ssidonly'
+       option 'mesh_network' '10.35.0.0/16'
+       option 'splash_network' '10.104.0.0/16'
+       option 'splash_prefix' '27'
+       option 'latitude' '51.757689'
+       option 'longitude' '13.40948'   
+config 'defaults' 'wifi_device'
+       option 'channel' '13'
+config 'defaults' 'wifi_device_5'
+       option 'channel' '36'
+
+config 'defaults' 'wifi_iface'
+       option 'mcast_rate' '6000'
+
+config 'defaults' 'wifi_iface_5'
+       option 'mcast_rate' '12000'
+
+config 'defaults' 'bssidscheme'
+       option '13'     'D2:CA:FF:EE:BA:BE'
+       option '36'     '02:36:CA:FF:EE:EE'
+config 'defaults' 'ssidscheme'
+       option '13'     'intern-ch13.cottbus.freifunk.net'
+       option '36'     'intern-ch36.cottbus.freifunk.net'
+config 'defaults' 'interface'
+       option 'netmask' '255.255.255.255'
+       option 'dns' '85.214.20.141 213.73.91.35 194.150.168.168 2001:4ce8::53 2001:910:800::12'
+config 'dhcp' 'dhcp'
+       option 'leasetime' '5m'
index cf43424..b1dc01a 100755 (executable)
@@ -2,9 +2,69 @@
 
 . /usr/share/libubox/jshn.sh
 
-VARS="localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ neighborLinkQuality:NLQ linkCost:Cost"
+hostsfile_getname()
+{
+       local config="$1"
+       local i=0
+       local value file
 
-for HOST in 127.0.0.1 ::1;do
+       while value="$( uci -q get $config.@LoadPlugin[$i].library )"; do {
+               case "$value" in
+                       'olsrd_nameservice.so.'*)
+                               file="$( uci -q get $config.@LoadPlugin[$i].hosts_file )"
+                               break
+                       ;;
+               esac
+
+               i=$(( i + 1 ))
+       } done
+
+       echo "${file:-/var/run/hosts_olsr}"
+}
+
+read_hostnames()
+{
+       local file_list=" $( hostsfile_getname 'olsrd' ) $(hostsfile_getname 'olsrd6' ) "
+       local line ip hostname file file_list_uniq
+
+       for file in $file_list; do {
+               case " $file_list_uniq " in
+                       *" $file "*)
+                       ;;
+                       *)
+                               file_list_uniq="$file_list_uniq $file"
+                       ;;
+               esac
+       } done
+
+       for file in $file_list_uniq; do {
+               [ -e "$file" ] || continue
+
+               while read -r line; do {
+                       case "$line" in
+                               [0-9]*)
+                                       # 2001:bf7:820:901::1 stuttgarter-core.olsr   # myself
+                                       # 10.63.160.161  AlexLaterne    # 10.63.160.161
+                                       set -f
+                                       set +f -- $line
+                                       ip="$1"
+                                       hostname="$2"
+
+                                       # global vars, e.g.
+                                       # IP_1_2_3_4='foo' or IP_2001_bf7_820_901__1='bar'
+                                       eval IP_${ip//[.:]/_}="$hostname"
+                               ;;
+                       esac
+               } done <"$file"
+       } done
+}
+
+read_hostnames
+
+VARS='localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ'
+VARS="$VARS neighborLinkQuality:NLQ linkCost:Cost remoteHostname:Host"
+
+for HOST in '127.0.0.1' '::1';do
        json_init
        json_load "$(echo /links|nc ${HOST} 9090)"
        if json_is_a links array;then
@@ -29,6 +89,7 @@ for HOST in 127.0.0.1 ::1;do
                                ;;*)
                                        for v in ${VARS};do
                                                eval printf \"%-\${_${v%:*}}s \" \$${v%:*}
+                                               eval remoteHostname="\$IP_${remoteIP//[.:]/_}"
                                        done
                                        echo
                                ;;esac
diff --git a/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting b/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting
deleted file mode 120000 (symlink)
index 3c3dad8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../init.d/freifunk-policyrouting
\ No newline at end of file
index 0b47c22..4ebc08a 100644 (file)
-CBI models are Lua files describing the structure of an UCI config file and the resulting HTML form to be evaluated by the CBI parser.
-All CBI model files must return an object of type *luci.cbi.Map*. For a commented example of a CBI model, see the [[Documentation/ModulesHowTo#CBImodels|Writing Modules tutorial]].
 
-The scope of a CBI model file is automatically extended by the contents of the module *luci.cbi_' and the '_translate* function from luci.i18n
+# CBI models
+are Lua files describing the structure of an UCI config file and the resulting HTML form to be evaluated by the CBI parser.<br />
+All CBI model files must return an object of type **luci.cbi.Map**.<br />
+For a commented example of a CBI model, see the [Writing Modules tutorial](ModulesHowTo.md#cbimodels).
 
-This Reference covers *the basics* of the CBI system.
+The scope of a CBI model file is automatically extended by the contents of the module **luci.cbi** and the _translate_ function from **luci.i18n**
 
+This Reference covers **the basics** of the CBI system.
 
 
-# class Map (_config'', ''title'', ''description_)
+## class Map (_config, title, description_)
 This is the root object of the model.
-* *config*: configuration name to be mapped, see uci documentation and the files in /etc/config
-* *title*: title shown in the UI
-* *description*: description shown in the UI
 
-## :section (_sectionclass_, ...)
+* **config:** configuration filename to be mapped, see [UCI documentation](http://wiki.openwrt.org/doc/uci) and the files in /etc/config
+* **title:** title shown in the UI
+* **description:** description shown in the UI
+
+#### function :section (_sectionclass_, ...)
 Creates a new section
-* *sectionclass*: a class object of the section
+* **sectionclass**: a class object of the section
 * _additional parameters passed to the constructor of the section class_
 
 ----
 
-# class NamedSection (_name'', ''type'', ''title'', ''description_)
-An object describing an UCI section selected by the name.
-Use [[#A.3Asection.28.27.27sectionclass.27.27.2C....29|Map:section(NamedSection, _name'', ''type'', ''title'', ''description_)]] to instantiate.
-* *name*: section name
-* *type*: section type
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+## class NamedSection (_name, type, title, description_)
+An object describing an UCI section selected by the name.<br />
+To instantiate use: `Map:section(NamedSection, "name", "type", "title", "description")`
 
-## .addremove = false
-Allows the user to remove and recreate the configuration section
+* **name:** UCI section name
+* **type:** UCI section type
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :option(_optionclass_, ...)
+Creates a new option
+* **optionclass:** a class object of the section
+* _additional parameters passed to the constructor of the option class_
+
+#### property .addremove = false
+Allows the user to remove and recreate the configuration section.
 
-## .dynamic = false
+#### property .dynamic = false
 Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
 
-## .optional = true
+#### property .optional = true
 Parse optional options
 
+----
+
+## class TypedSection (_type, title, description_)
+An object describing a group of UCI sections selected by their type.<br />
+To instantiate use: `Map:section(TypedSection, "type", "title", "description")`
+* **type:** UCI section type
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-## :option (_optionclass_, ...)
+#### function :option(_optionclass_, ...)
 Creates a new option
-* *optionclass*: a class object of the section
-* _additional parameters passed to the constructor of the option class_
+ **optionclass:** a class object of the section
+ _additional parameters passed to the constructor of the option class_
 
-----
+#### function :depends(_key, value_)
+Only select those sections where _key == value_ <br />
+If you call this function several times the dependencies will be linked with **"or"**
 
-# class TypedSection (_type'', ''title'', ''description_)
-An object describing a group of UCI sections selected by their type.
-Use [[#A.3Asection.28.27.27sectionclass.27.27.2C....29|Map:section(TypedSection, _type'', ''title'', ''description_)]] to instantiate.
-* *type*: section type
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+#### function .filter(_self, section_) -abstract-
+You can override this function to filter certain sections that will not be parsed.
+The filter function will be called for every section that should be parsed and returns **nil** for sections that should be filtered. For all other sections it should return the section name as given in the second parameter.
 
-## .addremove = false
+#### property .addremove = false
 Allows the user to remove and recreate the configuration section
 
-## .dynamic = false
+#### property .dynamic = false
 Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
 
-## .optional = true
+#### property .optional = true
 Parse optional options
 
-## .anonymous = false
-Do not show section names
-
+#### property .anonymous = false
+Do not show UCI section names
 
-## :depends (_key'', ''value_)
-Only select those sections where the option _key'' == ''value_<br />
-If you call this function several times the dependencies will be linked with *or*
-
-## .filter (_self'', ''section_) [abstract]
-You can override this function to filter certain sections that will not be parsed.
-The filter function will be called for every section that should be parsed and returns *nil* for sections that should be filtered. For all other sections it should return the section name as given in the second parameter.
+----
 
-## :option (_optionclass_, ...)
-Creates a new option
- _optionclass_: a class object of the section
- additional parameters passed to the constructor of the option class
+## class Value (_option, title, description_)
+An object describing an option in a section of a UCI File. Creates a standard text field in the formular.<br />
+To instantiate use: `NamedSection:option(Value, "option", "title", "description")`<br />
+ or `TypedSection:option(Value, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-----
+#### function :depends(key, value)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
 
-# class Value (_option'', ''title'', ''description_)
-An object describing an option in a section of a UCI File. Creates a standard text field in the formular.
-Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate.
-* *option*: section name
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+#### function :value(key, value)
+Convert this text field into a combobox if possible and add a selection option.
 
-## .default = nil
+#### property .default = nil
 The default value
 
-## .maxlength = nil
-The maximum length of the value
+#### property .maxlength = nil
+The maximum inputlength (of chars) of the value
 
-## .optional = false
+#### property .optional = false
 Marks this option as optional, implies .rmempty = true
 
-## .rmempty = true
+#### property .rmempty = true
 Removes this option from the configuration file when the user enters an empty value
 
-## .size = nil
-The size of the form field
-
-## :value (_key'', ''value'' = ''key_)
-Convert this text field into a combobox if possible and add a selection option.
+#### property .size = nil
+The maximum number of chars displayed by form field
 
+----
 
-## :depends (_key'', ''value_)
-Only show this option field if another option _key'' is set to ''value_ in the same section.<br />
-If you call this function several times the dependencies will be linked with *or*
+## class ListValue (_option, title, description_)
+An object describing an option in a section of a UCI File.<br />
+Creates a list box or list of radio (for selecting one of many choices) in the formular.<br />
+To instantiate use: `NamedSection:option(ListValue, "option", "title", "description")`<br />
+or `TypedSection:option(ListValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-----
+#### function :depends(key, value)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
 
-# class ListValue (_option'', ''title'', ''description_)
-An object describing an option in a section of a UCI File. Creates a list box in the formular.
-Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate.
-* *option*: section name
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+#### function :value(_key, value_)
+Adds an entry to the selection list
 
+#### property .widget = "select"
+**"select"** shows a selction list, **"radio"** shows a list of radio buttons inside form
 
-## .default = nil
+#### property .default = nil
 The default value
 
-## .optional = false
+#### property .optional = false
 Marks this option as optional, implies .rmempty = true
 
-## .rmempty = true
+#### property .rmempty = true
 Removes this option from the configuration file when the user enters an empty value
 
-## .size = nil
+#### property .size = nil
 The size of the form field
 
-## .widget = "select"
-selects the form widget to be used
-
-
-## :depends (_key'', ''value_)
-Only show this option field if another option _key'' is set to ''value_ in the same section.<br />
-If you call this function several times the dependencies will be linked with *or*
-
-## :value (_key'', ''value'' = ''key_)
-Adds an entry to the selection list
-
 ----
 
-# class Flag (_option'', ''title'', ''description_)
-An object describing an option with two possible values in a section of a UCI File. Creates a checkbox field in the formular.
-Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate.
-* *option*: section name
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+## class Flag (_option, title, description_)
+An object describing an option with two possible values in a section of a UCI File.<br />
+Creates a checkbox field in the formular.<br />
+To instantiate use: `NamedSection:option(Flag, "option", ""title", "description")`<br />
+ or `TypedSection:option(Flag, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-## .default = nil
+#### function :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### property .default = nil
 The default value
 
-## .disabled = 0
+#### property .disabled = 0
 the value that shoudl be set if the checkbox is unchecked
 
-## .enabled = 1
+#### property .enabled = 1
 the value that should be set if the checkbox is checked
 
-## .optional = false
+#### property .optional = false
 Marks this option as optional, implies .rmempty = true
 
-## .rmempty = true
+#### property .rmempty = true
 Removes this option from the configuration file when the user enters an empty value
 
-## .size = nil
-The size of the form field
+----
 
+## class MultiValue (_option'', ''title'', ''description_)
+An object describing an option in a section of a UCI File.<br />
+Creates a list of checkboxed or a multiselectable list as form fields.<br />
+To instantiate use: `NamedSection:option(MultiValue, "option", ""title", "description")`<br />
+ or `TypedSection:option(MultiValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-## :depends (_key'', ''value_)
-Only show this option field if another option _key'' is set to ''value_ in the same section.<br />
-If you call this function several times the dependencies will be linked with *or*
+#### function :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
 
-----
+#### function :value(_key, value_)
+Adds an entry to the list
 
-# class MultiValue (_option'', ''title'', ''description_)
-An object describing an option in a section of a UCI File. Creates several checkboxed as form fields.
-Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate.
-* *option*: section name
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+#### property .widget = "checkbox"
+**"select"** shows a selction list, **"checkbox"** shows a list of checkboxes inside form
 
+#### property .delimiter = " "
+The string which will be used to delimit the values inside stored option
 
-## .default = nil
+#### property .default = nil
 The default value
 
-## .delimiter = " "
-The string which will be used to delimit the values
-
-## .optional = false
+#### property .optional = false
 Marks this option as optional, implies .rmempty = true
 
-## .rmempty = true
+#### property .rmempty = true
 Removes this option from the configuration file when the user enters an empty value
 
-## .size = nil
-The size of the form field
+#### property .size = nil
+The size of the form field (only used if property _.widget = "select"_)
 
-## .widget = "checkbox"
-selects the form widget to be used
-
-
-## :depends (_key'', ''value_)
-Only show this option field if another option _key'' is set to ''value_ in the same section.<br />
-If you call this function several times the dependencies will be linked with *or*
+----
 
-## :value (_key'', ''value'' = ''key_)
-Adds an entry to the checkbox list
+## class StaticList (_option, title, description_)
+Similar to the MultiValue, but stores selected Values into a UCI list instead of a character-separated option.
 
 ----
 
-# class DummyValue (_option'', ''title'', ''description_)
-An object describing an option in a section of a UCI File. Creates a readonly field in the form.
-Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate.
-* *option*: section name
-* *title*: The title shown in the UI
-* *description*: description shown in the UI
+## class DynamicList (_option, title, description_)
+A extensible list of user-defined values. Stores Values into a UCI list
 
+----
 
+## class DummyValue (_option, title, description_)
+Creates a readonly text in the form. !It writes no data to UCI!<br />
+To instantiate use: `NamedSection:option(DummyValue, "option", ""title", "description")`<br />
+ or `TypedSection:option(DummyValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
 
-## :depends (_key'', ''value_)
-Only show this option field if another option _key'' is set to ''value_ in the same section.<br />
-If you call this function several times the dependencies will be linked with *or*
+#### property :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
 
 ----
 
-
-# class TextValue (_option'', ''title'', ''description_)
+## class TextValue (_option, title, description_)
 An object describing a multi-line textbox in a section in a non-UCI form.
 
 ----
 
-# class Button (_option'', ''title'', ''description_)
+## class Button (_option, title, description_)
 An object describing a Button in a section in a non-UCI form.
-
-----
-
-# class StaticList (_option'', ''title'', ''description_)
-Similar to the MultiValue, but stores selected Values into a UCI list instead of a space-separated string.
-
-----
-
-# class DynamicList (_option'', ''title'', ''description_)
-A list of user-defined values.
index 3f70b78..c4dbb98 100644 (file)
@@ -101,7 +101,7 @@ Now type */cgi-bin/luci/my/new/template_' ('_[http://localhost:8080/luci/my/new/
 You may notice those fancy <% %>-Tags, these are [wiki:Documentation/Templates|template markups] used by the LuCI template processor.
 It is always good to include header and footer at the beginning and end of a template as those create the default design and menu.
 
-## CBI models
+## <a name=cbimodels></a> CBI models
 The CBI is one of the uber coolest features of LuCI. It creates a formular based user interface and saves its contents to a specific UCI config file. You only have to describe the structure of the configuration file in a CBI model file and Luci does the rest of the work. This includes generating, parsing and validating a XHTML form and reading and writing the UCI file.
 
 So let's be serious at least for this paragraph and create a real pratical example *_lucidir_/model/cbi/myapp-mymodule/netifaces.lua* with the following contents:
diff --git a/documentation/SubmitPatchesHowTo:.md b/documentation/SubmitPatchesHowTo:.md
deleted file mode 100644 (file)
index cdd1552..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# Checkout svn
-       
-       svn co http://svn.luci.subsignal.org/luci/trunk
-       
-and change to that directory:
-       
-       cd trunk
-       
-# Make your changes
-
-Edit the files you want to change. If you add some new files you need to add them to the svn tree:
-       
-       svn add <dir/files>
-       
-Where <dir/files> are the directories/files you have added. Its possible to specify multiple files/directories here.
-
-# Use svn diff to generate a patch with your changes
-
-To check if your changes look ok first do:
-       
-       svn diff <dir/files>
-       
-and check the output. Again you can specify multiple dirs/directories here.
-
-If everything looks like expected save the patch:
-       
-       svn diff <dir/files> > ./mypatch.patch
-       
-
-# Submit patches
-
-Use the [Ticket system](http://luci.subsignal.org/trac/newticket) to submit your patch.
-
index 4c19cf0..e8e145f 100644 (file)
@@ -234,6 +234,13 @@ Put Lua data into the parser.</td>
        </tr>
 
        <tr>
+       <td class="name" nowrap><a href="#parser.sink">parser:sink</a>&nbsp;()</td>
+       <td class="summary">
+Generate an ltn12-compatible sink.</td>
+       </tr>
+
+       <tr>
        <td class="name" nowrap><a href="#parser.stringify">parser:stringify</a>&nbsp;(pretty)</td>
        <td class="summary">
  
@@ -406,6 +413,34 @@ Nothing is returned.
 
 
 
+<dt><a name="parser.sink"></a><strong>parser:sink</strong>&nbsp;()</dt>
+<dd>
+
+Generate an ltn12-compatible sink. 
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new() 
+ltn12.pump.all(ltn12.source.file(io.input()), parser:sink()) 
+print(parser:get())</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a function that can be used as an ltn12 sink.
+
+
+
+</dd>
+
+
+
+
 <dt><a name="parser.stringify"></a><strong>parser:stringify</strong>&nbsp;(pretty)</dt>
 <dd>
 
index 9e50d99..cf75aeb 100644 (file)
@@ -1119,6 +1119,12 @@ Name of created section
 
  
 Set a value or create a named section. 
+When invoked with three arguments <code>config</code>, <code>sectionname</code>, <code>sectiontype</code>, 
+then a named section of the given type is created. 
+When invoked with four arguments <code>config</code>, <code>sectionname</code>, <code>optionname</code> and 
+<code>optionvalue</code> then the value of the specified option is set to the given value. 
 
 
 
@@ -1138,7 +1144,7 @@ Set a value or create a named section.
        </li>
        
        <li>
-         value: UCI value or nil if you want to create a section
+         value: UCI value or nothing if you want to create a section
        </li>
        
 </ul>
index b857c97..ef11101 100644 (file)
@@ -328,6 +328,76 @@ static int json_parse_set(lua_State *L)
        return 0;
 }
 
+static int json_parse_sink_closure(lua_State *L)
+{
+       bool finished = lua_toboolean(L, lua_upvalueindex(2));
+       if (lua_isnil(L, 1))
+       {
+               // no more data available
+               if (finished)
+               {
+                       // we were finished parsing
+                       lua_pushboolean(L, true);
+                       return 1;
+               }
+               else
+               {
+                       lua_pushnil(L);
+                       lua_pushstring(L, "Incomplete JSON data");
+                       return 2;
+               }
+       }
+       else
+       {
+               if (finished)
+               {
+                       lua_pushnil(L);
+                       lua_pushstring(L, "Unexpected data after complete JSON object");
+                       return 2;
+               }
+               else
+               {
+                       // luci.jsonc.parser.chunk()
+                       lua_pushcfunction(L, json_parse_chunk);
+                       // parser object from closure
+                       lua_pushvalue(L, lua_upvalueindex(1));
+                       // chunk
+                       lua_pushvalue(L, 1);
+                       lua_call(L, 2, 2);
+
+                       if (lua_isnil(L, -2))
+                       {
+                               // an error occurred, leave (nil, errmsg) on the stack and return it
+                               return 2;
+                       }
+                       else if (lua_toboolean(L, -2))
+                       {
+                               // finished reading, set finished=true and return nil to prevent further input
+                               lua_pop(L, 2);
+                               lua_pushboolean(L, true);
+                               lua_replace(L, lua_upvalueindex(2));
+                               lua_pushnil(L);
+                               return 1;
+                       }
+                       else
+                       {
+                               // not finished reading, return true
+                               lua_pop(L, 2);
+                               lua_pushboolean(L, true);
+                               return 1;
+                       }
+               }
+       }
+}
+
+static int json_parse_sink(lua_State *L)
+{
+       luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
+       lua_pushboolean(L, false);
+       lua_pushcclosure(L, json_parse_sink_closure, 2);
+       return 1;
+}
+
 static int json_tostring(lua_State *L)
 {
        struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
@@ -367,6 +437,7 @@ static const luaL_reg jsonc_parser_methods[] = {
        { "parse",                      json_parse_chunk  },
        { "get",                        json_parse_get    },
        { "set",                        json_parse_set    },
+       { "sink",                       json_parse_sink   },
        { "stringify",          json_tostring     },
 
        { "__gc",                       json_gc           },
index 2ee9ceb..720b17d 100644 (file)
@@ -121,10 +121,22 @@ parser:set({ "some", "data" })`
 ]]
 
 ---[[
-Serialize current parser state as JSON.
+Generate an ltn12-compatible sink.
 
 @class function
 @sort 4
+@name parser.sink
+@return Returns a function that can be used as an ltn12 sink.
+@usage `parser = luci.jsonc.new()
+ltn12.pump.all(ltn12.source.file(io.input()), parser:sink())
+print(parser:get())`
+]]
+
+---[[
+Serialize current parser state as JSON.
+
+@class function
+@sort 5
 @name parser.stringify
 @param pretty A boolean value indicating whether the resulting JSON should be pretty printed.
 @return Returns the serialized JSON data of this parser instance.
diff --git a/luci.mk b/luci.mk
index d77c09e..1e56edd 100644 (file)
--- a/luci.mk
+++ b/luci.mk
@@ -30,7 +30,7 @@ LUCI_LANG.pt-br=Português do Brasil (Brazialian Portuguese)
 LUCI_LANG.pt=Português (Portuguese)
 LUCI_LANG.ro=Română (Romanian)
 LUCI_LANG.ru=Русский (Russian)
-LUCI_LANG.sk=Slovenčina (Slovene)
+LUCI_LANG.sk=Slovenčina (Slovak)
 LUCI_LANG.sv=Svenska (Swedish)
 LUCI_LANG.tr=Türkçe (Turkish)
 LUCI_LANG.uk=украї́нська (Ukrainian)
index 80bbda1..a9c5e71 100644 (file)
@@ -12,7 +12,7 @@ LUCI_TYPE:=mod
 LUCI_BASENAME:=base
 
 LUCI_TITLE:=LuCI core libraries
-LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd
+LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc
 
 PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
 PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files
@@ -22,6 +22,10 @@ HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/LuaSrcDiet-0.12.1
 
 include $(INCLUDE_DIR)/host-build.mk
 
+define Package/luci-base/conffiles
+/etc/luci-uploads
+endef
+
 include ../../luci.mk
 
 define Host/Configure
index 5e31bf2..1c4123b 100644 (file)
@@ -139,10 +139,11 @@ var cbi_validators = {
                return (this.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null);
        },
 
-       'host': function()
+       'host': function(ipv4only)
        {
                return cbi_validators.hostname.apply(this) ||
-                       cbi_validators.ipaddr.apply(this);
+                       ((ipv4only != 1) && cbi_validators.ipaddr.apply(this)) ||
+                       ((ipv4only == 1) && cb_validators.ip4addr.apply(this));
        },
 
        'hostname': function()
@@ -161,6 +162,49 @@ var cbi_validators = {
                        cbi_validators.host.apply(this);
        },
 
+       'hostport': function(ipv4only)
+       {
+               var hp = this.split(/:/);
+
+               if (hp.length == 2)
+                       return (cbi_validators.host.apply(hp[0], ipv4only) &&
+                               cbi_validators.port.apply(hp[1]));
+
+               return false;
+       },
+
+       'ip4addrport': function()
+       {
+               var hp = this.split(/:/);
+
+               if (hp.length == 2)
+                       return (cbi_validators.ipaddr.apply(hp[0]) &&
+                               cbi_validators.port.apply(hp[1]));
+               return false;
+       },
+
+       'ipaddrport': function(bracket)
+       {
+               if (this.match(/^([^\[\]:]+):([^:]+)$/)) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip4addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+                } else if ((bracket == 1) && (this.match(/^\[(.+)\]:([^:]+)$/))) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip6addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+                } else if ((bracket != 1) && (this.match(/^([^\[\]]+):([^:]+)$/))) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip6addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+               } else {
+                       return false;
+               }
+       },
+
        'wpakey': function()
        {
                var v = this;
@@ -300,6 +344,47 @@ var cbi_validators = {
        'phonedigit': function()
        {
                return (this.match(/^[0-9\*#!\.]+$/) != null);
+       },
+        'timehhmmss': function()
+       {
+               return (this.match(/^[0-6][0-9]:[0-6][0-9]:[0-6][0-9]$/) != null);
+       },
+       'dateyyyymmdd': function()
+       {
+               if (this == null) {
+                       return false;
+               }
+               if (this.match(/^(\d\d\d\d)-(\d\d)-(\d\d)/)) {
+                       var year = RegExp.$1;
+                       var month = RegExp.$2;
+                       var day = RegExp.$2
+
+                       var days_in_month = [ 31, 28, 31, 30, 31, 30, 31, 31, 30 , 31, 30, 31 ];
+                       function is_leap_year(year) {
+                               return ((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0);
+                       }
+                       function get_days_in_month(month, year) {
+                               if ((month == 2) && is_leap_year(year)) {
+                                       return 29;
+                               } else {
+                                       return days_in_month[month];
+                               }
+                       }
+                       /* Firewall rules in the past don't make sense */
+                       if (year < 2015) {
+                               return false;
+                       }
+                       if ((month <= 0) || (month > 12)) {
+                               return false;
+                       }
+                       if ((day <= 0) || (day > get_days_in_month(month, year))) {
+                               return false;
+                       }
+                       return true;
+
+               } else {
+                       return false;
+               }
        }
 };
 
@@ -545,7 +630,7 @@ function cbi_browser_init(id, respath, url, defpath)
        cbi_bind(btn, 'click', cbi_browser_btnclick);
 }
 
-function cbi_dynlist_init(name, respath, datatype, optional, choices)
+function cbi_dynlist_init(name, respath, datatype, optional, url, defpath, choices)
 {
        var input0 = document.getElementsByName(name)[0];
        var prefix = input0.name;
@@ -606,6 +691,11 @@ function cbi_dynlist_init(name, respath, datatype, optional, choices)
 
                        parent.appendChild(t);
                        parent.appendChild(b);
+                       if (datatype == 'file')
+                       {
+                               cbi_browser_init(t.id, respath, url, defpath);
+                       }
+
                        parent.appendChild(document.createElement('br'));
 
                        if (datatype)
@@ -616,13 +706,13 @@ function cbi_dynlist_init(name, respath, datatype, optional, choices)
                        if (choices)
                        {
                                cbi_combobox_init(t.id, choices[0], '', choices[1]);
-                               t.nextSibling.index = i;
+                               b.index = i;
 
-                               cbi_bind(t.nextSibling, 'keydown',  cbi_dynlist_keydown);
-                               cbi_bind(t.nextSibling, 'keypress', cbi_dynlist_keypress);
+                               cbi_bind(b, 'keydown',  cbi_dynlist_keydown);
+                               cbi_bind(b, 'keypress', cbi_dynlist_keypress);
 
                                if (i == focus || -i == focus)
-                                       t.nextSibling.focus();
+                                       b.focus();
                        }
                        else
                        {
@@ -758,20 +848,24 @@ function cbi_dynlist_init(name, respath, datatype, optional, choices)
                ev = ev ? ev : window.event;
 
                var se = ev.target ? ev.target : ev.srcElement;
+               var input = se.previousSibling;
+               while (input && input.name != name) {
+                       input = input.previousSibling;
+               }
 
                if (se.src.indexOf('remove') > -1)
                {
-                       se.previousSibling.value = '';
+                       input.value = '';
 
                        cbi_dynlist_keydown({
-                               target:  se.previousSibling,
+                               target:  input,
                                keyCode: 8
                        });
                }
                else
                {
                        cbi_dynlist_keydown({
-                               target:  se.previousSibling,
+                               target:  input,
                                keyCode: 13
                        });
                }
index 7b02b6e..e06e37c 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif and b/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif differ
index 431ff64..eebe0ff 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif and b/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif differ
index 3b1217d..342a846 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif and b/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif differ
index 4c163bf..7faadec 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/bridge.png and b/modules/luci-base/htdocs/luci-static/resources/icons/bridge.png differ
index 0f367c5..b3e620b 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png differ
index 41d2ba9..7762833 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/encryption.png and b/modules/luci-base/htdocs/luci-static/resources/icons/encryption.png differ
index f2e05a4..9a8721b 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/encryption_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/encryption_disabled.png differ
index a025381..e3d24f2 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png and b/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png differ
index 2bb02e4..d8792df 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/ethernet_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/ethernet_disabled.png differ
index 5bb90fd..7154314 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/loading.gif and b/modules/luci-base/htdocs/luci-static/resources/icons/loading.gif differ
index 25ea172..5a2b235 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/port_down.png and b/modules/luci-base/htdocs/luci-static/resources/icons/port_down.png differ
index e063037..8105e77 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png and b/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png differ
index 2e5dff4..b3a8118 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-0-25.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-0-25.png differ
index 114583a..333b155 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png differ
index ee8cc4f..b465de3 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-25-50.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-25-50.png differ
index 26bcbf7..cd7bcaf 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png differ
index 5cffaa1..f7a3658 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-75-100.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-75-100.png differ
index b77585c..4a11356 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png and b/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png differ
index 5c99ba5..be99b19 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/switch.png and b/modules/luci-base/htdocs/luci-static/resources/icons/switch.png differ
index b8c84c8..54588d2 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png differ
index c5a09dd..63eabfe 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png and b/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png differ
index ad9856c..ca79d81 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png differ
index 5c99ba5..be99b19 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/vlan.png and b/modules/luci-base/htdocs/luci-static/resources/icons/vlan.png differ
index b8c84c8..54588d2 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png differ
index 528ce2b..80a23e8 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png and b/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png differ
index d73a5e7..9e466ae 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png and b/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png differ
index af93b37..6f9fff3 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png differ
index 338a34f..e989a2b 100644 (file)
Binary files a/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png and b/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png differ
index f3d4618..2c1bb4d 100644 (file)
@@ -38,7 +38,7 @@ function load(cbimap, ...)
        require("luci.config")
        require("luci.util")
 
-       local upldir = "/lib/uci/upload/"
+       local upldir = "/etc/luci-uploads/"
        local cbidir = luci.util.libpath() .. "/model/cbi/"
        local func, err
 
@@ -367,63 +367,64 @@ end
 
 -- Use optimized UCI writing
 function Map.parse(self, readinput, ...)
-       self.readinput = (readinput ~= false)
-       self:_run_hooks("on_parse")
-
        if self:formvalue("cbi.skip") then
                self.state = FORM_SKIP
+       elseif not self.save then
+               self.state = FORM_INVALID
+       elseif not self:submitstate() then
+               self.state = FORM_NODATA
+       end
+
+       -- Back out early to prevent unauthorized changes on the subsequent parse
+       if self.state ~= nil then
                return self:state_handler(self.state)
        end
 
+       self.readinput = (readinput ~= false)
+       self:_run_hooks("on_parse")
+
        Node.parse(self, ...)
 
-       if self.save then
-               self:_run_hooks("on_save", "on_before_save")
+       self:_run_hooks("on_save", "on_before_save")
+       for i, config in ipairs(self.parsechain) do
+               self.uci:save(config)
+       end
+       self:_run_hooks("on_after_save")
+       if (not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply") then
+               self:_run_hooks("on_before_commit")
                for i, config in ipairs(self.parsechain) do
-                       self.uci:save(config)
-               end
-               self:_run_hooks("on_after_save")
-               if self:submitstate() and ((not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply")) then
-                       self:_run_hooks("on_before_commit")
-                       for i, config in ipairs(self.parsechain) do
-                               self.uci:commit(config)
-
-                               -- Refresh data because commit changes section names
-                               self.uci:load(config)
-                       end
-                       self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
-                       if self.apply_on_parse then
-                               self.uci:apply(self.parsechain)
-                               self:_run_hooks("on_apply", "on_after_apply")
-                       else
-                               -- This is evaluated by the dispatcher and delegated to the
-                               -- template which in turn fires XHR to perform the actual
-                               -- apply actions.
-                               self.apply_needed = true
-                       end
-
-                       -- Reparse sections
-                       Node.parse(self, true)
+                       self.uci:commit(config)
 
+                       -- Refresh data because commit changes section names
+                       self.uci:load(config)
                end
-               for i, config in ipairs(self.parsechain) do
-                       self.uci:unload(config)
-               end
-               if type(self.commit_handler) == "function" then
-                       self:commit_handler(self:submitstate())
+               self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
+               if self.apply_on_parse then
+                       self.uci:apply(self.parsechain)
+                       self:_run_hooks("on_apply", "on_after_apply")
+               else
+                       -- This is evaluated by the dispatcher and delegated to the
+                       -- template which in turn fires XHR to perform the actual
+                       -- apply actions.
+                       self.apply_needed = true
                end
+
+               -- Reparse sections
+               Node.parse(self, true)
+       end
+       for i, config in ipairs(self.parsechain) do
+               self.uci:unload(config)
+       end
+       if type(self.commit_handler) == "function" then
+               self:commit_handler(self:submitstate())
        end
 
-       if self:submitstate() then
-               if not self.save then
-                       self.state = FORM_INVALID
-               elseif self.proceed then
-                       self.state = FORM_PROCEED
-               else
-                       self.state = self.changed and FORM_CHANGED or FORM_VALID
-               end
+       if self.proceed then
+               self.state = FORM_PROCEED
+       elseif self.changed then
+               self.state = FORM_CHANGED
        else
-               self.state = FORM_NODATA
+               self.state = FORM_VALID
        end
 
        return self:state_handler(self.state)
@@ -1470,6 +1471,7 @@ function Value.__init__(self, ...)
        self.template  = "cbi/value"
        self.keylist = {}
        self.vallist = {}
+       self.readonly = nil
 end
 
 function Value.reset_values(self)
@@ -1483,6 +1485,10 @@ function Value.value(self, key, val)
        table.insert(self.vallist, tostring(val))
 end
 
+function Value.parse(self, section, novld)
+       if self.readonly then return end
+       AbstractValue.parse(self, section, novld)
+end
 
 -- DummyValue - This does nothing except being there
 DummyValue = class(AbstractValue)
@@ -1527,17 +1533,25 @@ function Flag.__init__(self, ...)
 end
 
 -- A flag can only have two states: set or unset
-function Flag.parse(self, section)
+function Flag.parse(self, section, novld)
        local fexists = self.map:formvalue(
                FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
 
        if fexists then
                local fvalue = self:formvalue(section) and self.enabled or self.disabled
                local cvalue = self:cfgvalue(section)
-               if fvalue ~= self.default or (not self.optional and not self.rmempty) then
-                       self:write(section, fvalue)
-               else
+               local val_err
+               fvalue, val_err = self:validate(fvalue, section)
+               if not fvalue then
+                       if not novld then
+                               self:add_error(section, "invalid", val_err)
+                       end
+                       return
+               end
+               if fvalue == self.default and (self.optional or self.rmempty) then
                        self:remove(section)
+               else
+                       self:write(section, fvalue)
                end
                if (fvalue ~= cvalue) then self.section.changed = true end
        else
@@ -1549,7 +1563,9 @@ end
 function Flag.cfgvalue(self, section)
        return AbstractValue.cfgvalue(self, section) or self.default
 end
-
+function Flag.validate(self, value)
+       return value
+end
 
 --[[
 ListValue - A one-line value predefined in a list
@@ -1795,6 +1811,7 @@ function Button.__init__(self, ...)
        self.template  = "cbi/button"
        self.inputstyle = nil
        self.rmempty = true
+        self.unsafeupload = false
 end
 
 
@@ -1811,9 +1828,15 @@ function FileUpload.__init__(self, ...)
 end
 
 function FileUpload.formcreated(self, section)
-       return AbstractValue.formcreated(self, section) or
-               self.map:formvalue("cbi.rlf."..section.."."..self.option) or
-               self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
+       if self.unsafeupload then
+               return AbstractValue.formcreated(self, section) or
+                       self.map:formvalue("cbi.rlf."..section.."."..self.option) or
+                       self.map:formvalue("cbi.rlf."..section.."."..self.option..".x") or
+                       self.map:formvalue("cbid."..self.map.config.."."..section.."."..self.option..".textbox")
+       else
+               return AbstractValue.formcreated(self, section) or
+                       self.map:formvalue("cbid."..self.map.config.."."..section.."."..self.option..".textbox")
+       end
 end
 
 function FileUpload.cfgvalue(self, section)
@@ -1824,27 +1847,50 @@ function FileUpload.cfgvalue(self, section)
        return nil
 end
 
+-- If we have a new value, use it
+-- otherwise use old value
+-- deletion should be managed by a separate button object
+-- unless self.unsafeupload is set in which case if the user
+-- choose to remove the old file we do so.
+-- Also, allow to specify (via textbox) a file already on router
 function FileUpload.formvalue(self, section)
        local val = AbstractValue.formvalue(self, section)
        if val then
-               if not self.map:formvalue("cbi.rlf."..section.."."..self.option) and
-                  not self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
-               then
+               if self.unsafeupload then
+                       if not self.map:formvalue("cbi.rlf."..section.."."..self.option) and
+                           not self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
+                       then
+                               return val
+                       end
+                       fs.unlink(val)
+                       self.value = nil
+                       return nil
+                elseif val ~= "" then
                        return val
-               end
-               fs.unlink(val)
-               self.value = nil
+                end
        end
-       return nil
+       val = luci.http.formvalue("cbid."..self.map.config.."."..section.."."..self.option..".textbox")
+       if val == "" then
+               val = nil
+       end
+        if not self.unsafeupload then
+               if not val then
+                       val = self.map:formvalue("cbi.rlf."..section.."."..self.option)
+               end
+        end
+       return val
 end
 
 function FileUpload.remove(self, section)
-       local val = AbstractValue.formvalue(self, section)
-       if val and fs.access(val) then fs.unlink(val) end
-       return AbstractValue.remove(self, section)
+       if self.unsafeupload then
+               local val = AbstractValue.formvalue(self, section)
+               if val and fs.access(val) then fs.unlink(val) end
+               return AbstractValue.remove(self, section)
+       else
+               return nil
+       end
 end
 
-
 FileBrowser = class(AbstractValue)
 
 function FileBrowser.__init__(self, ...)
index ebd7e59..626ad91 100644 (file)
@@ -176,14 +176,43 @@ function hostname(val)
        return false
 end
 
-function host(val)
-       return hostname(val) or ipaddr(val)
+function host(val, ipv4only)
+       return hostname(val) or ((ipv4only == 1) and ip4addr(val)) or ((not (ipv4only == 1)) and ipaddr(val))
 end
 
 function network(val)
        return uciname(val) or host(val)
 end
 
+function hostport(val, ipv4only)
+       local h, p = val:match("^([^:]+):([^:]+)$")
+       return not not (h and p and host(h, ipv4only) and port(p))
+end
+
+function ip4addrport(val, bracket)
+       local h, p = val:match("^([^:]+):([^:]+)$")
+       return (h and p and ip4addr(h) and port(p))
+end
+
+function ip4addrport(val)
+       local h, p = val:match("^([^:]+):([^:]+)$")
+       return (h and p and ip4addr(h) and port(p))
+end
+
+function ipaddrport(val, bracket)
+       local h, p = val:match("^([^%[%]:]+):([^:]+)$")
+       if (h and p and ip4addr(h) and port(p)) then
+               return true
+       elseif (bracket == 1) then
+               h, p = val:match("^%[(.+)%]:([^:]+)$")
+               if  (h and p and ip6addr(h) and port(p)) then
+                       return true
+               end
+       end
+       h, p = val:match("^([^%[%]]+):([^:]+)$")
+       return (h and p and ip6addr(h) and port(p))
+end
+
 function wpakey(val)
        if #val == 64 then
                return (val:match("^[a-fA-F0-9]+$") ~= nil)
@@ -331,3 +360,48 @@ end
 function phonedigit(val)
        return (val:match("^[0-9\*#!%.]+$") ~= nil)
 end
+
+function timehhmmss(val)
+       return (val:match("^[0-6][0-9]:[0-6][0-9]:[0-6][0-9]$") ~= nil)
+end
+
+function dateyyyymmdd(val)
+       if val ~= nil then
+               yearstr, monthstr, daystr = val:match("^(%d%d%d%d)-(%d%d)-(%d%d)$")
+               if (yearstr == nil) or (monthstr == nil) or (daystr == nil) then
+                       return false;
+               end
+               year = tonumber(yearstr)
+               month = tonumber(monthstr)
+               day = tonumber(daystr)
+               if (year == nil) or (month == nil) or (day == nil) then
+                       return false;
+               end
+
+               local days_in_month = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+
+               local function is_leap_year(year)
+                       return (year % 4 == 0) and ((year % 100 ~= 0) or (year % 400 == 0))
+               end
+
+               function get_days_in_month(month, year)
+                       if (month == 2) and is_leap_year(year) then
+                                       return 29
+                       else
+                               return days_in_month[month]
+                       end
+               end
+               if (year < 2015) then
+                       return false
+               end 
+               if ((month == 0) or (month > 12)) then
+                       return false
+               end 
+               if ((day == 0) or (day > get_days_in_month(month, year))) then
+                       return false
+               end
+               return true
+       end
+       return false
+end
+
index 5b855cb..1d73eb4 100644 (file)
@@ -6,7 +6,7 @@ module("luci.controller.admin.servicectl", package.seeall)
 function index()
        entry({"servicectl"}, alias("servicectl", "status")).sysauth = "root"
        entry({"servicectl", "status"}, call("action_status")).leaf = true
-       entry({"servicectl", "restart"}, call("action_restart")).leaf = true
+       entry({"servicectl", "restart"}, post("action_restart")).leaf = true
 end
 
 function action_status()
index 8b8d1fa..cd5d77a 100644 (file)
@@ -1,4 +1,5 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
 -- Licensed to the public under the Apache License 2.0.
 
 local fs = require "nixio.fs"
@@ -26,14 +27,6 @@ function build_url(...)
        local path = {...}
        local url = { http.getenv("SCRIPT_NAME") or "" }
 
-       local k, v
-       for k, v in pairs(context.urltoken) do
-               url[#url+1] = "/;"
-               url[#url+1] = http.urlencode(k)
-               url[#url+1] = "="
-               url[#url+1] = http.urlencode(v)
-       end
-
        local p
        for _, p in ipairs(path) do
                if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then
@@ -42,6 +35,10 @@ function build_url(...)
                end
        end
 
+       if #path == 0 then
+               url[#url+1] = "/"
+       end
+
        return table.concat(url, "")
 end
 
@@ -112,24 +109,11 @@ function authenticator.htmlauth(validator, accs, default)
                return user
        end
 
-       if context.urltoken.stok then
-               context.urltoken.stok = nil
-
-               local cookie = 'sysauth=%s; expires=%s; path=%s/' %{
-                   http.getcookie('sysauth') or 'x',
-                       'Thu, 01 Jan 1970 01:00:00 GMT',
-                       build_url()
-               }
-
-               http.header("Set-Cookie", cookie)
-               http.redirect(build_url())
-       else
-               require("luci.i18n")
-               require("luci.template")
-               context.path = {}
-               http.status(403, "Forbidden")
-               luci.template.render("sysauth", {duser=default, fuser=user})
-       end
+       require("luci.i18n")
+       require("luci.template")
+       context.path = {}
+       http.status(403, "Forbidden")
+       luci.template.render("sysauth", {duser=default, fuser=user})
 
        return false
 
@@ -140,7 +124,6 @@ function httpdispatch(request, prefix)
 
        local r = {}
        context.request = r
-       context.urltoken = {}
 
        local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
 
@@ -150,18 +133,8 @@ function httpdispatch(request, prefix)
                end
        end
 
-       local tokensok = true
        for node in pathinfo:gmatch("[^/]+") do
-               local tkey, tval
-               if tokensok then
-                       tkey, tval = node:match(";(%w+)=([a-fA-F0-9]*)")
-               end
-               if tkey then
-                       context.urltoken[tkey] = tval
-               else
-                       tokensok = false
-                       r[#r+1] = node
-               end
+               r[#r+1] = node
        end
 
        local stat, err = util.coxpcall(function()
@@ -173,6 +146,48 @@ function httpdispatch(request, prefix)
        --context._disable_memtrace()
 end
 
+local function require_post_security(target)
+       if type(target) == "table" then
+               if type(target.post) == "table" then
+                       local param_name, required_val, request_val
+
+                       for param_name, required_val in pairs(target.post) do
+                               request_val = http.formvalue(param_name)
+
+                               if (type(required_val) == "string" and
+                                   request_val ~= required_val) or
+                                  (required_val == true and
+                                   (request_val == nil or request_val == ""))
+                               then
+                                       return false
+                               end
+                       end
+
+                       return true
+               end
+
+               return (target.post == true)
+       end
+
+       return false
+end
+
+function test_post_security()
+       if http.getenv("REQUEST_METHOD") ~= "POST" then
+               http.status(405, "Method Not Allowed")
+               http.header("Allow", "POST")
+               return false
+       end
+
+       if http.formvalue("token") ~= context.authtoken then
+               http.status(403, "Forbidden")
+               luci.template.render("csrftoken")
+               return false
+       end
+
+       return true
+end
+
 function dispatch(request)
        --context._disable_memtrace = require "luci.debug".trap_memtrace("l")
        local ctx = context
@@ -206,7 +221,6 @@ function dispatch(request)
        ctx.args = args
        ctx.requestargs = ctx.requestargs or args
        local n
-       local token = ctx.urltoken
        local preq = {}
        local freq = {}
 
@@ -284,11 +298,14 @@ function dispatch(request)
                   resource    = luci.config.main.resourcebase;
                   ifattr      = function(...) return _ifattr(...) end;
                   attr        = function(...) return _ifattr(true, ...) end;
+                  url         = build_url;
                }, {__index=function(table, key)
                        if key == "controller" then
                                return build_url()
                        elseif key == "REQUEST_URI" then
                                return build_url(unpack(ctx.requestpath))
+                       elseif key == "token" then
+                               return ctx.authtoken
                        else
                                return rawget(table, key) or _G[key]
                        end
@@ -311,20 +328,17 @@ function dispatch(request)
                local def  = (type(track.sysauth) == "string") and track.sysauth
                local accs = def and {track.sysauth} or track.sysauth
                local sess = ctx.authsession
-               local verifytoken = false
                if not sess then
                        sess = http.getcookie("sysauth")
                        sess = sess and sess:match("^[a-f0-9]*$")
-                       verifytoken = true
                end
 
                local sdat = (util.ubus("session", "get", { ubus_rpc_session = sess }) or { }).values
-               local user
+               local user, token
 
                if sdat then
-                       if not verifytoken or ctx.urltoken.stok == sdat.token then
-                               user = sdat.user
-                       end
+                       user = sdat.user
+                       token = sdat.token
                else
                        local eu = http.getenv("HTTP_AUTH_USER")
                        local ep = http.getenv("HTTP_AUTH_PASS")
@@ -357,12 +371,10 @@ function dispatch(request)
                                        end
 
                                        if sess and token then
-                                               http.header("Set-Cookie", 'sysauth=%s; path=%s/' %{
-                                                  sess, build_url()
-                                               })
+                                               http.header("Set-Cookie", 'sysauth=%s; path=%s' %{ sess, build_url() })
 
-                                               ctx.urltoken.stok = token
                                                ctx.authsession = sess
+                                               ctx.authtoken = token
                                                ctx.authuser = user
 
                                                http.redirect(build_url(unpack(ctx.requestpath)))
@@ -374,10 +386,17 @@ function dispatch(request)
                        end
                else
                        ctx.authsession = sess
+                       ctx.authtoken = token
                        ctx.authuser = user
                end
        end
 
+       if c and require_post_security(c.target) then
+               if not test_post_security(c) then
+                       return
+               end
+       end
+
        if track.setgroup then
                sys.process.setgroup(track.setgroup)
        end
@@ -703,6 +722,20 @@ function call(name, ...)
        return {type = "call", argv = {...}, name = name, target = _call}
 end
 
+function post_on(params, name, ...)
+       return {
+               type = "call",
+               post = params,
+               argv = { ... },
+               name = name,
+               target = _call
+       }
+end
+
+function post(...)
+       return post_on(true, ...)
+end
+
 
 local _template = function(self, ...)
        require "luci.template".render(self.view)
@@ -814,7 +847,13 @@ local function _cbi(self, ...)
 end
 
 function cbi(model, config)
-       return {type = "cbi", config = config, model = model, target = _cbi}
+       return {
+               type = "cbi",
+               post = { ["cbi.submit"] = "1" },
+               config = config,
+               model = model,
+               target = _cbi
+       }
 end
 
 
@@ -854,7 +893,12 @@ local function _form(self, ...)
 end
 
 function form(model)
-       return {type = "cbi", model = model, target = _form}
+       return {
+               type = "cbi",
+               post = { ["cbi.submit"] = "1" },
+               model = model,
+               target = _form
+       }
 end
 
 translate = i18n.translate
index a92d8af..4b35731 100644 (file)
@@ -208,6 +208,7 @@ function splice(fd, size)
 end
 
 function redirect(url)
+       if url == "" then url = "/" end
        status(302, "Found")
        header("Location", url)
        close()
index 8592726..0cb62ae 100644 (file)
@@ -72,7 +72,7 @@ function urlencode( str )
 
        if type(str) == "string" then
                str = str:gsub(
-                       "([^a-zA-Z0-9$_%-%.!*'(),])",
+                       "([^a-zA-Z0-9$_%-%.%~])",
                        __chrenc
                )
        end
index 41633c4..e653b03 100644 (file)
@@ -127,26 +127,29 @@ local function _list(action, pat, cb)
                (pat and (" '%s'" % pat:gsub("'", "")) or ""))
 
        if fd then
-               local name, version, desc
+               local name, version, sz, desc
                while true do
                        local line = fd:read("*l")
                        if not line then break end
 
-                       name, version, desc = line:match("^(.-) %- (.-) %- (.+)")
+                       name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)")
 
                        if not name then
-                               name, version = line:match("^(.-) %- (.+)")
+                               name, version, sz = line:match("^(.-) %- (.-) %- (.+)")
                                desc = ""
                        end
 
-                       if #version > 26 then
-                               version = version:sub(1,21) .. ".." .. version:sub(-3,-1)
-                       end
+                       if name and version then
+                               if #version > 26 then
+                                       version = version:sub(1,21) .. ".." .. version:sub(-3,-1)
+                               end
 
-                       cb(name, version, desc)
+                               cb(name, version, sz, desc)
+                       end
 
                        name    = nil
                        version = nil
+                       sz      = nil
                        desc    = nil
                end
 
@@ -155,15 +158,15 @@ local function _list(action, pat, cb)
 end
 
 function list_all(pat, cb)
-       _list("list", pat, cb)
+       _list("list --size", pat, cb)
 end
 
 function list_installed(pat, cb)
-       _list("list_installed", pat, cb)
+       _list("list_installed --size", pat, cb)
 end
 
 function find(pat, cb)
-       _list("find", pat, cb)
+       _list("find --size", pat, cb)
 end
 
 
@@ -237,4 +240,3 @@ function compare_versions(ver1, comp, ver2)
        -- all equal and not compare greater or lower then true
        return not (comp == "<" or comp == ">")
 end
-
index 20e1032..81fc416 100644 (file)
@@ -1,8 +1,8 @@
 -- Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org>
 -- Licensed to the public under the Apache License 2.0.
 
-local type, next, pairs, ipairs, loadfile, table
-       = type, next, pairs, ipairs, loadfile, table
+local type, next, pairs, ipairs, loadfile, table, select
+       = type, next, pairs, ipairs, loadfile, table, select
 
 local tonumber, tostring, math = tonumber, tostring, math
 
@@ -16,6 +16,7 @@ local utl = require "luci.util"
 local dsp = require "luci.dispatcher"
 local uci = require "luci.model.uci"
 local lng = require "luci.i18n"
+local jsc = require "luci.jsonc"
 
 module "luci.model.network"
 
@@ -31,10 +32,10 @@ local _protocols = { }
 
 local _interfaces, _bridge, _switch, _tunnel
 local _ubusnetcache, _ubusdevcache, _ubuswificache
-local _uci_real, _uci_state
+local _uci
 
 function _filter(c, s, o, r)
-       local val = _uci_real:get(c, s, o)
+       local val = _uci:get(c, s, o)
        if val then
                local l = { }
                if type(val) == "string" then
@@ -44,9 +45,9 @@ function _filter(c, s, o, r)
                                end
                        end
                        if #l > 0 then
-                               _uci_real:set(c, s, o, table.concat(l, " "))
+                               _uci:set(c, s, o, table.concat(l, " "))
                        else
-                               _uci_real:delete(c, s, o)
+                               _uci:delete(c, s, o)
                        end
                elseif type(val) == "table" then
                        for _, val in ipairs(val) do
@@ -55,16 +56,16 @@ function _filter(c, s, o, r)
                                end
                        end
                        if #l > 0 then
-                               _uci_real:set(c, s, o, l)
+                               _uci:set(c, s, o, l)
                        else
-                               _uci_real:delete(c, s, o)
+                               _uci:delete(c, s, o)
                        end
                end
        end
 end
 
 function _append(c, s, o, a)
-       local val = _uci_real:get(c, s, o) or ""
+       local val = _uci:get(c, s, o) or ""
        if type(val) == "string" then
                local l = { }
                for val in val:gmatch("%S+") do
@@ -73,7 +74,7 @@ function _append(c, s, o, a)
                        end
                end
                l[#l+1] = a
-               _uci_real:set(c, s, o, table.concat(l, " "))
+               _uci:set(c, s, o, table.concat(l, " "))
        elseif type(val) == "table" then
                local l = { }
                for _, val in ipairs(val) do
@@ -82,7 +83,7 @@ function _append(c, s, o, a)
                        end
                end
                l[#l+1] = a
-               _uci_real:set(c, s, o, l)
+               _uci:set(c, s, o, l)
        end
 end
 
@@ -95,15 +96,15 @@ function _stror(s1, s2)
 end
 
 function _get(c, s, o)
-       return _uci_real:get(c, s, o)
+       return _uci:get(c, s, o)
 end
 
 function _set(c, s, o, v)
        if v ~= nil then
                if type(v) == "boolean" then v = v and "1" or "0" end
-               return _uci_real:set(c, s, o, v)
+               return _uci:set(c, s, o, v)
        else
-               return _uci_real:delete(c, s, o)
+               return _uci:delete(c, s, o)
        end
 end
 
@@ -127,7 +128,7 @@ function _wifi_state(key, val, field)
                for radio, radiostate in pairs(_ubuswificache) do
                        for ifc, ifcstate in pairs(radiostate.interfaces) do
                                if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then
-                                       local s = _uci_real:get_all('wireless.%s' % ifcstate.section)
+                                       local s = _uci:get_all('wireless.%s' % ifcstate.section)
                                        if s then
                                                ifcstate.section = s['.name']
                                        end
@@ -153,7 +154,7 @@ function _wifi_lookup(ifn)
                local num = 0
 
                ifnidx = tonumber(ifnidx)
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device == radio then
                                        num = num + 1
@@ -166,20 +167,9 @@ function _wifi_lookup(ifn)
 
                return sid
 
-       -- looks like wifi, try to locate the section via state vars
+       -- looks like wifi, try to locate the section via ubus state
        elseif _wifi_iface(ifn) then
-               local sid = _wifi_state("ifname", ifn, "section")
-               if not sid then
-                       _uci_state:foreach("wireless", "wifi-iface",
-                               function(s)
-                                       if s.ifname == ifn then
-                                               sid = s['.name']
-                                               return false
-                                       end
-                               end)
-               end
-
-               return sid
+               return _wifi_state("ifname", ifn, "section")
        end
 end
 
@@ -205,8 +195,7 @@ end
 
 
 function init(cursor)
-       _uci_real  = cursor or _uci_real or uci.cursor()
-       _uci_state = _uci_real:substate()
+       _uci = cursor or _uci or uci.cursor()
 
        _interfaces = { }
        _bridge     = { }
@@ -281,13 +270,13 @@ function init(cursor)
 end
 
 function save(self, ...)
-       _uci_real:save(...)
-       _uci_real:load(...)
+       _uci:save(...)
+       _uci:load(...)
 end
 
 function commit(self, ...)
-       _uci_real:commit(...)
-       _uci_real:load(...)
+       _uci:commit(...)
+       _uci:load(...)
 end
 
 function ifnameof(self, x)
@@ -345,7 +334,7 @@ end
 function add_network(self, n, options)
        local oldnet = self:get_network(n)
        if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not oldnet then
-               if _uci_real:section("network", "interface", n, options) then
+               if _uci:section("network", "interface", n, options) then
                        return network(n)
                end
        elseif oldnet and oldnet:is_empty() then
@@ -360,7 +349,7 @@ function add_network(self, n, options)
 end
 
 function get_network(self, n)
-       if n and _uci_real:get("network", n) == "interface" then
+       if n and _uci:get("network", n) == "interface" then
                return network(n)
        end
 end
@@ -369,7 +358,7 @@ function get_networks(self)
        local nets = { }
        local nls = { }
 
-       _uci_real:foreach("network", "interface",
+       _uci:foreach("network", "interface",
                function(s)
                        nls[s['.name']] = network(s['.name'])
                end)
@@ -383,18 +372,18 @@ function get_networks(self)
 end
 
 function del_network(self, n)
-       local r = _uci_real:delete("network", n)
+       local r = _uci:delete("network", n)
        if r then
-               _uci_real:delete_all("network", "alias",
+               _uci:delete_all("network", "alias",
                        function(s) return (s.interface == n) end)
 
-               _uci_real:delete_all("network", "route",
+               _uci:delete_all("network", "route",
                        function(s) return (s.interface == n) end)
 
-               _uci_real:delete_all("network", "route6",
+               _uci:delete_all("network", "route6",
                        function(s) return (s.interface == n) end)
 
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                local net
                                local rest = { }
@@ -404,10 +393,10 @@ function del_network(self, n)
                                        end
                                end
                                if #rest > 0 then
-                                       _uci_real:set("wireless", s['.name'], "network",
+                                       _uci:set("wireless", s['.name'], "network",
                                                      table.concat(rest, " "))
                                else
-                                       _uci_real:delete("wireless", s['.name'], "network")
+                                       _uci:delete("wireless", s['.name'], "network")
                                end
                        end)
        end
@@ -417,31 +406,31 @@ end
 function rename_network(self, old, new)
        local r
        if new and #new > 0 and new:match("^[a-zA-Z0-9_]+$") and not self:get_network(new) then
-               r = _uci_real:section("network", "interface", new, _uci_real:get_all("network", old))
+               r = _uci:section("network", "interface", new, _uci:get_all("network", old))
 
                if r then
-                       _uci_real:foreach("network", "alias",
+                       _uci:foreach("network", "alias",
                                function(s)
                                        if s.interface == old then
-                                               _uci_real:set("network", s['.name'], "interface", new)
+                                               _uci:set("network", s['.name'], "interface", new)
                                        end
                                end)
 
-                       _uci_real:foreach("network", "route",
+                       _uci:foreach("network", "route",
                                function(s)
                                        if s.interface == old then
-                                               _uci_real:set("network", s['.name'], "interface", new)
+                                               _uci:set("network", s['.name'], "interface", new)
                                        end
                                end)
 
-                       _uci_real:foreach("network", "route6",
+                       _uci:foreach("network", "route6",
                                function(s)
                                        if s.interface == old then
-                                               _uci_real:set("network", s['.name'], "interface", new)
+                                               _uci:set("network", s['.name'], "interface", new)
                                        end
                                end)
 
-                       _uci_real:foreach("wireless", "wifi-iface",
+                       _uci:foreach("wireless", "wifi-iface",
                                function(s)
                                        local net
                                        local list = { }
@@ -453,12 +442,12 @@ function rename_network(self, old, new)
                                                end
                                        end
                                        if #list > 0 then
-                                               _uci_real:set("wireless", s['.name'], "network",
+                                               _uci:set("wireless", s['.name'], "network",
                                                              table.concat(list, " "))
                                        end
                                end)
 
-                       _uci_real:delete("network", old)
+                       _uci:delete("network", old)
                end
        end
        return r or false
@@ -470,7 +459,7 @@ function get_interface(self, i)
        else
                local ifc
                local num = { }
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device then
                                        num[s.device] = num[s.device] and num[s.device] + 1 or 1
@@ -485,6 +474,21 @@ function get_interface(self, i)
        end
 end
 
+local function swdev_from_board_json()
+       local boardinfo = jsc.parse(nfs.readfile("/etc/board.json") or "")
+       if type(boardinfo) == "table" and type(boardinfo.network) == "table" then
+               local net, val
+               for net, val in pairs(boardinfo.network) do
+                       if type(val) == "table" and type(val.ifname) == "string" and
+                          val.create_vlan == true
+                       then
+                               return val.ifname
+                       end
+               end
+       end
+       return nil
+end
+
 function get_interfaces(self)
        local iface
        local ifaces = { }
@@ -493,7 +497,7 @@ function get_interfaces(self)
        local baseof = { }
 
        -- find normal interfaces
-       _uci_real:foreach("network", "interface",
+       _uci:foreach("network", "interface",
                function(s)
                        for iface in utl.imatch(s.ifname) do
                                if not _iface_ignore(iface) and not _wifi_iface(iface) then
@@ -510,7 +514,7 @@ function get_interfaces(self)
        end
 
        -- find vlan interfaces
-       _uci_real:foreach("network", "switch_vlan",
+       _uci:foreach("network", "switch_vlan",
                function(s)
                        if not s.device then
                                return
@@ -526,7 +530,7 @@ function get_interfaces(self)
                                                end
                                        end
                                        if not base or not base:match("^eth%d") then
-                                               base = "eth0"
+                                               base = swdev_from_board_json() or "eth0"
                                        end
                                else
                                        base = s.device
@@ -551,7 +555,7 @@ function get_interfaces(self)
        -- find wifi interfaces
        local num = { }
        local wfs = { }
-       _uci_real:foreach("wireless", "wifi-iface",
+       _uci:foreach("wireless", "wifi-iface",
                function(s)
                        if s.device then
                                num[s.device] = num[s.device] and num[s.device] + 1 or 1
@@ -572,7 +576,7 @@ function ignore_interface(self, x)
 end
 
 function get_wifidev(self, dev)
-       if _uci_real:get("wireless", dev) == "wifi-device" then
+       if _uci:get("wireless", dev) == "wifi-device" then
                return wifidev(dev)
        end
 end
@@ -581,7 +585,7 @@ function get_wifidevs(self)
        local devs = { }
        local wfd  = { }
 
-       _uci_real:foreach("wireless", "wifi-device",
+       _uci:foreach("wireless", "wifi-device",
                function(s) wfd[#wfd+1] = s['.name'] end)
 
        local dev
@@ -601,9 +605,9 @@ end
 
 function add_wifinet(self, net, options)
        if type(options) == "table" and options.device and
-               _uci_real:get("wireless", options.device) == "wifi-device"
+               _uci:get("wireless", options.device) == "wifi-device"
        then
-               local wnet = _uci_real:section("wireless", "wifi-iface", nil, options)
+               local wnet = _uci:section("wireless", "wifi-iface", nil, options)
                return wifinet(wnet)
        end
 end
@@ -611,7 +615,7 @@ end
 function del_wifinet(self, net)
        local wnet = _wifi_lookup(net)
        if wnet then
-               _uci_real:delete("wireless", wnet)
+               _uci:delete("wireless", wnet)
                return true
        end
        return false
@@ -684,7 +688,7 @@ end
 
 function network(name, proto)
        if name then
-               local p = proto or _uci_real:get("network", name, "proto")
+               local p = proto or _uci:get("network", name, "proto")
                local c = p and _protocols[p] or protocol
                return c(name)
        end
@@ -695,7 +699,7 @@ function protocol.__init__(self, name)
 end
 
 function protocol._get(self, opt)
-       local v = _uci_real:get("network", self.sid, opt)
+       local v = _uci:get("network", self.sid, opt)
        if type(v) == "table" then
                return table.concat(v, " ")
        end
@@ -730,7 +734,7 @@ function protocol.ifname(self)
        end
        if not ifname then
                local num = { }
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device then
                                        num[s.device] = num[s.device]
@@ -779,17 +783,21 @@ function protocol.uptime(self)
 end
 
 function protocol.expires(self)
-       local a = tonumber(_uci_state:get("network", self.sid, "lease_acquired"))
-       local l = tonumber(_uci_state:get("network", self.sid, "lease_lifetime"))
-       if a and l then
-               l = l - (nxo.sysinfo().uptime - a)
-               return l > 0 and l or 0
+       local u = self:_ubus("uptime")
+       local d = self:_ubus("data")
+
+       if type(u) == "number" and type(d) == "table" and
+          type(d.leasetime) == "number"
+       then
+               local r = (d.leasetime - (u % d.leasetime))
+               return r > 0 and r or 0
        end
+
        return -1
 end
 
 function protocol.metric(self)
-       return tonumber(_uci_state:get("network", self.sid, "metric")) or 0
+       return self:_ubus("metric") or 0
 end
 
 function protocol.ipaddr(self)
@@ -797,6 +805,20 @@ function protocol.ipaddr(self)
        return addrs and #addrs > 0 and addrs[1].address
 end
 
+function protocol.ipaddrs(self)
+       local addrs = self:_ubus("ipv4-address")
+       local rv = { }
+
+       if type(addrs) == "table" then
+               local n, addr
+               for n, addr in ipairs(addrs) do
+                       rv[#rv+1] = "%s/%d" %{ addr.address, addr.mask }
+               end
+       end
+
+       return rv
+end
+
 function protocol.netmask(self)
        local addrs = self:_ubus("ipv4-address")
        return addrs and #addrs > 0 and
@@ -835,6 +857,28 @@ function protocol.ip6addr(self)
        end
 end
 
+function protocol.ip6addrs(self)
+       local addrs = self:_ubus("ipv6-address")
+       local rv = { }
+       local n, addr
+
+       if type(addrs) == "table" then
+               for n, addr in ipairs(addrs) do
+                       rv[#rv+1] = "%s/%d" %{ addr.address, addr.mask }
+               end
+       end
+
+       addrs = self:_ubus("ipv6-prefix-assignment")
+
+       if type(addrs) == "table" then
+               for n, addr in ipairs(addrs) do
+                       rv[#rv+1] = "%s1/%d" %{ addr.address, addr.mask }
+               end
+       end
+
+       return rv
+end
+
 function protocol.gw6addr(self)
        local _, route
        for _, route in ipairs(self:_ubus("route") or { }) do
@@ -885,7 +929,7 @@ function protocol.is_empty(self)
                        rv = false
                end
 
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                local n
                                for n in utl.imatch(s.network) do
@@ -937,12 +981,12 @@ function protocol.get_interface(self)
        else
                local ifn = nil
                local num = { }
-               for ifn in utl.imatch(_uci_real:get("network", self.sid, "ifname")) do
+               for ifn in utl.imatch(_uci:get("network", self.sid, "ifname")) do
                        ifn = ifn:match("^[^:/]+")
                        return ifn and interface(ifn, self)
                end
                ifn = nil
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device then
                                        num[s.device] = num[s.device] and num[s.device] + 1 or 1
@@ -977,7 +1021,7 @@ function protocol.get_interfaces(self)
 
                local num = { }
                local wfs = { }
-               _uci_real:foreach("wireless", "wifi-iface",
+               _uci:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device then
                                        num[s.device] = num[s.device] and num[s.device] + 1 or 1
@@ -1020,7 +1064,7 @@ function protocol.contains_interface(self, ifname)
                local wif = _wifi_lookup(ifname)
                if wif then
                        local n
-                       for n in utl.imatch(_uci_real:get("wireless", wif, "network")) do
+                       for n in utl.imatch(_uci:get("wireless", wif, "network")) do
                                if n == self.sid then
                                        return true
                                end
@@ -1066,7 +1110,8 @@ function interface.name(self)
 end
 
 function interface.mac(self)
-       return (self:_ubus("macaddr") or "00:00:00:00:00:00"):upper()
+       local mac = self:_ubus("macaddr")
+       return mac and mac:upper()
 end
 
 function interface.ipaddrs(self)
@@ -1278,22 +1323,11 @@ function wifidev.is_up(self)
                return (_ubuswificache[self.sid].up == true)
        end
 
-       local up = false
-       _uci_state:foreach("wireless", "wifi-iface",
-               function(s)
-                       if s.device == self.sid then
-                               if s.up == "1" then
-                                       up = true
-                                       return false
-                               end
-                       end
-               end)
-
-       return up
+       return false
 end
 
 function wifidev.get_wifinet(self, net)
-       if _uci_real:get("wireless", net) == "wifi-iface" then
+       if _uci:get("wireless", net) == "wifi-iface" then
                return wifinet(net)
        else
                local wnet = _wifi_lookup(net)
@@ -1306,7 +1340,7 @@ end
 function wifidev.get_wifinets(self)
        local nets = { }
 
-       _uci_real:foreach("wireless", "wifi-iface",
+       _uci:foreach("wireless", "wifi-iface",
                function(s)
                        if s.device == self.sid then
                                nets[#nets+1] = wifinet(s['.name'])
@@ -1320,7 +1354,7 @@ function wifidev.add_wifinet(self, options)
        options = options or { }
        options.device = self.sid
 
-       local wnet = _uci_real:section("wireless", "wifi-iface", nil, options)
+       local wnet = _uci:section("wireless", "wifi-iface", nil, options)
        if wnet then
                return wifinet(wnet, options)
        end
@@ -1329,12 +1363,12 @@ end
 function wifidev.del_wifinet(self, net)
        if utl.instanceof(net, wifinet) then
                net = net.sid
-       elseif _uci_real:get("wireless", net) ~= "wifi-iface" then
+       elseif _uci:get("wireless", net) ~= "wifi-iface" then
                net = _wifi_lookup(net)
        end
 
-       if net and _uci_real:get("wireless", net, "device") == self.sid then
-               _uci_real:delete("wireless", net)
+       if net and _uci:get("wireless", net, "device") == self.sid then
+               _uci:delete("wireless", net)
                return true
        end
 
@@ -1347,26 +1381,58 @@ wifinet = utl.class()
 function wifinet.__init__(self, net, data)
        self.sid = net
 
+       local n = 0
        local num = { }
-       local netid
-       _uci_real:foreach("wireless", "wifi-iface",
+       local netid, sid
+       _uci:foreach("wireless", "wifi-iface",
                function(s)
+                       n = n + 1
                        if s.device then
                                num[s.device] = num[s.device] and num[s.device] + 1 or 1
                                if s['.name'] == self.sid then
+                                       sid = "@wifi-iface[%d]" % n
                                        netid = "%s.network%d" %{ s.device, num[s.device] }
                                        return false
                                end
                        end
                end)
 
+       if sid then
+               local _, k, r, i
+               for k, r in pairs(_ubuswificache) do
+                       if type(r) == "table" and
+                          type(r.interfaces) == "table"
+                       then
+                               for _, i in ipairs(r.interfaces) do
+                                       if type(i) == "table" and i.section == sid then
+                                               self._ubusdata = {
+                                                       radio = k,
+                                                       dev = r,
+                                                       net = i
+                                               }
+                                       end
+                               end
+                       end
+               end
+       end
+
        local dev = _wifi_state("section", self.sid, "ifname") or netid
 
        self.netid  = netid
        self.wdev   = dev
        self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
-       self.iwdata = data or _uci_state:get_all("wireless", self.sid) or
-               _uci_real:get_all("wireless", self.sid) or { }
+end
+
+function wifinet.ubus(self, ...)
+       local n, v = self._ubusdata
+       for n = 1, select('#', ...) do
+               if type(v) == "table" then
+                       v = v[select(n, ...)]
+               else
+                       return nil
+               end
+       end
+       return v
 end
 
 function wifinet.get(self, opt)
@@ -1378,19 +1444,23 @@ function wifinet.set(self, opt, val)
 end
 
 function wifinet.mode(self)
-       return _uci_state:get("wireless", self.sid, "mode") or "ap"
+       return self:ubus("net", "config", "mode") or self:get("mode") or "ap"
 end
 
 function wifinet.ssid(self)
-       return _uci_state:get("wireless", self.sid, "ssid")
+       return self:ubus("net", "config", "ssid") or self:get("ssid")
 end
 
 function wifinet.bssid(self)
-       return _uci_state:get("wireless", self.sid, "bssid")
+       return self:ubus("net", "config", "bssid") or self:get("bssid")
 end
 
 function wifinet.network(self)
-       return _uci_state:get("wifinet", self.sid, "network")
+       local net, networks = nil, { }
+       for net in utl.imatch(self:ubus("net", "config", "network") or self:get("network")) do
+               networks[#networks+1] = net
+       end
+       return networks
 end
 
 function wifinet.id(self)
@@ -1402,7 +1472,7 @@ function wifinet.name(self)
 end
 
 function wifinet.ifname(self)
-       local ifname = self.iwinfo.ifname
+       local ifname = self:ubus("net", "ifname") or self.iwinfo.ifname
        if not ifname or ifname:match("^wifi%d") or ifname:match("^radio%d") then
                ifname = self.wdev
        end
@@ -1410,9 +1480,8 @@ function wifinet.ifname(self)
 end
 
 function wifinet.get_device(self)
-       if self.iwdata.device then
-               return wifidev(self.iwdata.device)
-       end
+       local dev = self:ubus("radio") or self:get("device")
+       return dev and wifidev(dev) or nil
 end
 
 function wifinet.is_up(self)
@@ -1421,7 +1490,7 @@ function wifinet.is_up(self)
 end
 
 function wifinet.active_mode(self)
-       local m = _stror(self.iwdata.mode, self.iwinfo.mode) or "ap"
+       local m = self.iwinfo.mode or self:ubus("net", "config", "mode") or self:get("mode") or "ap"
 
        if     m == "ap"      then m = "Master"
        elseif m == "sta"     then m = "Client"
@@ -1438,11 +1507,11 @@ function wifinet.active_mode_i18n(self)
 end
 
 function wifinet.active_ssid(self)
-       return _stror(self.iwdata.ssid, self.iwinfo.ssid)
+       return self.iwinfo.ssid or self:ubus("net", "config", "ssid") or self:get("ssid")
 end
 
 function wifinet.active_bssid(self)
-       return _stror(self.iwdata.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00"
+       return self.iwinfo.bssid or self:ubus("net", "config", "bssid") or self:get("bssid")
 end
 
 function wifinet.active_encryption(self)
@@ -1469,8 +1538,8 @@ function wifinet.bitrate(self)
 end
 
 function wifinet.channel(self)
-       return self.iwinfo.channel or
-               tonumber(_uci_state:get("wireless", self.iwdata.device, "channel"))
+       return self.iwinfo.channel or self:ubus("dev", "config", "channel") or
+               tonumber(self:get("channel"))
 end
 
 function wifinet.signal(self)
@@ -1482,7 +1551,7 @@ function wifinet.noise(self)
 end
 
 function wifinet.country(self)
-       return self.iwinfo.country or "00"
+       return self.iwinfo.country or self:ubus("dev", "config", "country") or "00"
 end
 
 function wifinet.txpower(self)
@@ -1548,8 +1617,8 @@ end
 function wifinet.get_networks(self)
        local nets = { }
        local net
-       for net in utl.imatch(tostring(self.iwdata.network)) do
-               if _uci_real:get("network", net) == "interface" then
+       for net in utl.imatch(self:ubus("net", "config", "network") or self:get("network")) do
+               if _uci:get("network", net) == "interface" then
                        nets[#nets+1] = network(net)
                end
        end
index 9e4a58f..49093c7 100644 (file)
@@ -237,12 +237,18 @@ Saves changes made to a config to make them committable.
 ---[[
 Set a value or create a named section.
 
+When invoked with three arguments `config`, `sectionname`, `sectiontype`,
+then a named section of the given type is created.
+
+When invoked with four arguments `config`, `sectionname`, `optionname` and
+`optionvalue` then the value of the specified option is set to the given value.
+
 @class function
 @name Cursor.set
 @param config  UCI config
 @param section UCI section name
 @param option  UCI option or UCI section type
-@param value           UCI value or nil if you want to create a section
+@param value           UCI value or nothing if you want to create a section
 @return                        Boolean whether operation succeeded
 ]]
 
index 3977da3..31c3e12 100644 (file)
@@ -293,47 +293,51 @@ function net.ipv6_hints(callback)
 end
 
 function net.conntrack(callback)
-       local connt = {}
-       if fs.access("/proc/net/nf_conntrack", "r") then
-               for line in io.lines("/proc/net/nf_conntrack") do
-                       line = line:match "^(.-( [^ =]+=).-)%2"
-                       local entry, flags = _parse_mixed_record(line, " +")
-                       if flags[6] ~= "TIME_WAIT" then
-                               entry.layer3 = flags[1]
-                               entry.layer4 = flags[3]
-                               for i=1, #entry do
-                                       entry[i] = nil
-                               end
+       local ok, nfct = pcall(io.lines, "/proc/net/nf_conntrack")
+       if not ok or not nfct then
+               return nil
+       end
 
-                               if callback then
-                                       callback(entry)
-                               else
-                                       connt[#connt+1] = entry
+       local line, connt = nil, (not callback) and { }
+       for line in nfct do
+               local fam, l3, l4, timeout, state, tuples =
+                       line:match("^(ipv[46]) +(%d+) +%S+ +(%d+) +(%d+) +([A-Z_]+) +(.+)$")
+
+               if fam and l3 and l4 and timeout and state and tuples and
+                  state ~= "TIME_WAIT"
+               then
+                       l4 = nixio.getprotobynumber(l4)
+
+                       local entry = {
+                               bytes = 0,
+                               packets = 0,
+                               layer3 = fam,
+                               layer4 = l4 and l4.name or "unknown",
+                               timeout = tonumber(timeout, 10)
+                       }
+
+                       local key, val
+                       for key, val in tuples:gmatch("(%w+)=(%S+)") do
+                               if key == "bytes" or key == "packets" then
+                                       entry[key] = entry[key] + tonumber(val, 10)
+                               elseif key == "src" or key == "dst" or key == "sport" or key == "dport" then
+                                       if entry[key] == nil then
+                                               entry[key] = val
+                                       end
+                               elseif val then
+                                       entry[key] = val
                                end
                        end
-               end
-       elseif fs.access("/proc/net/ip_conntrack", "r") then
-               for line in io.lines("/proc/net/ip_conntrack") do
-                       line = line:match "^(.-( [^ =]+=).-)%2"
-                       local entry, flags = _parse_mixed_record(line, " +")
-                       if flags[4] ~= "TIME_WAIT" then
-                               entry.layer3 = "ipv4"
-                               entry.layer4 = flags[1]
-                               for i=1, #entry do
-                                       entry[i] = nil
-                               end
 
-                               if callback then
-                                       callback(entry)
-                               else
-                                       connt[#connt+1] = entry
-                               end
+                       if callback then
+                               callback(entry)
+                       else
+                               connt[#connt+1] = entry
                        end
                end
-       else
-               return nil
        end
-       return connt
+
+       return callback and true or connt
 end
 
 function net.devices()
@@ -581,30 +585,20 @@ function wifi.getiwinfo(ifname)
        local stat, iwinfo = pcall(require, "iwinfo")
 
        if ifname then
-               local c = 0
-               local u = uci.cursor_state()
                local d, n = ifname:match("^(%w+)%.network(%d+)")
-               if d and n then
+               local wstate = luci.util.ubus("network.wireless", "status") or { }
+
+               d = d or ifname
+               n = n and tonumber(n) or 1
+
+               if type(wstate[d]) == "table" and
+                  type(wstate[d].interfaces) == "table" and
+                  type(wstate[d].interfaces[n]) == "table" and
+                  type(wstate[d].interfaces[n].ifname) == "string"
+               then
+                       ifname = wstate[d].interfaces[n].ifname
+               else
                        ifname = d
-                       n = tonumber(n)
-                       u:foreach("wireless", "wifi-iface",
-                               function(s)
-                                       if s.device == d then
-                                               c = c + 1
-                                               if c == n then
-                                                       ifname = s.ifname or s.device
-                                                       return false
-                                               end
-                                       end
-                               end)
-               elseif u:get("wireless", ifname) == "wifi-device" then
-                       u:foreach("wireless", "wifi-iface",
-                               function(s)
-                                       if s.device == ifname and s.ifname then
-                                               ifname = s.ifname
-                                               return false
-                                       end
-                               end)
                end
 
                local t = stat and iwinfo.type(ifname)
@@ -665,28 +659,3 @@ end
 function init.stop(name)
        return (init_action("stop", name) == 0)
 end
-
-
--- Internal functions
-
-function _parse_mixed_record(cnt, delimiter)
-       delimiter = delimiter or "  "
-       local data = {}
-       local flags = {}
-
-       for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do
-               for j, f in pairs(luci.util.split(luci.util.trim(l), delimiter, nil, true)) do
-                       local k, x, v = f:match('([^%s][^:=]*) *([:=]*) *"*([^\n"]*)"*')
-
-                       if k then
-                               if x == "" then
-                                       table.insert(flags, k)
-                               else
-                                       data[k] = v
-                               end
-                       end
-               end
-       end
-
-       return data, flags
-end
index b109c71..ff13b1c 100644 (file)
@@ -105,6 +105,7 @@ TZ = {
        { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' },
        { 'America/Eirunepe', 'ACT5' },
        { 'America/El Salvador', 'CST6' },
+       { 'America/Fort Nelson', 'MST7' },
        { 'America/Fortaleza', 'BRT3' },
        { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' },
        { 'America/Godthab', 'WGT3WGST,M3.5.0/-2,M10.5.0/-1' },
@@ -388,7 +389,7 @@ TZ = {
        { 'Pacific/Efate', 'VUT-11' },
        { 'Pacific/Enderbury', 'PHOT-13' },
        { 'Pacific/Fakaofo', 'TKT-13' },
-       { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.4/75' },
+       { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.0/3' },
        { 'Pacific/Funafuti', 'TVT-12' },
        { 'Pacific/Galapagos', 'GALT6' },
        { 'Pacific/Gambier', 'GAMT9' },
@@ -404,7 +405,7 @@ TZ = {
        { 'Pacific/Midway', 'SST11' },
        { 'Pacific/Nauru', 'NRT-12' },
        { 'Pacific/Niue', 'NUT11' },
-       { 'Pacific/Norfolk', 'NFT-11:30' },
+       { 'Pacific/Norfolk', 'NFT-11' },
        { 'Pacific/Noumea', 'NCT-11' },
        { 'Pacific/Pago Pago', 'SST11' },
        { 'Pacific/Palau', 'PWT-9' },
index f156f36..53c8adb 100644 (file)
@@ -152,7 +152,7 @@ OFFSET = {
        sst   = -39600, -- SST
        nrt   =  43200, -- NRT
        nut   = -39600, -- NUT
-       nft   =  41400, -- NFT
+       nft   =  39600, -- NFT
        nct   =  39600, -- NCT
        pwt   =  32400, -- PWT
        pont  =  39600, -- PONT
index dcf8230..5bf0beb 100644 (file)
@@ -9,6 +9,7 @@ local ldebug = require "luci.debug"
 local string = require "string"
 local coroutine = require "coroutine"
 local tparser = require "luci.template.parser"
+local json = require "luci.jsonc"
 
 local _ubus = require "ubus"
 local _ubus_connection = nil
@@ -150,6 +151,28 @@ function striptags(value)
        return value and tparser.striptags(tostring(value))
 end
 
+-- for bash, ash and similar shells single-quoted strings are taken
+-- literally except for single quotes (which terminate the string)
+-- (and the exception noted below for dash (-) at the start of a
+-- command line parameter).
+function shellsqescape(value)
+   local res
+   res, _ = string.gsub(res, "'", "'\\''")
+   return res
+end
+
+-- bash, ash and other similar shells interpret a dash (-) at the start
+-- of a command-line parameters as an option indicator regardless of
+-- whether it is inside a single-quoted string.  It must be backlash
+-- escaped to resolve this.  This requires in some funky special-case
+-- handling.  It may actually be a property of the getopt function
+-- rather than the shell proper.
+function shellstartsqescape(value)
+   res, _ = string.gsub(value, "^\-", "\\-")
+   res, _ = string.gsub(res, "^-", "\-")
+   return shellsqescape(value)
+end
+
 -- containing the resulting substrings. The optional max parameter specifies
 -- the number of bytes to process, regardless of the actual length of the given
 -- string. The optional last parameter, regex, specifies whether the separator
@@ -600,55 +623,11 @@ function ubus(object, method, data)
 end
 
 function serialize_json(x, cb)
-       local rv, push = nil, cb
-       if not push then
-               rv = { }
-               push = function(tok) rv[#rv+1] = tok end
-       end
-
-       if x == nil then
-               push("null")
-       elseif type(x) == "table" then
-               -- test if table is array like
-               local k, v
-               local n1, n2 = 0, 0
-               for k in pairs(x) do n1 = n1 + 1 end
-               for k in ipairs(x) do n2 = n2 + 1 end
-
-               if n1 == n2 and n1 > 0 then
-                       push("[")
-                       for k = 1, n2 do
-                               if k > 1 then
-                                       push(",")
-                               end
-                               serialize_json(x[k], push)
-                       end
-                       push("]")
-               else
-                       push("{")
-                       for k, v in pairs(x) do
-                               push("%q:" % tostring(k))
-                               serialize_json(v, push)
-                               if next(x, k) then
-                                       push(",")
-                               end
-                       end
-                       push("}")
-               end
-       elseif type(x) == "number" or type(x) == "boolean" then
-               if (x ~= x) then
-                       -- NaN is the only value that doesn't equal to itself.
-                       push("Number.NaN")
-               else
-                       push(tostring(x))
-               end
+       local js = json.stringify(x)
+       if type(cb) == "function" then
+               cb(js)
        else
-               push('"%s"' % tostring(x):gsub('["%z\1-\31\\]',
-                       function(c) return '\\u%04x' % c:byte(1) end))
-       end
-
-       if not cb then
-               return table.concat(rv, "")
+               return js
        end
 end
 
index 1814c93..daa57c1 100644 (file)
@@ -4,10 +4,10 @@
        <script type="text/javascript">//<![CDATA[
                var apply_xhr = new XHR();
 
-               apply_xhr.get('<%=luci.dispatcher.build_url("servicectl", "restart", table.concat(configs, ","))%>', null,
+               apply_xhr.post('<%=url('servicectl/restart', table.concat(configs, ","))%>', { token: '<%=token%>' },
                        function() {
                                var checkfinish = function() {
-                                       apply_xhr.get('<%=luci.dispatcher.build_url("servicectl", "status")%>', null,
+                                       apply_xhr.get('<%=url('servicectl/status')%>', null,
                                                function(x) {
                                                        if( x.responseText == 'finish' )
                                                        {
index e4a4077..a181201 100644 (file)
@@ -2,6 +2,6 @@
 <%+cbi/valueheader%>
        <input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
        <script type="text/javascript">
-cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=luci.dispatcher.build_url("admin", "filebrowser")%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
+cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
        </script>
 <%+cbi/valuefooter%>
index fd626a4..e936c0c 100644 (file)
@@ -15,7 +15,9 @@
 <script type="text/javascript">
 cbi_dynlist_init(
        '<%=cbid%>', '<%=resource%>', '<%=self.datatype%>',
-       <%=tostring(self.optional or self.rmempty)%>
+       <%=tostring(self.optional or self.rmempty)%>,
+       '<%=url('admin/filebrowser')%>',
+       '<%=self.default_path and self.default_path%>'
        <%- if #self.keylist > 0 then -%>, [{
                <%- for i, k in ipairs(self.keylist) do -%>
                        <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>
index 2acb969..75ec108 100644 (file)
@@ -1,5 +1,5 @@
 <div class="cbi-map" id="cbi-<%=self.config%>">
-       <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+       <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
        <% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
 
        <p class="alert-message danger">
index 2bddaba..302df1d 100644 (file)
@@ -2,6 +2,7 @@
 <form method="post" name="cbi" action="<%=REQUEST_URI%>" enctype="multipart/form-data" onreset="return cbi_validate_reset(this)" onsubmit="return cbi_validate_form(this, '<%:Some fields are invalid, cannot save values!%>')">
        <div>
                <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+               <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="cbi.submit" value="1" />
                <input type="submit" value="<%:Save%>" class="hidden" />
        </div>
index 053220d..e90c3f5 100644 (file)
@@ -5,7 +5,7 @@
 <%-+cbi/apply_xhr-%>
 
 <div class="cbi-map" id="cbi-<%=self.config%>">
-       <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+       <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
        <% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
        <%- if firstmap and applymap then cbi_apply_xhr(self.config, parsechain, redirect) end -%>
        <%- self:render_children() %>
index 6a0b388..5d09261 100644 (file)
@@ -12,7 +12,7 @@
        c = c + 1
 %>
        <input class="cbi-input-checkbox" type="checkbox" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= attr("id", cbid..c) .. attr("name", cbid) .. attr("value", key) .. ifattr(luci.util.contains(v, key), "checked", "checked") %> />
-       <label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label><br />
+       <label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label><% if not self.oneline then %><br /><% else %> <% end %>
 <% if c == self.size then c = 0 %><br />
 <% end end %>
 <% end %>
index 5216cd5..78f5c5a 100644 (file)
@@ -2,11 +2,12 @@
 <form method="post" enctype="multipart/form-data" action="<%=REQUEST_URI%>">
        <div>
                <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+               <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="cbi.submit" value="1" />
        </div>
 <% end %>
        <div class="cbi-map" id="cbi-<%=self.config%>">
-               <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+               <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
                <% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
                <% self:render_children() %>
                <br />
index 7770934..157f3b3 100644 (file)
@@ -6,9 +6,19 @@
 <%+cbi/valueheader%>
        <% if s then %>
                <%:Uploaded File%> (<%=t.byte_format(s.size)%>)
-               <input type="hidden"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
-               <input class="cbi-button cbi-input-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
-       <% else %>
+                <% if self.unsafeupload then %>
+                   <input type="hidden"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
+                   <input class="cbi-button cbi-input-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
+                <% end %>
+       <% end %>
+
+        <% if not self.unsafeupload then %>
+               <input type="hidden"<%= attr("value", v) .. attr("name", "cbi.rlf." .. section .. "." .. self.option) .. attr("id", "cbi.rlf." .. section .. "." .. self.option) %> />
+       <% end %>
+               
+       <% if (not s) or (s and not self.unsafeupload) then %>
                <input class="cbi-input-file" type="file"<%= attr("name", cbid) .. attr("id", cbid) %> />
        <% end %>
+       <input type="text" class="cbi-input-text" onchange="cbi_d_update(this.id)"<%=
+               attr("name", cbid .. ".textbox") .. attr("id", cbid .. ".textbox") .. attr("value", luci.cbi.AbstractValue.cfgvalue(self, section) or self.default) .. ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder") .. ifattr(self.readonly, "readonly") .. ifattr(self.maxlength, "maxlength") %> />
 <%+cbi/valuefooter%>
index d1a7bea..c43dab5 100644 (file)
@@ -1,7 +1,8 @@
 <%+cbi/valueheader%>
        <input type="<%=self.password and 'password" class="cbi-input-password' or 'text" class="cbi-input-text' %>" onchange="cbi_d_update(this.id)"<%=
                attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
-               ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
+               ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder") ..
+               ifattr(self.readonly, "readonly") .. ifattr(self.maxlength, "maxlength")
        %> />
        <% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
        <% if #self.keylist > 0 or self.datatype then -%>
@@ -28,7 +29,7 @@
                <%- end -%>');
                <%- end %>
                <% if self.datatype then -%>
-               cbi_validate_field('<%=cbid%>', <%=tostring((self.optional or self.rmempty) == true)%>, '<%=self.datatype:gsub("'", "\\'")%>');
+               cbi_validate_field('<%=cbid%>', <%=tostring((self.optional or self.rmempty) == true)%>, '<%=self.datatype:gsub("\\", "\\\\"):gsub("'", "\\'")%>');
                <%- end %>
        //]]></script>
        <% end -%>
diff --git a/modules/luci-base/luasrc/view/csrftoken.htm b/modules/luci-base/luasrc/view/csrftoken.htm
new file mode 100644 (file)
index 0000000..57ac03f
--- /dev/null
@@ -0,0 +1,24 @@
+<%#
+ Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<h2 name="content"><%:Form token mismatch%></h2>
+<br />
+
+<p class="alert-message"><%:The submitted security token is invalid or already expired!%></p>
+
+<p><%:
+       In order to prevent unauthorized access to the system, your request has
+       been blocked. Click "Continue »" below to return to the previous page.
+%></p>
+
+<hr />
+
+<p class="right">
+       <strong><a href="#" onclick="window.history.back();">Continue »</a></strong>
+</p>
+
+<%+footer%>
index c2be29e..bc74226 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content">404 <%:Not Found%></a></h2>
+<h2 name="content">404 <%:Not Found%></h2>
 <p><%:Sorry, the object you requested was not found.%></p>
 <tt><%:Unable to dispatch%>: <%=luci.http.request.env.PATH_INFO%></tt>
 <%+footer%>
index 8fb18ed..34a52cd 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content">500 <%:Internal Server Error%></a></h2>
+<h2 name="content">500 <%:Internal Server Error%></h2>
 <p><%:Sorry, the server encountered an unexpected error.%></p>
 <pre class="error500"><%=message%></pre>
 <%+footer%>
index 7f0f0a6..e207504 100644 (file)
@@ -8,7 +8,7 @@
 
 <form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
        <div class="cbi-map">
-               <h2><a id="content" name="content"><%:Authorization Required%></a></h2>
+               <h2 name="content"><%:Authorization Required%></h2>
                <div class="cbi-map-descr">
                        <%:Please enter your username and password.%>
                        <%- if fuser then %>
index 2252e7c..c77bf5f 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Càrrega d'1 minut:"
 msgid "15 Minute Load:"
 msgstr "Càrrega de 15 minuts:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Càrrega de 5 minuts:"
 
@@ -207,6 +210,9 @@ msgstr "Afegeix una interfície nova..."
 msgid "Additional Hosts files"
 msgstr "Fitxers de Hosts addicionals"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adreça"
 
@@ -269,6 +275,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -325,6 +337,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponible"
 
@@ -334,6 +361,9 @@ msgstr "Paquets disponibles"
 msgid "Average:"
 msgstr "Mitjana:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -410,6 +440,11 @@ msgstr "Controlador sense fil Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr "En memòria intermèdia"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Botons"
 
@@ -446,6 +481,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Comprovació"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Suma de verificació"
 
@@ -563,6 +601,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -638,9 +684,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Suprimeix"
 
-msgid "Delete this interface"
-msgstr "Suprimeix aquesta interfície"
-
 msgid "Delete this network"
 msgstr "Suprimeix aquesta xarxa"
 
@@ -659,6 +702,12 @@ msgstr "Dispositiu"
 msgid "Device Configuration"
 msgstr "Configuració de dispositiu"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnòstics"
 
@@ -699,6 +748,9 @@ msgstr "Optimització de distància"
 msgid "Distance to farthest network member in meters."
 msgstr "Distància al membre de la xarxa més allunyat en metres."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversitat"
 
@@ -769,6 +821,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Mètode EAP"
 
@@ -877,6 +932,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Fast Frames"
 
@@ -898,6 +956,11 @@ msgstr "Filtra privat"
 msgid "Filter useless"
 msgstr "Filtra els no útils"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Troba i uneix-te a la xarxa"
 
@@ -922,9 +985,6 @@ msgstr "Versió de microprogramari"
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr "Flags"
-
 msgid "Flash Firmware"
 msgstr "Reescriu el microprogramari"
 
@@ -955,6 +1015,9 @@ msgstr "Força el TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Força el TKIP i el CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Reenvia el tràfic DHCP"
 
@@ -994,6 +1057,12 @@ msgstr "Ajusts generals"
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -1005,6 +1074,9 @@ msgstr ""
 "La contrasenya i la confirmació de contrasenya no es coincideixen. La "
 "contrasenya no s'ha canviat!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1105,6 +1177,9 @@ msgstr "Màscara de xarxa IPv4"
 msgid "IPv4 only"
 msgstr "Només IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Longitud de prefix IPv4"
 
@@ -1200,8 +1275,8 @@ msgstr ""
 "es pot accedir al dispositiu d'intercanvi amb unes taxes tan altes com les "
 "de la <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignora <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignora la interfície"
@@ -1215,6 +1290,11 @@ msgstr "Imatge"
 msgid "In"
 msgstr "En"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Temps d'espera d'inactivitat"
 
@@ -1396,6 +1476,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1417,6 +1500,9 @@ msgstr "Carrega mitjana"
 msgid "Loading"
 msgstr "Carregant"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Adreça IPv4 local"
 
@@ -1484,6 +1570,9 @@ msgstr "Filtre MAC"
 msgid "MAC-List"
 msgstr "Llista MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1498,6 +1587,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Velocitat màxima"
 
@@ -1516,6 +1608,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1583,12 +1680,18 @@ msgstr ""
 "Els punts de muntatge defineixen en quin punt un dispositiu de memòria "
 "s'adjuntarà amb el sistema de fitxers"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Opcions de muntatge"
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Sistemes de fitxers muntats"
 
@@ -1607,6 +1710,9 @@ msgstr "Adreça de difusió selectiva"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1706,6 +1812,9 @@ msgstr "No connectat"
 msgid "Note: Configuration files will be erased."
 msgstr "Nota: Els fitxers de configuració s'esborraran."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Avís"
 
@@ -1834,9 +1943,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Es requereix el paquet libiwinfo!"
 
@@ -1864,9 +1982,6 @@ msgstr "Contrasenya de la clau privada"
 msgid "Password successfully changed!"
 msgstr "La contrasenya s'ha canviat amb èxit!"
 
-msgid "Path"
-msgstr "Ruta"
-
 msgid "Path to CA-Certificate"
 msgstr "Ruta als Certificats CA"
 
@@ -1882,6 +1997,9 @@ msgstr ""
 msgid "Peak:"
 msgstr "Màxim:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Executa un reinici"
 
@@ -1903,9 +2021,6 @@ msgstr "Paquets"
 msgid "Please enter your username and password."
 msgstr "Si us plau entra el teu nom d'usuari i contrasenya."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Si us plau espera: Dispositiu arrancant-se de nou"
-
 msgid "Policy"
 msgstr "Política"
 
@@ -2173,9 +2288,6 @@ msgstr ""
 "Les rutes especifiquen per quina interfície i passarel·la es pot arribar a "
 "un cert ordinador o xarxa."
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2193,6 +2305,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Accés SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Claus SSH"
 
@@ -2282,6 +2403,9 @@ msgstr "Senyal:"
 msgid "Size"
 msgstr "Mida"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Salta"
 
@@ -2545,6 +2669,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "El protocol seleccionat necessita un dispositiu assignat"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2602,6 +2729,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2761,6 +2894,9 @@ msgstr "La contrasenya no s'ha canviat a causa d'un error desconegut!"
 msgid "Unmanaged"
 msgstr "Sense gestionar"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Canvis sense desar"
 
@@ -2920,13 +3056,14 @@ msgstr "Esperant que s'apliquin els canvis..."
 msgid "Waiting for command to complete..."
 msgstr "Esperant que s'acabi l'ordre..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Advertència"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Advertència: Hi ha canvis que no s'han desat i que es perdran mentre "
-"s'arranca de nou!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3159,6 +3296,24 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Enrere"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Suprimeix aquesta interfície"
+
+#~ msgid "Flags"
+#~ msgstr "Flags"
+
+#~ msgid "Path"
+#~ msgstr "Ruta"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Si us plau espera: Dispositiu arrancant-se de nou"
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advertència: Hi ha canvis que no s'han desat i que es perdran mentre "
+#~ "s'arranca de nou!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -3804,9 +3959,6 @@ msgstr "« Enrere"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Ací pots configurar els dispositius sense fils instal·lats."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignora <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independent (Ad-Hoc)"
 
index 3736020..9856720 100644 (file)
@@ -44,6 +44,9 @@ msgstr "Zatížení za 1 minutu:"
 msgid "15 Minute Load:"
 msgstr "Zatížení za 15 minut:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Zatížení za 5 minut:"
 
@@ -207,6 +210,9 @@ msgstr "Přidat rozhraní..."
 msgid "Additional Hosts files"
 msgstr "Dodatečné Hosts soubory"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresa"
 
@@ -269,6 +275,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Anténa 1"
 
@@ -325,6 +337,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Dostupné"
 
@@ -334,6 +361,9 @@ msgstr "Dostupné balíčky"
 msgid "Average:"
 msgstr "Průměr:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -409,6 +439,11 @@ msgstr "Broadcom modul BCM%04x 802.11 bezdrátový ovladač"
 msgid "Buffered"
 msgstr "Bufferováno"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Tlačítka"
 
@@ -445,6 +480,9 @@ msgstr "Kanál"
 msgid "Check"
 msgstr "Kontrola"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Kontrolní součet"
 
@@ -567,6 +605,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -644,9 +690,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Odstranit"
 
-msgid "Delete this interface"
-msgstr "Odstranit toto rozhraní"
-
 msgid "Delete this network"
 msgstr "Odstranit tuto síť"
 
@@ -665,6 +708,12 @@ msgstr "Zařízení"
 msgid "Device Configuration"
 msgstr "Nastavení zařízení"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostika"
 
@@ -705,6 +754,9 @@ msgstr "Optimalizace na vzdálenost"
 msgid "Distance to farthest network member in meters."
 msgstr "Vzdálenost nejodlehlejšího člena sítě v metrech."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diverzita"
 
@@ -779,6 +831,9 @@ msgstr ""
 "Pro klienty alokovat DHCP adresy dynamicky. Pokud je volba zakázána, budou "
 "obsloužení pouze klienti se statickými výpůjčkami."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Metoda EAP"
 
@@ -889,6 +944,9 @@ msgstr "Externí protokolovací server"
 msgid "External system log server port"
 msgstr "Port externího protokolovacího serveru"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Rychlé rámce"
 
@@ -910,6 +968,11 @@ msgstr "Filtrovat soukromé"
 msgid "Filter useless"
 msgstr "Filtrovat nepotřebné"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Vyhledat a připojit síť"
 
@@ -934,9 +997,6 @@ msgstr "Verze firmwaru"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Pevný zdrojový port pro odchozí DNS dotazy"
 
-msgid "Flags"
-msgstr "Příznaky"
-
 msgid "Flash Firmware"
 msgstr "Nahrát firmware"
 
@@ -967,6 +1027,9 @@ msgstr "Vynutit TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Vynutit TKIP a CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Přeposílat DHCP provoz"
 
@@ -1006,6 +1069,12 @@ msgstr "Obecná nastavení"
 msgid "General Setup"
 msgstr "Obecné nastavení"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Vytvorǐt archív"
 
@@ -1015,6 +1084,9 @@ msgstr "Generic 802.11%s Wireless Controller"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "Heslo nezměněno z důvodu nesouhlasu nového hesla a ověření hesla!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1116,6 +1188,9 @@ msgstr "IPv4 maska sítě"
 msgid "IPv4 only"
 msgstr "Pouze IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Délka IPv4 prefixu"
 
@@ -1211,8 +1286,8 @@ msgstr ""
 "přístup na odkládací zařízení je řádově pomalejší, než přístup do paměti "
 "<abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorovat soubory Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "Ignorovat rozhraní"
@@ -1226,6 +1301,11 @@ msgstr "Obraz"
 msgid "In"
 msgstr "Dovnitř"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Časový limit nečinnosti"
 
@@ -1411,6 +1491,9 @@ msgstr ""
 "Seznam <abbr title=\"Domain Name System\">DNS</abbr> serverů, na které "
 "přeposílat požadavky"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Seznam domén, pro které povolit odpovědi podle RFC1918"
 
@@ -1433,6 +1516,9 @@ msgstr "Zátěž průměrná"
 msgid "Loading"
 msgstr "Načítání"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Místní IPv4 adresa"
 
@@ -1506,6 +1592,9 @@ msgstr "Filtr MAC"
 msgid "MAC-List"
 msgstr "Seznam Mac"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1520,6 +1609,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Nejvyšší míra"
 
@@ -1538,6 +1630,11 @@ msgstr "Nejvyšší počet sekund čekání, než bude modem připraven"
 msgid "Maximum hold time"
 msgstr "Maximální doba držení"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Maximální počet zapůjčených adres."
 
@@ -1605,12 +1702,18 @@ msgstr ""
 "Přípojný bod určuje místo v souborovém systému, na kterém bude připojeno "
 "paměťové zařízení"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Volby připojení"
 
 msgid "Mount point"
 msgstr "Přípojný bod"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Připojené souborové systémy"
 
@@ -1629,6 +1732,9 @@ msgstr "Adresa vícesměrového vysílání"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1728,6 +1834,9 @@ msgstr "Nepřipojeno"
 msgid "Note: Configuration files will be erased."
 msgstr "Pozn: Konfigurační soubory budou vymazány."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Oznámení"
 
@@ -1857,9 +1966,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Vyžadován balíček libiwinfo!"
 
@@ -1887,9 +2005,6 @@ msgstr "Heslo privátního klíče"
 msgid "Password successfully changed!"
 msgstr "Heslo bylo úspěšně změněno!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "Cesta k certifikátu CA"
 
@@ -1905,6 +2020,9 @@ msgstr "Cesta ke spustitelnému souboru, který obsluhuje událost tlačítka"
 msgid "Peak:"
 msgstr "Špička:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Provést restart"
 
@@ -1926,9 +2044,6 @@ msgstr "Paketů"
 msgid "Please enter your username and password."
 msgstr "Prosím vložte vaše uživatelské jméno a heslo."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Prosím počkejte: Provádím reboot..."
-
 msgid "Policy"
 msgstr "Politika"
 
@@ -2211,9 +2326,6 @@ msgid ""
 msgstr ""
 "Trasy určují, přes jaké rozhraní a bránu může být konkrétního hosta dosaženo."
 
-msgid "Rule #"
-msgstr "Pravidlo #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Spustit kontrolu souborového systému před připojením zařízení"
 
@@ -2231,6 +2343,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Přístup přes SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH klíče"
 
@@ -2322,6 +2443,9 @@ msgstr "Signál:"
 msgid "Size"
 msgstr "Velikost"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Přeskočit"
 
@@ -2608,6 +2732,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Vybraný protokol potřebuje mít přiřazeno zařízení"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2667,6 +2794,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2828,6 +2961,9 @@ msgstr "Neznámá chyba, heslo nebylo změněno!"
 msgid "Unmanaged"
 msgstr "Nespravovaný"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Neuložené změny"
 
@@ -2993,11 +3129,14 @@ msgstr "Čekání na realizaci změn..."
 msgid "Waiting for command to complete..."
 msgstr "Čekání na dokončení příkazu..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Varování"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Varování: Existují neuložené změny, které budou rebootem ztraceny!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3227,6 +3366,25 @@ msgstr "ano"
 msgid "« Back"
 msgstr "« Zpět"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Odstranit toto rozhraní"
+
+#~ msgid "Flags"
+#~ msgstr "Příznaky"
+
+#~ msgid "Rule #"
+#~ msgstr "Pravidlo #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorovat soubory Hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Prosím počkejte: Provádím reboot..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Varování: Existují neuložené změny, které budou rebootem ztraceny!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index 361abde..14cf497 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Systemlast (1 Minute):"
 msgid "15 Minute Load:"
 msgstr "Systemlast (15 Minuten):"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Systemlast (5 Minuten):"
 
@@ -204,6 +207,9 @@ msgstr "Neue Schnittstelle hinzufügen..."
 msgid "Additional Hosts files"
 msgstr "Zusätzliche Hosts-Dateien"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresse"
 
@@ -269,6 +275,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antenne 1"
 
@@ -325,6 +337,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Verfügbar"
 
@@ -334,6 +361,9 @@ msgstr "Verfügbare Pakete"
 msgid "Average:"
 msgstr "Durchschnitt:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -410,6 +440,11 @@ msgstr "Broadcom BCM%04x 802.11 W-LAN Adapter"
 msgid "Buffered"
 msgstr "Gepuffert"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Knöpfe"
 
@@ -446,6 +481,9 @@ msgstr "Kanal"
 msgid "Check"
 msgstr "Prüfen"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Prüfsumme"
 
@@ -565,6 +603,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist."
@@ -640,9 +686,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Löschen"
 
-msgid "Delete this interface"
-msgstr "Diese Schnittstelle löschen"
-
 msgid "Delete this network"
 msgstr "Dieses Netzwerk löschen"
 
@@ -661,6 +704,12 @@ msgstr "Gerät"
 msgid "Device Configuration"
 msgstr "Gerätekonfiguration"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosen"
 
@@ -701,6 +750,9 @@ msgstr "Distanzoptimierung"
 msgid "Distance to farthest network member in meters."
 msgstr "Distanz zum am weitesten entfernten Funkpartner in Metern."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversität"
 
@@ -775,6 +827,9 @@ msgstr ""
 "DHCP Adressen dynamisch erzeugen. Wenn dies deaktiviert ist, werden nur "
 "Clients mit konfigurierten statischen Leases bedient"
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Methode"
 
@@ -886,6 +941,9 @@ msgstr "Externer Protokollserver IP"
 msgid "External system log server port"
 msgstr "Externer Protokollserver Port"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Schnelle Frames"
 
@@ -907,6 +965,11 @@ msgstr "Private Anfragen filtern"
 msgid "Filter useless"
 msgstr "Windowsanfragen filtern"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Suchen und Verbinden von Netzwerken"
 
@@ -931,9 +994,6 @@ msgstr "Firmware Version"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Fester Port für ausgehende DNS-Anfragen"
 
-msgid "Flags"
-msgstr "Parameter"
-
 msgid "Flash Firmware"
 msgstr "Firmware aktualisieren"
 
@@ -966,6 +1026,9 @@ msgstr "Erzwinge TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Erzwinge TKIP und CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "DHCP Traffic weiterleiten"
 
@@ -1005,6 +1068,12 @@ msgstr "Allgemeine Einstellungen"
 msgid "General Setup"
 msgstr "Allgemeine Einstellungen"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Sicherung erstellen"
 
@@ -1016,6 +1085,9 @@ msgstr ""
 "Die angegebenen Passwörter stimmen nicht überein, das Systempasswort wurde "
 "nicht geändert!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1116,6 +1188,9 @@ msgstr "IPv4 Netzmaske"
 msgid "IPv4 only"
 msgstr "nur IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Länge des IPv4 Präfix"
 
@@ -1213,8 +1288,8 @@ msgstr ""
 "effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten "
 "ist natürlich bedeutend langsamer als direkte Arbeitsspeicherzugriffe."
 
-msgid "Ignore Hosts files"
-msgstr "Hosts-Dateien ignorieren"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignoriere /etc/hosts"
 
 msgid "Ignore interface"
 msgstr "Schnittstelle ignorieren"
@@ -1228,6 +1303,11 @@ msgstr "Image"
 msgid "In"
 msgstr "Ein"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Timeout bei Inaktivität"
 
@@ -1412,6 +1492,9 @@ msgstr ""
 "Liste von <abbr title=\"Domain Name System\">DNS</abbr>-Servern an welche "
 "Requests weitergeleitet werden"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Liste von Domains für welche RFC1918-Antworten erlaubt sind"
 
@@ -1435,6 +1518,9 @@ msgstr "Durchschnittslast"
 msgid "Loading"
 msgstr "Lade"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Lokale IPv4 Adresse"
 
@@ -1510,6 +1596,9 @@ msgstr "MAC-Filter"
 msgid "MAC-List"
 msgstr "MAC-Adressliste"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1524,6 +1613,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Höchstübertragungsrate"
 
@@ -1542,6 +1634,11 @@ msgstr "Maximale Zeit die gewartet wird bis das Modem bereit ist (in Sekunden)"
 msgid "Maximum hold time"
 msgstr "Maximalzeit zum Halten der Verbindung"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Maximal zulässige Anzahl von vergeben DHCP-Adressen"
 
@@ -1609,12 +1706,18 @@ msgstr ""
 "Einhängepunkte bestimmen, an welcher Stelle des Dateisystems bestimmte "
 "Laufwerke und Speicher zur Verwendung eingebunden werden."
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Mount-Optionen"
 
 msgid "Mount point"
 msgstr "Mountpunkt"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Eingehängte Dateisysteme"
 
@@ -1633,6 +1736,9 @@ msgstr "Multicast-Adresse"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1733,6 +1839,9 @@ msgstr "Nicht verbunden"
 msgid "Note: Configuration files will be erased."
 msgstr "Warnung: Konfigurationsdateien werden gelöscht."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Notiz"
 
@@ -1863,9 +1972,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Benötige das libiwinfo Paket!"
 
@@ -1893,9 +2011,6 @@ msgstr "Passwort des Privaten Schlüssels"
 msgid "Password successfully changed!"
 msgstr "Passwort erfolgreich geändert!"
 
-msgid "Path"
-msgstr "Pfad"
-
 msgid "Path to CA-Certificate"
 msgstr "Pfad zum CA-Zertifikat"
 
@@ -1911,6 +2026,9 @@ msgstr "Ausführbare Datei welche das Schalter-Ereignis verarbeitet"
 msgid "Peak:"
 msgstr "Spitze:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Neustart durchführen"
 
@@ -1932,9 +2050,6 @@ msgstr "Pkte."
 msgid "Please enter your username and password."
 msgstr "Bitte Benutzernamen und Passwort eingeben."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Bitte warten: Neustart wird durchgeführt..."
-
 msgid "Policy"
 msgstr "Standardregel"
 
@@ -2219,9 +2334,6 @@ msgstr ""
 "Netzwerkrouten geben an, über welche Schnittstellen bestimmte Rechner oder "
 "Netzwerke erreicht werden können"
 
-msgid "Rule #"
-msgstr "Regel #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Vor dem Einhängen Dateisystemprüfung starten "
 
@@ -2239,6 +2351,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH-Zugriff"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-Schlüssel"
 
@@ -2330,6 +2451,9 @@ msgstr "Signal:"
 msgid "Size"
 msgstr "Größe"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Überspringen"
 
@@ -2623,6 +2747,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Dem ausgewähltem Protokoll muss ein Gerät zugeordnet werden"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2684,6 +2811,12 @@ msgid "This IPv4 address of the relay"
 msgstr "IPv4-Adresse des Relais"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2852,6 +2985,9 @@ msgstr "Unbekannter Fehler, Passwort nicht geändert!"
 msgid "Unmanaged"
 msgstr "Ignoriert"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Ungespeicherte Änderungen"
 
@@ -3018,13 +3154,14 @@ msgstr "Änderungen werden angewandt..."
 msgid "Waiting for command to complete..."
 msgstr "Der Befehl wird ausgeführt..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Warnung"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart verloren "
-"gehen!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3254,6 +3391,30 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Zurück"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Diese Schnittstelle löschen"
+
+#~ msgid "Flags"
+#~ msgstr "Parameter"
+
+#~ msgid "Rule #"
+#~ msgstr "Regel #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Hosts-Dateien ignorieren"
+
+#~ msgid "Path"
+#~ msgstr "Pfad"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Bitte warten: Neustart wird durchgeführt..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart "
+#~ "verloren gehen!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -4143,9 +4304,6 @@ msgstr "« Zurück"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignoriere /etc/hosts"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Unabhängig (Ad-Hoc)"
 
index ed3a207..685cbe6 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Φορτίο 1 λεπτού:"
 msgid "15 Minute Load:"
 msgstr "Φορτίο 15 λεπτών:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Φορτίο 5 λεπτών:"
 
@@ -209,6 +212,9 @@ msgstr "Προσθήκη νέας διεπαφής..."
 msgid "Additional Hosts files"
 msgstr "Επιπλέον αρχεία Hosts"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Διεύθυνση"
 
@@ -276,6 +282,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Κεραία 1"
 
@@ -332,6 +344,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Διαθέσιμο"
 
@@ -341,6 +368,9 @@ msgstr "Διαθέσιμα πακέτα"
 msgid "Average:"
 msgstr "Μέσος Όρος:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -418,6 +448,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Κουμπιά"
 
@@ -454,6 +489,9 @@ msgstr "Κανάλι"
 msgid "Check"
 msgstr "Έλεγχος"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Άθροισμα Ελέγχου"
 
@@ -576,6 +614,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -653,9 +699,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Διαγραφή"
 
-msgid "Delete this interface"
-msgstr "Διαγραφή αυτής της διεπαφής"
-
 msgid "Delete this network"
 msgstr "Διαγραφή αυτού του δικτύου"
 
@@ -674,6 +717,12 @@ msgstr "Συσκευή"
 msgid "Device Configuration"
 msgstr "Παραμετροποίηση Συσκευής"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Διαγνωστικά"
 
@@ -714,6 +763,9 @@ msgstr "Βελτιστοποίηση Απόστασης"
 msgid "Distance to farthest network member in meters."
 msgstr "Απόσταση σε μέτρα από το πιο απομακρυσμένο μέλος του δικτύου."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Διαφορική Λήψη"
 
@@ -791,6 +843,9 @@ msgstr ""
 "Δυναμική απόδοση DHCP διευθύνσεων στους πελάτες. Σε περίπτωση "
 "απενεργοποίησης, μόνο πελάτες με στατικα leases θα εξυπηρετούνται."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Μέθοδος EAP"
 
@@ -902,6 +957,9 @@ msgstr "Εξωτερικός εξυπηρετητής καταγραφής συ
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Γρήγορα Πλαίσια"
 
@@ -923,6 +981,11 @@ msgstr "Φιλτράρισμα ιδιωτικών"
 msgid "Filter useless"
 msgstr "Φιλτράρισμα άχρηστων"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Εύρεση και σύνδεση σε δίκτυο"
 
@@ -947,9 +1010,6 @@ msgstr "Έκδοση Υλικολογισμικού"
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr "Σημαίες"
-
 msgid "Flash Firmware"
 msgstr "Φλασάρισμα Firmware"
 
@@ -981,6 +1041,9 @@ msgstr "Επιβολή TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Επιβολή TKIP και CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Προώθηση κίνησης DHCP"
 
@@ -1020,6 +1083,12 @@ msgstr "Γενικές Ρυθμίσεις"
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -1029,6 +1098,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1129,6 +1201,9 @@ msgstr "Μάσκα IPv4"
 msgid "IPv4 only"
 msgstr "Μόνο IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1228,8 +1303,8 @@ msgstr ""
 "προσπελαστεί με τους υψηλούς ρυθμούς μεταφοράς δεδομένων που διαθέτει η "
 "<abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Αγνόησε <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Αγνόησε διεπαφή"
@@ -1243,6 +1318,11 @@ msgstr ""
 msgid "In"
 msgstr "Είσοδος"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1424,6 +1504,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1445,6 +1528,9 @@ msgstr "Μέσος όρος φόρτου"
 msgid "Loading"
 msgstr "Φόρτωση"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Τοπική διεύθυνση IPv4"
 
@@ -1512,6 +1598,9 @@ msgstr "MAC-Φίλτρο"
 msgid "MAC-List"
 msgstr "Λίστα MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1526,6 +1615,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Μέγιστος Ρυθμός"
 
@@ -1545,6 +1637,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr "Μέγιστος χρόνος κράτησης"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Μέγιστος αριθμός διευθύνσεων lease"
 
@@ -1613,12 +1710,18 @@ msgstr ""
 "Τα σημεία προσάρτησης ορίζουν σε ποιο σημείο στο σύστημα αρχείων θα "
 "προσαρτηθεί μία συσκευή μνήμης"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Επιλογές προσάρτησης"
 
 msgid "Mount point"
 msgstr "Σημείο προσάρτησης"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Προσαρτημένα συστήματα αρχείων"
 
@@ -1637,6 +1740,9 @@ msgstr "Διεύθυνση Multicast"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1736,6 +1842,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr "Σημείωση: Τα αρχεία παραμετροποίησης θα διαγραφούν."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Επισήμανση"
 
@@ -1864,9 +1973,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Απαιτείται το πακέτο libiwinfo!"
 
@@ -1894,9 +2012,6 @@ msgstr "Κωδικός Πρόσβασης του Ιδιωτικού Κλειδι
 msgid "Password successfully changed!"
 msgstr "Ο κωδικός πρόσβασης άλλαξε επιτυχώς!"
 
-msgid "Path"
-msgstr "Διαδρομή"
-
 msgid "Path to CA-Certificate"
 msgstr "Διαδρομή για Πιστοποιητικό CA"
 
@@ -1912,6 +2027,9 @@ msgstr "Διαδρομή για το εκτελέσιμο που χειρίζε
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Εκτέλεση επανεκκίνησης"
 
@@ -1933,9 +2051,6 @@ msgstr "Πκτ."
 msgid "Please enter your username and password."
 msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Παρακαλώ περιμένετε: Η συσκευή επανεκκινεί..."
-
 msgid "Policy"
 msgstr "Πολιτική"
 
@@ -2205,9 +2320,6 @@ msgstr ""
 "Οι διαδρομές ορίζουν τη διεπαφή και πύλη από την οποία κάποιος υπολογιστής ή "
 "δίκτυο μπορεί να είναι προσβάσιμο/ς."
 
-msgid "Rule #"
-msgstr "Κανόνας #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Εκτέλεση ελέγχου του συστήματος αρχείων πριν προσαρτηθεί η συσκευή"
 
@@ -2225,6 +2337,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Πρόσβαση SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Κλειδιά SSH"
 
@@ -2314,6 +2435,9 @@ msgstr "Σήμα:"
 msgid "Size"
 msgstr "Μέγεθος"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Παράκαμψη"
 
@@ -2573,6 +2697,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2628,6 +2755,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2786,6 +2919,9 @@ msgstr "Άγνωστο Λάθος. ο κωδικός πρόσβασης δεν 
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Μη-αποθηκευμένες Αλλαγές"
 
@@ -2943,13 +3079,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Προειδοποίηση"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Προειδοποίηση: Υπάρχουν μη-αποθηκευμένες αλλαγές που θα χαθούν κατά την "
-"επανεκκίνηση!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3181,6 +3318,27 @@ msgstr "ναι"
 msgid "« Back"
 msgstr "« Πίσω"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Διαγραφή αυτής της διεπαφής"
+
+#~ msgid "Flags"
+#~ msgstr "Σημαίες"
+
+#~ msgid "Rule #"
+#~ msgstr "Κανόνας #"
+
+#~ msgid "Path"
+#~ msgstr "Διαδρομή"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Παρακαλώ περιμένετε: Η συσκευή επανεκκινεί..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Προειδοποίηση: Υπάρχουν μη-αποθηκευμένες αλλαγές που θα χαθούν κατά την "
+#~ "επανεκκίνηση!"
+
 #~ msgid "Configures this mount as overlay storage for block-extroot"
 #~ msgstr ""
 #~ "Ορίζει το συγκεκριμένο σημείο προσάρτησης ως επικαλύπτον αποθηκευτικό "
@@ -3851,9 +4009,6 @@ msgstr "« Πίσω"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Εδώ μπορείτε να ρυθμίσετε τις εγκατεστημένες ασύρματες συσκευές."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Αγνόησε <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Ανεξάρτητο (Ad-Hoc)"
 
index 3ad4b14..da9d9e2 100644 (file)
@@ -46,6 +46,9 @@ msgstr "1 Minute Load:"
 msgid "15 Minute Load:"
 msgstr "15 Minute Load:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "5 Minute Load:"
 
@@ -206,6 +209,9 @@ msgstr "Add new interface..."
 msgid "Additional Hosts files"
 msgstr "Additional Hosts files"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Address"
 
@@ -267,6 +273,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antenna 1"
 
@@ -323,6 +335,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Available"
 
@@ -332,6 +359,9 @@ msgstr "Available packages"
 msgid "Average:"
 msgstr "Average:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -407,6 +437,11 @@ msgstr ""
 msgid "Buffered"
 msgstr "Buffered"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Buttons"
 
@@ -443,6 +478,9 @@ msgstr "Channel"
 msgid "Check"
 msgstr "Check"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Checksum"
 
@@ -563,6 +601,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -641,9 +687,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Delete"
 
-msgid "Delete this interface"
-msgstr "Delete this interface"
-
 msgid "Delete this network"
 msgstr "Delete this network"
 
@@ -662,6 +705,12 @@ msgstr "Device"
 msgid "Device Configuration"
 msgstr "Device Configuration"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostics"
 
@@ -700,6 +749,9 @@ msgstr "Distance Optimization"
 msgid "Distance to farthest network member in meters."
 msgstr "Distance to farthest network member in meters."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversity"
 
@@ -770,6 +822,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Method"
 
@@ -878,6 +933,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Fast Frames"
 
@@ -899,6 +957,11 @@ msgstr "Filter private"
 msgid "Filter useless"
 msgstr "Filter useless"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -923,9 +986,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr "Flags"
-
 msgid "Flash Firmware"
 msgstr "Flash Firmware"
 
@@ -956,6 +1016,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -995,6 +1058,12 @@ msgstr ""
 msgid "General Setup"
 msgstr "General Setup"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -1004,6 +1073,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1103,6 +1175,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1197,8 +1272,8 @@ msgstr ""
 "slow process as the swap-device cannot be accessed with the high datarates "
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignore <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignore interface"
@@ -1212,6 +1287,11 @@ msgstr ""
 msgid "In"
 msgstr "In"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1393,6 +1473,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1414,6 +1497,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1481,6 +1567,9 @@ msgstr "MAC-Filter"
 msgid "MAC-List"
 msgstr "MAC-List"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1495,6 +1584,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Maximum Rate"
 
@@ -1513,6 +1605,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr "Maximum hold time"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1580,12 +1677,18 @@ msgstr ""
 "Mount Points define at which point a memory device will be attached to the "
 "filesystem"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Mounted file systems"
 
@@ -1604,6 +1707,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1703,6 +1809,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1831,9 +1940,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1861,9 +1979,6 @@ msgstr "Password of Private Key"
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr "Path"
-
 msgid "Path to CA-Certificate"
 msgstr "Path to CA-Certificate"
 
@@ -1879,6 +1994,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Perform reboot"
 
@@ -1900,9 +2018,6 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Please enter your username and password."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Please wait: Device rebooting..."
-
 msgid "Policy"
 msgstr "Policy"
 
@@ -2170,9 +2285,6 @@ msgstr ""
 "Routes specify over which interface and gateway a certain host or network "
 "can be reached."
 
-msgid "Rule #"
-msgstr "Rule #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2190,6 +2302,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2278,6 +2399,9 @@ msgstr ""
 msgid "Size"
 msgstr "Size"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Skip"
 
@@ -2533,6 +2657,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2588,6 +2715,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2743,6 +2876,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Unsaved Changes"
 
@@ -2902,11 +3038,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3135,6 +3274,26 @@ msgstr ""
 msgid "« Back"
 msgstr "« Back"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Delete this interface"
+
+#~ msgid "Flags"
+#~ msgstr "Flags"
+
+#~ msgid "Rule #"
+#~ msgstr "Rule #"
+
+#~ msgid "Path"
+#~ msgstr "Path"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Please wait: Device rebooting..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+
 #~ msgid "Cached"
 #~ msgstr "Cached"
 
@@ -3796,9 +3955,6 @@ msgstr "« Back"
 #~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
 #~ "define a new standalone network for this interface."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignore <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independent (Ad-Hoc)"
 
index 2c3ce94..ebf1e5f 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Carga a 1 minuto:"
 msgid "15 Minute Load:"
 msgstr "Carga a 15 minutos:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Carga a 5 minutos:"
 
@@ -210,6 +213,9 @@ msgstr "Añadir nueva interfaz..."
 msgid "Additional Hosts files"
 msgstr "Ficheros de máquinas adicionales"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Dirección"
 
@@ -273,6 +279,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -329,6 +341,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponible"
 
@@ -338,6 +365,9 @@ msgstr "Paquetes disponibles"
 msgid "Average:"
 msgstr "Media:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -414,6 +444,11 @@ msgstr "Controlador inalámbrico 802.11 BCM%04x"
 msgid "Buffered"
 msgstr "En búfer"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Botones"
 
@@ -450,6 +485,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Comprobar"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Comprobación"
 
@@ -572,6 +610,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -650,9 +696,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Eliminar"
 
-msgid "Delete this interface"
-msgstr "Borrar esta interfaz"
-
 msgid "Delete this network"
 msgstr "Borrar esta red"
 
@@ -671,6 +714,12 @@ msgstr "Dispositivo"
 msgid "Device Configuration"
 msgstr "Configuración del dispositivo"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnósticos"
 
@@ -711,6 +760,9 @@ msgstr "Optimización de distancia"
 msgid "Distance to farthest network member in meters."
 msgstr "Distancia al miembro de la red mas lejana en metros."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversidad"
 
@@ -785,6 +837,9 @@ msgstr ""
 "Reparte direcciones DHCP dinámicamente a los clientes. Si se desactiva sólo "
 "se servirá a clientes con cesiones estáticas."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Método EAP"
 
@@ -896,6 +951,9 @@ msgstr "Servidor externo de registro del sistema"
 msgid "External system log server port"
 msgstr "Puerto del servidor externo de registro del sistema"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Tramas rápidas"
 
@@ -917,6 +975,11 @@ msgstr "Filtro privado"
 msgid "Filter useless"
 msgstr "Filtro inútil"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Encontrar y unirse a red"
 
@@ -941,9 +1004,6 @@ msgstr "Versión del firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Puerto origen fijo para peticiones de DNS salientes"
 
-msgid "Flags"
-msgstr "Indicadores"
-
 msgid "Flash Firmware"
 msgstr "Grabar firmware"
 
@@ -974,6 +1034,9 @@ msgstr "Forzar TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forzar TKIP y CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Retransmitir tráfico DHCP"
 
@@ -1014,6 +1077,12 @@ msgstr "Configuración general"
 msgid "General Setup"
 msgstr "Configuración general"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Generar archivo"
 
@@ -1025,6 +1094,9 @@ msgstr ""
 "La confirmación y la contraseña no coinciden. ¡No se ha cambiado la "
 "contraseña!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1125,6 +1197,9 @@ msgstr "Máscara de red IPv4"
 msgid "IPv4 only"
 msgstr "Sólo IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Longitud de prefijo IPv4"
 
@@ -1226,8 +1301,8 @@ msgstr ""
 "alta velocidad tal y como hace la memoria <abbr title=\"Random Access Memory"
 "\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorar fichero de máquinas"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignorar interfaz"
@@ -1241,6 +1316,11 @@ msgstr "Imagen"
 msgid "In"
 msgstr "Entrada"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Espera de inactividad"
 
@@ -1425,6 +1505,9 @@ msgstr ""
 "Lista de servidores <abbr title=\"Domain Name System\">DNS</abbr> a los que "
 "enviar solicitudes"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Lista de dominios a los que se permiten respuestas RFC1918"
 
@@ -1446,6 +1529,9 @@ msgstr "Carga Media"
 msgid "Loading"
 msgstr "Cargando"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Dirección local IPv4"
 
@@ -1520,6 +1606,9 @@ msgstr "Filtro por dirección MAC"
 msgid "MAC-List"
 msgstr "Lista de direcciones MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1534,6 +1623,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Ratio Máximo"
 
@@ -1552,6 +1644,11 @@ msgstr "Segundos máximos de espera a que el módem esté activo"
 msgid "Maximum hold time"
 msgstr "Pausa máxima de transmisión"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Máximas cesiones activas."
 
@@ -1619,12 +1716,18 @@ msgstr ""
 "Los puntos de montaje definen el directorio en el que un dispositivo de "
 "memoria se unirá al sistema del archivos"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Opciones de montaje"
 
 msgid "Mount point"
 msgstr "Punto de montaje"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Sistemas de archivo montados"
 
@@ -1643,6 +1746,9 @@ msgstr "Dirección multicast"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1742,6 +1848,9 @@ msgstr "No conectado"
 msgid "Note: Configuration files will be erased."
 msgstr "Nota: se borrarán los ficheros de configuración."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Aviso"
 
@@ -1871,9 +1980,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "¡Se necesita el paquete libiwinfo!"
 
@@ -1901,9 +2019,6 @@ msgstr "Contraseña de la Clave Privada"
 msgid "Password successfully changed!"
 msgstr "¡Contraseña cambiada!"
 
-msgid "Path"
-msgstr "Ruta (path)"
-
 msgid "Path to CA-Certificate"
 msgstr "Ruta al Certificado CA"
 
@@ -1919,6 +2034,9 @@ msgstr "Ruta al ejecutable que maneja el evento button"
 msgid "Peak:"
 msgstr "Pico:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Rearrancar"
 
@@ -1940,9 +2058,6 @@ msgstr "Paq."
 msgid "Please enter your username and password."
 msgstr "Por favor, introduzca su nombre de usuario y contraseña."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Espere por favor: Rearrancando dispositivo..."
-
 msgid "Policy"
 msgstr "Política"
 
@@ -2224,9 +2339,6 @@ msgstr ""
 "Las rutas especifican sobre qué interfaz y pasarela se puede llegar a una "
 "cierta máquina o red."
 
-msgid "Rule #"
-msgstr "Nº de regla"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Comprobar el sistema de ficheros antes de montar el dispositivo"
 
@@ -2244,6 +2356,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Acceso SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Claves SSH"
 
@@ -2335,6 +2456,9 @@ msgstr "Señal:"
 msgid "Size"
 msgstr "Tamaño"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Saltar"
 
@@ -2629,6 +2753,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Este protocolo necesita estar asignado a un dispositivo"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2689,6 +2816,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Dirección IPv4 del relé"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2853,6 +2986,9 @@ msgstr "Error desconocido, ¡no se ha cambiado la contraseña!"
 msgid "Unmanaged"
 msgstr "No gestionado"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Cambios no guardados"
 
@@ -3019,13 +3155,14 @@ msgstr "Esperando a que se realicen los cambios..."
 msgid "Waiting for command to complete..."
 msgstr "Esperando a que termine el comando..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Aviso"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Advertencia: Hay cambios realizados que no han sido guardados, los mismos se "
-"perderán mientras se rearranca!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3257,6 +3394,30 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Volver"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Borrar esta interfaz"
+
+#~ msgid "Flags"
+#~ msgstr "Indicadores"
+
+#~ msgid "Rule #"
+#~ msgstr "Nº de regla"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar fichero de máquinas"
+
+#~ msgid "Path"
+#~ msgstr "Ruta (path)"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Espere por favor: Rearrancando dispositivo..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advertencia: Hay cambios realizados que no han sido guardados, los mismos "
+#~ "se perderán mientras se rearranca!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -3956,9 +4117,6 @@ msgstr "« Volver"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Aquí puede configurar los dispositivos Wi-Fi instalados."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independiente (ad hoc) "
 
index 1d8d224..878e23d 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Charge sur 1 minute :"
 msgid "15 Minute Load:"
 msgstr "Charge sur 15 minutes :"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Charge sur 5 minutes :"
 
@@ -212,6 +215,9 @@ msgstr "Ajout d'une nouvelle interface..."
 msgid "Additional Hosts files"
 msgstr "Fichiers hosts supplémetaires"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresse"
 
@@ -279,6 +285,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antenne 1"
 
@@ -335,6 +347,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponible"
 
@@ -344,6 +371,9 @@ msgstr "Paquets disponibles"
 msgid "Average:"
 msgstr "Moyenne :"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -419,6 +449,11 @@ msgstr "Contrôleur sans fil Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr "Temporisé"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Boutons"
 
@@ -455,6 +490,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Vérification"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Somme de contrôle"
 
@@ -579,6 +617,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -657,9 +703,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Effacer"
 
-msgid "Delete this interface"
-msgstr "Supprimer cette interface"
-
 msgid "Delete this network"
 msgstr "Supprimer ce réseau"
 
@@ -678,6 +721,12 @@ msgstr "Équipement"
 msgid "Device Configuration"
 msgstr "Configuration de l'équipement"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostics"
 
@@ -718,6 +767,9 @@ msgstr "Optimisation de la distance"
 msgid "Distance to farthest network member in meters."
 msgstr "Distance au membre du réseau le plus éloigné, en mètres."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversité"
 
@@ -795,6 +847,9 @@ msgstr ""
 "Alloue dynamiquement des adresses pour les clients du DHCP. Si désactivé, "
 "seuls les clients ayant des baux statiques seront gérés."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Méthode EAP"
 
@@ -908,6 +963,9 @@ msgstr "Serveur distant de journaux système"
 msgid "External system log server port"
 msgstr "Port du serveur distant de journaux système"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Trames rapides"
 
@@ -929,6 +987,11 @@ msgstr "Filtrer les requêtes privées"
 msgid "Filter useless"
 msgstr "Filtrer les requêtes inutiles"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Cherche et rejoint un réseau"
 
@@ -953,9 +1016,6 @@ msgstr "Version du micrologiciel"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Port source fixe pour les requêtes DNS sortantes"
 
-msgid "Flags"
-msgstr "Options"
-
 msgid "Flash Firmware"
 msgstr "Mise à jour du micrologiciel"
 
@@ -986,6 +1046,9 @@ msgstr "Forcer TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forcer TKIP et CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Transmettre le trafic DHCP"
 
@@ -1025,6 +1088,12 @@ msgstr "Paramètres généraux"
 msgid "General Setup"
 msgstr "Configuration générale"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Construire l'archive"
 
@@ -1036,6 +1105,9 @@ msgstr ""
 "La confirmation du nouveau mot de passe ne correspond pas, changement "
 "annulé !"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1137,6 +1209,9 @@ msgstr "Masque-réseau IPv4"
 msgid "IPv4 only"
 msgstr "IPv4 seulement"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "longueur du préfixe IPv4"
 
@@ -1234,8 +1309,8 @@ msgstr ""
 "d'échange, relevant la quantité de RAM disponible. Ce processus est lent car "
 "la mémoire d'échange ne peut être accédée aux taux de transfert de la RAM."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorer le fichiers Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorer /etc/hosts"
 
 msgid "Ignore interface"
 msgstr "Ignorer l'interface"
@@ -1249,6 +1324,11 @@ msgstr "Image"
 msgid "In"
 msgstr "Entrée"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Délai d'inactivité"
 
@@ -1436,6 +1516,9 @@ msgstr ""
 "Liste des serveurs auquels sont transmis les requêtes <abbr title=\"Domain "
 "Name System\">DNS</abbr>"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Liste des domaines où sont permises les réponses de type RFC1918"
 
@@ -1458,6 +1541,9 @@ msgstr "Charge moyenne"
 msgid "Loading"
 msgstr "Chargement"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Adresse IPv4 locale"
 
@@ -1534,6 +1620,9 @@ msgstr "Filtrage par adresses MAC"
 msgid "MAC-List"
 msgstr "Liste des adresses MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1548,6 +1637,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Débit maximum"
 
@@ -1566,6 +1658,11 @@ msgstr "Délai d'attente maximum que le modem soit prêt"
 msgid "Maximum hold time"
 msgstr "Temps de maintien maximum"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Nombre maximum d'adresses allouées."
 
@@ -1633,12 +1730,18 @@ msgstr ""
 "Les points de montage définissent l'attachement d'un périphérique au système "
 "de fichier"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Options de montage"
 
 msgid "Mount point"
 msgstr "Point de montage"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Systèmes de fichiers montés"
 
@@ -1657,6 +1760,9 @@ msgstr "Adresse multidiffusion"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1756,6 +1862,9 @@ msgstr "Non connecté"
 msgid "Note: Configuration files will be erased."
 msgstr "Note : les fichiers de configuration seront effacés."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Note"
 
@@ -1884,9 +1993,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Nécessite le paquet libiwinfo !"
 
@@ -1914,9 +2032,6 @@ msgstr "Mot de passe de la clé privée"
 msgid "Password successfully changed!"
 msgstr "Mot de passe changé avec succès !"
 
-msgid "Path"
-msgstr "Chemin"
-
 msgid "Path to CA-Certificate"
 msgstr "Chemin de la CA"
 
@@ -1932,6 +2047,9 @@ msgstr "Chemin du programme exécutable gérant les évènements liés au bouton
 msgid "Peak:"
 msgstr "Pic :"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Redémarrer"
 
@@ -1953,9 +2071,6 @@ msgstr "Pqts."
 msgid "Please enter your username and password."
 msgstr "Saisissez votre nom d'utilisateur et mot de passe."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..."
-
 msgid "Policy"
 msgstr "Politique"
 
@@ -2237,9 +2352,6 @@ msgstr ""
 "Avec les routes statiques vous pouvez spécifier à travers quelle interface "
 "ou passerelle un réseau peut être contacté."
 
-msgid "Rule #"
-msgstr "N° de règle"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Faire un vérification du système de fichiers avant de monter le périphérique"
@@ -2258,6 +2370,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Accès SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Clés SSH"
 
@@ -2349,6 +2470,9 @@ msgstr "Signal :"
 msgid "Size"
 msgstr "Taille"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Passer au suivant"
 
@@ -2641,6 +2765,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Le protocole sélectionné nécessite l'attribution d'un périphérique"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2703,6 +2830,12 @@ msgid "This IPv4 address of the relay"
 msgstr "L'adresse IPv4 du relais"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2871,6 +3004,9 @@ msgstr "Erreur inconnue, mot de passe inchangé !"
 msgid "Unmanaged"
 msgstr "non-géré"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Changements non appliqués"
 
@@ -3038,13 +3174,14 @@ msgstr "En attente de l'application des changements..."
 msgid "Waiting for command to complete..."
 msgstr "En attente de la fin de la commande..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Attention"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Attention : il reste des changements non appliqués qui seront perdus après "
-"redémarrage !"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3275,6 +3412,30 @@ msgstr "oui"
 msgid "« Back"
 msgstr "« Retour"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Supprimer cette interface"
+
+#~ msgid "Flags"
+#~ msgstr "Options"
+
+#~ msgid "Rule #"
+#~ msgstr "N° de règle"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorer le fichiers Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Chemin"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Attention : il reste des changements non appliqués qui seront perdus "
+#~ "après redémarrage !"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -4134,9 +4295,6 @@ msgstr "« Retour"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Ici vous pouvez configurer les équipements Wi-Fi installés."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorer /etc/hosts"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Ad-Hoc"
 
index 237e868..6f5e3b0 100644 (file)
@@ -44,6 +44,9 @@ msgstr "עומס במשך דקה:"
 msgid "15 Minute Load:"
 msgstr "עומס במשך רבע שעה:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "עומס במשך 5 דקות:"
 
@@ -202,6 +205,9 @@ msgstr "הוסף ממשק חדש..."
 msgid "Additional Hosts files"
 msgstr "קבצי מארח נוספים"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "כתובת"
 
@@ -267,6 +273,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "אנטנה 1"
 
@@ -325,6 +337,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "זמין"
 
@@ -334,6 +361,9 @@ msgstr "חבילות זמינות"
 msgid "Average:"
 msgstr "ממוצע:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -410,6 +440,11 @@ msgstr "שלט אלחוטי Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "כפתורים"
 
@@ -446,6 +481,9 @@ msgstr "ערוץ"
 msgid "Check"
 msgstr "לבדוק"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr ""
 
@@ -557,6 +595,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -634,9 +680,6 @@ msgstr ""
 msgid "Delete"
 msgstr "למחוק"
 
-msgid "Delete this interface"
-msgstr "מחק ממשק זה"
-
 msgid "Delete this network"
 msgstr "מחק רשת זו"
 
@@ -655,6 +698,12 @@ msgstr "מכשיר"
 msgid "Device Configuration"
 msgstr "הגדרות מכשיר"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "אבחון"
 
@@ -693,6 +742,9 @@ msgstr ""
 msgid "Distance to farthest network member in meters."
 msgstr "מרחק לנק' הרשת הרחוקה ביותר במטרים"
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "גיוון"
 
@@ -756,6 +808,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
@@ -864,6 +919,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -885,6 +943,11 @@ msgstr ""
 msgid "Filter useless"
 msgstr ""
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -909,9 +972,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr ""
 
@@ -942,6 +1002,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -981,6 +1044,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -990,6 +1059,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1087,6 +1159,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1176,7 +1251,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1191,6 +1266,11 @@ msgstr ""
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1369,6 +1449,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1390,6 +1473,9 @@ msgstr "עומס ממוצע"
 msgid "Loading"
 msgstr "טוען"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "כתובת IPv4 מקומית"
 
@@ -1457,6 +1543,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1471,6 +1560,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr ""
 
@@ -1489,6 +1581,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1554,12 +1651,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1578,6 +1681,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1677,6 +1783,9 @@ msgstr "לא מחובר"
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1799,9 +1908,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1829,9 +1947,6 @@ msgstr ""
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr ""
 
@@ -1847,6 +1962,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr ""
 
@@ -1868,9 +1986,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "אנא הזן את שם המשתמש והסיסמה שלך:"
 
-msgid "Please wait: Device rebooting..."
-msgstr "אנא המתן: המכשיר מאותחל מחדש..."
-
 msgid "Policy"
 msgstr ""
 
@@ -2137,9 +2252,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2157,6 +2269,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2246,6 +2367,9 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2503,6 +2627,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2551,6 +2678,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2703,6 +2836,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr ""
 
@@ -2860,11 +2996,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "אזהרה"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "אזהרה: ישנם שינויים שלא נשמרו ויאבדו בעת הפעלה מחדש!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3088,6 +3227,16 @@ msgstr "כן"
 msgid "« Back"
 msgstr "<< אחורה"
 
+#~ msgid "Delete this interface"
+#~ msgstr "מחק ממשק זה"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "אנא המתן: המכשיר מאותחל מחדש..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "אזהרה: ישנם שינויים שלא נשמרו ויאבדו בעת הפעלה מחדש!"
+
 #~ msgid "Cached"
 #~ msgstr "שמור במטמון"
 
index 975bf2d..d1f71d8 100644 (file)
@@ -44,6 +44,9 @@ msgstr "Terhelés (utolsó 1 perc):"
 msgid "15 Minute Load:"
 msgstr "Terhelés (utolsó 15 perc):"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Terhelés (utolsó 5 perc):"
 
@@ -207,6 +210,9 @@ msgstr "Új interfész hozzáadása..."
 msgid "Additional Hosts files"
 msgstr "További 'hosts' fájlok"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Cím"
 
@@ -272,6 +278,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "1-es antenna"
 
@@ -328,6 +340,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Elérhető"
 
@@ -337,6 +364,9 @@ msgstr "Elérhető csomagok"
 msgid "Average:"
 msgstr "Átlag:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -413,6 +443,11 @@ msgstr "Broadcom BCM%04x 802.11 vezeték-nélküli vezérlő"
 msgid "Buffered"
 msgstr "Átmeneti tárban van"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Gombok"
 
@@ -450,6 +485,9 @@ msgstr "Csatorna"
 msgid "Check"
 msgstr "Ellenőrzés"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Ellenőrző összeg"
 
@@ -574,6 +612,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -651,9 +697,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Törlés"
 
-msgid "Delete this interface"
-msgstr "Interfész törlése"
-
 msgid "Delete this network"
 msgstr "Hálózat törlése"
 
@@ -672,6 +715,12 @@ msgstr "Eszköz"
 msgid "Device Configuration"
 msgstr "Eszköz beállítások"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosztika"
 
@@ -712,6 +761,9 @@ msgstr "Távolság optimalizáció"
 msgid "Distance to farthest network member in meters."
 msgstr "A hálózat legtávolabbi tagjának távolsága méterben."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diverzitás"
 
@@ -788,6 +840,9 @@ msgstr ""
 "esetén csak a statikus DHCP bérlettel rendelkező kliensek lesznek "
 "kiszolgálva."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP metódus"
 
@@ -897,6 +952,9 @@ msgstr "Külső rendszernapló kiszolgáló"
 msgid "External system log server port"
 msgstr "Külső rendszernapló kiszolgáló port"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Gyors keretek"
 
@@ -918,6 +976,11 @@ msgstr "Privát kérések szűrése"
 msgid "Filter useless"
 msgstr "Használhahatlan kérések szűrése"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Hálózatok keresése és csatlakozás"
 
@@ -942,9 +1005,6 @@ msgstr "Tűzfal verzió"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Rögzített forrás port a kimenő DNS kérésekhez"
 
-msgid "Flags"
-msgstr "Flag-ek"
-
 msgid "Flash Firmware"
 msgstr "Firmware flash-elés"
 
@@ -977,6 +1037,9 @@ msgstr "TKIP kényszerítése"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "TKIP és CCMP (AES) kényszerítése"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "DHCP forgalom továbbítás"
 
@@ -1016,6 +1079,12 @@ msgstr "Általános beállítások"
 msgid "General Setup"
 msgstr "Általános beállítások"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Archívum készítése"
 
@@ -1025,6 +1094,9 @@ msgstr "Általános 802.11%s vezeték-nélküli vezérlő"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "A megadott jelszavak nem egyeznek, a jelszó nem lett megváltoztatva!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1126,6 +1198,9 @@ msgstr "IPv4 hálózati maszk"
 msgid "IPv4 only"
 msgstr "csak IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "IPv4 prefix hossza"
 
@@ -1224,8 +1299,8 @@ msgstr ""
 "nagyon lassú folyamat mivel a swap-eszköz nem érhető el akkora sebességgel "
 "mint a <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "A hosts fájlok figyelmen kívül hagyása"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "Interfész figyelmen kívül hagyása"
@@ -1239,6 +1314,11 @@ msgstr "Image"
 msgid "In"
 msgstr "Be"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Inaktivitási időtúllépés"
 
@@ -1425,6 +1505,9 @@ msgstr ""
 "<abbr title=\"Domain Name System\">DNS</abbr> szerverek listája, ahová a "
 "kérések továbbításra kerülnek"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Domain-ok listája, melyeknél az RFC1918 válaszok megengedettek"
 
@@ -1448,6 +1531,9 @@ msgstr "Átlagos terhelés"
 msgid "Loading"
 msgstr "Betöltés"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Helyi IPv4 cím"
 
@@ -1523,6 +1609,9 @@ msgstr "MAC-szűrő"
 msgid "MAC-List"
 msgstr "MAC-lista"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1537,6 +1626,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Maximális sebesség"
 
@@ -1555,6 +1647,11 @@ msgstr "Maximális várakozási idő a modem kész állapotára (másodpercben)"
 msgid "Maximum hold time"
 msgstr "Maximális tartási idő"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "DHCP címek maximális száma"
 
@@ -1622,12 +1719,18 @@ msgstr ""
 "A csatolási pontok határozzák meg, hogy egy memória eszköz hová lesz "
 "csatlakoztatva a fájlendszeren belül "
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Csatolási beállítások"
 
 msgid "Mount point"
 msgstr "Csatolási pont"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Csatolt fájlrendszerek"
 
@@ -1646,6 +1749,9 @@ msgstr "Multicast cím"
 msgid "NAS ID"
 msgstr "NAS azonosító"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1745,6 +1851,9 @@ msgstr "Nincs kapcsolódva"
 msgid "Note: Configuration files will be erased."
 msgstr "Megjegyzés: konfigurációs fájlok törölve lesznek."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Megjegyzés"
 
@@ -1874,9 +1983,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "A libiwinfo csomag szükséges!"
 
@@ -1904,9 +2022,6 @@ msgstr "A privát kulcsh jelszava"
 msgid "Password successfully changed!"
 msgstr "A jelszó megváltoztatása sikeres!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "CA tanúsítvány elérési útja"
 
@@ -1922,6 +2037,9 @@ msgstr "A gomb eseményeit kezelő végrehajtható állomány elérési útja"
 msgid "Peak:"
 msgstr "Csúcs:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Újraindítás végrehajtása"
 
@@ -1943,9 +2061,6 @@ msgstr "csom."
 msgid "Please enter your username and password."
 msgstr "Adja meg a felhasználónevét és a jelszavát."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Kérem várjon: az eszköz újraindul..."
-
 msgid "Policy"
 msgstr "Szabály"
 
@@ -2229,9 +2344,6 @@ msgstr ""
 "Az útvonalak határozzák meg, hogy bizonyos gépek illetve hálózatok melyik "
 "interfészen keresztül érhetők el."
 
-msgid "Rule #"
-msgstr "Szabály #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Fájlrendszer ellenőrzés futtatása az eszköz csatolása előtt"
 
@@ -2249,6 +2361,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH hozzáférés"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH kulcsok"
 
@@ -2340,6 +2461,9 @@ msgstr "Jel:"
 msgid "Size"
 msgstr "Méret"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Ugrás"
 
@@ -2632,6 +2756,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "A kiválasztott protokoll eszköz hozzárendelést igényel"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2692,6 +2819,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Az átjátszó IPV4 címe"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2859,6 +2992,9 @@ msgstr "Ismeretlen hiba, a jelszó nem lett megváltoztatva!"
 msgid "Unmanaged"
 msgstr "Nem kezelt"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "El nem mentett módosítások"
 
@@ -3026,13 +3162,14 @@ msgstr "Várakozás a változtatások alkalmazására..."
 msgid "Waiting for command to complete..."
 msgstr "Várakozás a parancs befejezésére..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Figyelmeztetés"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Figyelem: vannak el nem mentett változások melyek el fognak veszni az "
-"újraindítás során!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3264,6 +3401,27 @@ msgstr "igen"
 msgid "« Back"
 msgstr "« Vissza"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Interfész törlése"
+
+#~ msgid "Flags"
+#~ msgstr "Flag-ek"
+
+#~ msgid "Rule #"
+#~ msgstr "Szabály #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "A hosts fájlok figyelmen kívül hagyása"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Kérem várjon: az eszköz újraindul..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Figyelem: vannak el nem mentett változások melyek el fognak veszni az "
+#~ "újraindítás során!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index ffb1fdf..6a6c022 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Carico in 1 minuto:"
 msgid "15 Minute Load:"
 msgstr "Carico in 15 minut:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Carico in 5 minuti:"
 
@@ -214,6 +217,9 @@ msgstr "Aggiungi nuova interfaccia..."
 msgid "Additional Hosts files"
 msgstr "File Hosts Aggiuntivo"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Indirizzo"
 
@@ -279,6 +285,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antenna 1"
 
@@ -335,6 +347,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponibili"
 
@@ -344,6 +371,9 @@ msgstr "Pacchetti disponibili"
 msgid "Average:"
 msgstr "Media:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -419,6 +449,11 @@ msgstr "Dispositivo Wireless Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr "Buffered"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Pulsanti"
 
@@ -455,6 +490,9 @@ msgstr "Canale"
 msgid "Check"
 msgstr "Verifica"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Checksum"
 
@@ -577,6 +615,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -655,9 +701,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Elimina"
 
-msgid "Delete this interface"
-msgstr "Rimuovi questa interfaccia"
-
 msgid "Delete this network"
 msgstr "Rimuovi questa rete"
 
@@ -676,6 +719,12 @@ msgstr "Dispositivo"
 msgid "Device Configuration"
 msgstr "Configurazione del dispositivo"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostica"
 
@@ -716,6 +765,9 @@ msgstr "Ottimizzazione distanza"
 msgid "Distance to farthest network member in meters."
 msgstr "Distanza del membro più lontano della rete in metri."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversità"
 
@@ -789,6 +841,9 @@ msgstr ""
 "Fornisci dinamicamente gli indirizzi DHCP ai client. Se disabilitato, solo i "
 "client con un indirizzo statico saranno serviti."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Metodo EAP"
 
@@ -899,6 +954,9 @@ msgstr "Server Log di Sistema esterno"
 msgid "External system log server port"
 msgstr "Porta Server Log di Sistema esterno"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Frame veloci"
 
@@ -920,6 +978,11 @@ msgstr "Filtra privati"
 msgid "Filter useless"
 msgstr "Filtra inutili"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Trova e aggiungi una rete"
 
@@ -944,9 +1007,6 @@ msgstr "Versione del Firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Porta di origine fissa per le richieste DNS in uscita"
 
-msgid "Flags"
-msgstr "Flags"
-
 msgid "Flash Firmware"
 msgstr "Flash Firmware"
 
@@ -977,6 +1037,9 @@ msgstr "Forza TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forza TKIP e CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Inoltra il traffico DHCP"
 
@@ -1016,6 +1079,12 @@ msgstr "Opzioni Generali"
 msgid "General Setup"
 msgstr "Impostazioni Generali"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Genera Archivio"
 
@@ -1027,6 +1096,9 @@ msgstr ""
 "La conferma della password assegnata non ha prodotto risultati, la password "
 "non è stata cambiata!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1129,6 +1201,9 @@ msgstr "Maschera rete IPv4"
 msgid "IPv4 only"
 msgstr "Solo IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Lunghezza prefisso IPv4"
 
@@ -1229,8 +1304,8 @@ msgstr ""
 "dispositivo di swap non può essere acceduto alle alte velocità della <abbr "
 "title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignora i files Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignora <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignora interfaccia"
@@ -1244,6 +1319,11 @@ msgstr "Immagine"
 msgid "In"
 msgstr "In"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Tempo di Inattività"
 
@@ -1427,6 +1507,9 @@ msgstr ""
 "Elenco di Server <abbr title=\"Sistema Nome Dimio\">DNS</abbr>a cui "
 "inoltrare le richieste in"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Elenco di domini da consentire le risposte RFC1918 per"
 
@@ -1448,6 +1531,9 @@ msgstr "Carico Medio"
 msgid "Loading"
 msgstr "Caricamento"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Indirizzo IPv4 locale"
 
@@ -1521,6 +1607,9 @@ msgstr "Filtro MAC"
 msgid "MAC-List"
 msgstr "Lista MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1535,6 +1624,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Velocità massima"
 
@@ -1553,6 +1645,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr "Velocità massima"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1620,12 +1717,18 @@ msgstr ""
 "I punti di mount definiscono in quale punto un dispositivo di memoria verrà "
 "attaccato al tuo filesystem"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Opzioni di mount"
 
 msgid "Mount point"
 msgstr "Punto di mount"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "File system montati"
 
@@ -1644,6 +1747,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr "ID della NAS"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1743,6 +1849,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Avviso"
 
@@ -1870,9 +1979,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "E' richiesto il pacchetto libiwinfo!"
 
@@ -1900,9 +2018,6 @@ msgstr "Password della chiave privata"
 msgid "Password successfully changed!"
 msgstr "Password cambiata con successo!"
 
-msgid "Path"
-msgstr "Percorso"
-
 msgid "Path to CA-Certificate"
 msgstr "Percorso al certificato CA"
 
@@ -1918,6 +2033,9 @@ msgstr ""
 msgid "Peak:"
 msgstr "Picco:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Esegui un riavvio"
 
@@ -1939,9 +2057,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "Per favore inserisci il tuo username e la password."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Per favore attendi: Riavvio del dispositivo..."
-
 msgid "Policy"
 msgstr ""
 
@@ -2212,9 +2327,6 @@ msgstr ""
 "Le route specificano attraverso quale interfaccia e gateway un certo host o "
 "rete può essere raggiunto."
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2232,6 +2344,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2320,6 +2441,9 @@ msgstr ""
 msgid "Size"
 msgstr "Dimensione"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Salta"
 
@@ -2598,6 +2722,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2653,6 +2780,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2810,6 +2943,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Modifiche non salvate"
 
@@ -2977,12 +3113,14 @@ msgstr "In attesa delle modifiche da applicare ..."
 msgid "Waiting for command to complete..."
 msgstr "In attesa del comando da completare..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Avviso"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3216,6 +3354,26 @@ msgstr "Sì"
 msgid "« Back"
 msgstr "« Indietro"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Rimuovi questa interfaccia"
+
+#~ msgid "Flags"
+#~ msgstr "Flags"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignora i files Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Percorso"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Per favore attendi: Riavvio del dispositivo..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -3943,9 +4101,6 @@ msgstr "« Indietro"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Qui puoi configurare i tuoi dispositivi wireless installati."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignora <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independente (Ad-Hoc)"
 
index 8bea764..313fc2c 100644 (file)
@@ -46,6 +46,9 @@ msgstr "過去1分の負荷:"
 msgid "15 Minute Load:"
 msgstr "過去15分の負荷:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "過去5分の負荷:"
 
@@ -205,6 +208,9 @@ msgstr "インターフェースの新規作成..."
 msgid "Additional Hosts files"
 msgstr "追加のホストファイル"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "アドレス"
 
@@ -266,6 +272,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "アンテナ 1"
 
@@ -322,6 +334,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "使用可"
 
@@ -331,6 +358,9 @@ msgstr "インストール可能なパッケージ"
 msgid "Average:"
 msgstr "平均値:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -406,6 +436,11 @@ msgstr "Broadcom BCM%04x 802.11 無線LANコントローラ"
 msgid "Buffered"
 msgstr "バッファ"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "ボタン"
 
@@ -442,6 +477,9 @@ msgstr "チャネル"
 msgid "Check"
 msgstr "チェック"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "チェックサム"
 
@@ -565,6 +603,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -642,9 +688,6 @@ msgstr ""
 msgid "Delete"
 msgstr "削除"
 
-msgid "Delete this interface"
-msgstr "インターフェースを削除します"
-
 msgid "Delete this network"
 msgstr "ネットワークを削除します"
 
@@ -663,6 +706,12 @@ msgstr "デバイス"
 msgid "Device Configuration"
 msgstr "デバイス設定"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "診断機能"
 
@@ -703,6 +752,9 @@ msgstr "距離の最適化"
 msgid "Distance to farthest network member in meters."
 msgstr "最も遠い端末との距離(メートル)を設定してください。"
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "ダイバシティ"
 
@@ -777,6 +829,9 @@ msgstr ""
 "クライアントに対して動的にDHCPアドレスを割り振ります。無効に設定した場合、静"
 "的リースのみを行います。"
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAPメソッド"
 
@@ -888,6 +943,9 @@ msgstr "外部システムログ・サーバー"
 msgid "External system log server port"
 msgstr "外部システムログ・サーバーポート"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "ファスト・フレーム"
 
@@ -909,6 +967,11 @@ msgstr "プライベートフィルター"
 msgid "Filter useless"
 msgstr "Filter useless"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "ネットワークを検索して参加"
 
@@ -933,9 +996,6 @@ msgstr "ファームウェア・バージョン"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "DNSクエリを送信する送信元ポートを固定します"
 
-msgid "Flags"
-msgstr "フラグ"
-
 msgid "Flash Firmware"
 msgstr "ファームウェアの更新"
 
@@ -967,6 +1027,9 @@ msgstr "TKIP を使用"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "TKIP 及びCCMP (AES) を使用"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "DHCPトラフィックを転送する"
 
@@ -1006,6 +1069,12 @@ msgstr "一般設定"
 msgid "General Setup"
 msgstr "一般設定"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "バックアップアーカイブの作成"
 
@@ -1015,6 +1084,9 @@ msgstr "802.11%s 無線LANコントローラ"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "入力されたパスワードが一致しません。パスワードは変更されませんでした!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1114,6 +1186,9 @@ msgstr "IPv4 ネットマスク"
 msgid "IPv4 only"
 msgstr "IPv4のみ"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "IPv4 プレフィクス長"
 
@@ -1210,8 +1285,8 @@ msgstr ""
 "title=\"Random Access Memory\">RAM</abbr>にアクセスすることができなくなる恐れ"
 "があります。"
 
-msgid "Ignore Hosts files"
-msgstr "ホストファイルを無視する"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "<code>/etc/hosts</code>を無視"
 
 msgid "Ignore interface"
 msgstr "インターフェースを無視する"
@@ -1225,6 +1300,11 @@ msgstr "イメージ"
 msgid "In"
 msgstr "イン"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "未使用時タイムアウト"
 
@@ -1408,6 +1488,9 @@ msgstr ""
 "問い合わせを転送する<abbr title=\"Domain Name System\">DNS</abbr> サーバーの"
 "リストを設定します"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "RFC1918の応答を許可するリスト"
 
@@ -1431,6 +1514,9 @@ msgstr "システム平均負荷"
 msgid "Loading"
 msgstr "ロード中"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "ローカル IPv4 アドレス"
 
@@ -1499,6 +1585,9 @@ msgstr "MAC-フィルタ"
 msgid "MAC-List"
 msgstr "MAC-リスト"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1513,6 +1602,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "最大レート"
 
@@ -1531,6 +1623,11 @@ msgstr "モデムが準備完了状態になるまでの最大待ち時間"
 msgid "Maximum hold time"
 msgstr "最大保持時間"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "リースするアドレスの最大数です"
 
@@ -1598,12 +1695,18 @@ msgstr ""
 "マウントポイントは、記憶デバイスがファイルシステムのどこに接続されているかを"
 "表示しています。"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "マウントオプション"
 
 msgid "Mount point"
 msgstr "マウントポイント"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "マウント中のファイルシステム"
 
@@ -1622,6 +1725,9 @@ msgstr "マルチキャストアドレス"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1721,6 +1827,9 @@ msgstr "未接続"
 msgid "Note: Configuration files will be erased."
 msgstr "注意: 設定ファイルは消去されます。"
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "注意"
 
@@ -1851,9 +1960,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "libiwinfo パッケージをインストールしてください!"
 
@@ -1881,9 +1999,6 @@ msgstr "秘密鍵のパスワード"
 msgid "Password successfully changed!"
 msgstr "パスワードを変更しました"
 
-msgid "Path"
-msgstr "パス"
-
 msgid "Path to CA-Certificate"
 msgstr "CA証明書のパス"
 
@@ -1899,6 +2014,9 @@ msgstr "ボタンイベントをハンドルする実行ファイルのパス"
 msgid "Peak:"
 msgstr "ピーク:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "再起動を実行"
 
@@ -1920,9 +2038,6 @@ msgstr "パケット"
 msgid "Please enter your username and password."
 msgstr "ユーザー名とパスワードを入力してください。"
 
-msgid "Please wait: Device rebooting..."
-msgstr "しばらくお待ちください: 再起動中です..."
-
 msgid "Policy"
 msgstr "ポリシー"
 
@@ -2207,9 +2322,6 @@ msgstr ""
 "特定のホスト又はネットワークに、どのインターフェース及びゲートウェイを通して"
 "通信を行うか、経路情報を設定します。"
 
-msgid "Rule #"
-msgstr "ルール #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "デバイスのマウントを行う前にファイルシステムチェックを行う"
 
@@ -2227,6 +2339,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSHアクセス"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSHキー"
 
@@ -2318,6 +2439,9 @@ msgstr "信号:"
 msgid "Size"
 msgstr "サイズ"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "スキップ"
 
@@ -2596,6 +2720,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "選択中のプロトコルを使用する場合、デバイスを設定する必要があります"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2656,6 +2783,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2822,6 +2955,9 @@ msgstr "不明なエラーです。パスワードは変更されていません
 msgid "Unmanaged"
 msgstr "Unmanaged"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "保存されていない変更"
 
@@ -2990,11 +3126,14 @@ msgstr "変更を適用中です..."
 msgid "Waiting for command to complete..."
 msgstr "コマンド実行中です..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "警告"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告: 保存されていない変更は再起動後に失われます!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3225,6 +3364,28 @@ msgstr "はい"
 msgid "« Back"
 msgstr "« 戻る"
 
+#~ msgid "Delete this interface"
+#~ msgstr "インターフェースを削除します"
+
+#~ msgid "Flags"
+#~ msgstr "フラグ"
+
+#~ msgid "Rule #"
+#~ msgstr "ルール #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "ホストファイルを無視する"
+
+#~ msgid "Path"
+#~ msgstr "パス"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "しばらくお待ちください: 再起動中です..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告: 保存されていない変更は再起動後に失われます!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -4077,9 +4238,6 @@ msgstr "« 戻る"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "ここではインストールされた無線デバイスの設定を行うことが出来ます。"
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "<code>/etc/hosts</code>を無視"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "アドホック"
 
index d2a34df..ab3a25f 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "15 Minute Load:"
 msgstr ""
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr ""
 
@@ -196,6 +199,9 @@ msgstr ""
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr ""
 
@@ -256,6 +262,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -312,6 +324,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Boleh didapati"
 
@@ -321,6 +348,9 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -393,6 +423,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Butang"
 
@@ -429,6 +464,9 @@ msgstr "Saluran"
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Jumlah disemak "
 
@@ -541,6 +579,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr "Mengkustomisasi perilaku peranti LED jika mungkin."
@@ -614,9 +660,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Padam"
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -635,6 +678,12 @@ msgstr "Alat"
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -673,6 +722,9 @@ msgstr "Jarak Optimasi"
 msgid "Distance to farthest network member in meters."
 msgstr "Jarak ke rangkaian terjauh ahli dalam meter."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Keanekaragaman"
 
@@ -740,6 +792,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Kaedah"
 
@@ -848,6 +903,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Frame Cepat"
 
@@ -869,6 +927,11 @@ msgstr "Penapis swasta"
 msgid "Filter useless"
 msgstr "Penapis tak berguna"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -893,9 +956,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr "Parameter"
-
 msgid "Flash Firmware"
 msgstr "Firmware Flash"
 
@@ -926,6 +986,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -965,6 +1028,12 @@ msgstr ""
 msgid "General Setup"
 msgstr "Setup Umum"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -974,6 +1043,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1073,6 +1145,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1167,8 +1242,8 @@ msgstr ""
 "sangat lambat kerana peranti-penukar tidak boleh diakses dengan datarates "
 "yang tinggi pada RAM."
 
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Mengabaikan /etc/hosts"
 
 msgid "Ignore interface"
 msgstr "Abaikan antara muka"
@@ -1182,6 +1257,11 @@ msgstr ""
 msgid "In"
 msgstr "Masuk"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1364,6 +1444,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1385,6 +1468,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1452,6 +1538,9 @@ msgstr "Penapis MAC"
 msgid "MAC-List"
 msgstr "Senarai MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1466,6 +1555,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Rate Maksimum"
 
@@ -1485,6 +1577,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr "Memegang masa maksimum"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1553,12 +1650,18 @@ msgstr ""
 "Mount Points menentukan di mana titik peranti memori akan melekat pada fail "
 "sistem"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Mounted fail sistems"
 
@@ -1577,6 +1680,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1676,6 +1782,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1803,9 +1912,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1833,9 +1951,6 @@ msgstr "Kata Laluan Kunci Swasta"
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr "Path"
-
 msgid "Path to CA-Certificate"
 msgstr "Path ke CA-Sijil"
 
@@ -1851,6 +1966,9 @@ msgstr "Path ke eksekusi yang mengendalikan acara butang"
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Lakukan reboot"
 
@@ -1872,9 +1990,6 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Sila masukkan username dan kata laluan anda."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Sila tunggu: Peranti sedang reboot..."
-
 msgid "Policy"
 msgstr "Dasar"
 
@@ -2141,9 +2256,6 @@ msgstr ""
 "Laluan menentukan di mana interface dan gateway host atau rangkaian tertentu "
 "yang boleh dicapai."
 
-msgid "Rule #"
-msgstr "Peraturan #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2161,6 +2273,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2249,6 +2370,9 @@ msgstr ""
 msgid "Size"
 msgstr "Saiz"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Skip"
 
@@ -2507,6 +2631,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2562,6 +2689,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2719,6 +2852,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Perubahan yang belum disimpan"
 
@@ -2878,11 +3014,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3106,6 +3245,22 @@ msgstr ""
 msgid "« Back"
 msgstr "« Kembali"
 
+#~ msgid "Flags"
+#~ msgstr "Parameter"
+
+#~ msgid "Rule #"
+#~ msgstr "Peraturan #"
+
+#~ msgid "Path"
+#~ msgstr "Path"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Sila tunggu: Peranti sedang reboot..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!"
+
 #~ msgid "Frequency Hopping"
 #~ msgstr "Melompat Frekuensi"
 
@@ -3695,9 +3850,6 @@ msgstr "« Kembali"
 #~ "dipilih. Hapus tanda pada pilihan untuk menentukan melampirkan rangkaian "
 #~ "mandiri baru untuk antara muka ini."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Mengabaikan /etc/hosts"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "(Ad-Hoc) Tersendiri"
 
index 21176ed..edde08e 100644 (file)
@@ -41,6 +41,9 @@ msgstr "1 minutts belastning:"
 msgid "15 Minute Load:"
 msgstr "15 minutters belastning:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "5 minutters belastning:"
 
@@ -205,6 +208,9 @@ msgstr "Legg til grensesnitt..."
 msgid "Additional Hosts files"
 msgstr "Tilleggs vertsfiler"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresse"
 
@@ -265,6 +271,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antenne 1"
 
@@ -321,6 +333,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Tilgjengelig"
 
@@ -330,6 +357,9 @@ msgstr "Tilgjengelige pakker"
 msgid "Average:"
 msgstr "Gjennomsnitt:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -405,6 +435,11 @@ msgstr "Broadcom BCM%04x 802.11 Trådløs Kontroller"
 msgid "Buffered"
 msgstr "Bufret"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Knapper"
 
@@ -441,6 +476,9 @@ msgstr "Kanal"
 msgid "Check"
 msgstr "Kontroller"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Kontrollsum"
 
@@ -563,6 +601,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -640,9 +686,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Fjern"
 
-msgid "Delete this interface"
-msgstr "Fjern dette grensesnitt"
-
 msgid "Delete this network"
 msgstr "Fjern dette nettverket"
 
@@ -661,6 +704,12 @@ msgstr "Enhet"
 msgid "Device Configuration"
 msgstr "Enhet Konfigurasjon"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Nettverksdiagnostikk"
 
@@ -701,6 +750,9 @@ msgstr "Avstand Optimalisering"
 msgid "Distance to farthest network member in meters."
 msgstr "Avstand i meter til det medlem av nettverket som er lengst unna."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Antennevariasjon"
 
@@ -775,6 +827,9 @@ msgstr ""
 "Dynamisk tildeling av DHCP adresser til klienter. Om deaktivert, kan en kun "
 "bruke klienter med statisk leie."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-metode"
 
@@ -884,6 +939,9 @@ msgstr "Ekstern systemlogg server"
 msgid "External system log server port"
 msgstr "Ekstern systemlogg server port"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Fast Frames"
 
@@ -905,6 +963,11 @@ msgstr "Filtrer private"
 msgid "Filter useless"
 msgstr "Filtrer ubrukelige"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Finn og koble til nettverk"
 
@@ -929,9 +992,6 @@ msgstr "Firmware Versjon"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Fast kilde port for utgående DNS-spørringer"
 
-msgid "Flags"
-msgstr "Flagg"
-
 msgid "Flash Firmware"
 msgstr "Firmware Oppradering"
 
@@ -963,6 +1023,9 @@ msgstr "Bruk TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Bruk TKIP og CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Videresend DHCP trafikk"
 
@@ -1002,6 +1065,12 @@ msgstr "Generelle Innstillinger"
 msgid "General Setup"
 msgstr "Generelt Oppsett"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Opprett arkiv"
 
@@ -1011,6 +1080,9 @@ msgstr "Generell 802.11%s Trådløs Kontroller"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "Det oppgitte passordet var ikke korrekt, passord ble ikke endret!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1112,6 +1184,9 @@ msgstr "IPv4 nettmaske"
 msgid "IPv4 only"
 msgstr "Kun IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "IPv4 prefikslengde"
 
@@ -1205,8 +1280,8 @@ msgstr ""
 "\"Random Access Memory\">RAM</abbr>. Vær oppmerksom på at bruk av swap er "
 "mye langsommere en <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorer vertsfiler"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "Ignorer grensesnitt"
@@ -1220,6 +1295,11 @@ msgstr "Firmware"
 msgid "In"
 msgstr "i"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Tidsavbrudd etter innaktivitet"
 
@@ -1403,6 +1483,9 @@ msgstr ""
 "Liste med <abbr title=\"Domain Name System\">DNS</abbr> servere som "
 "forespørsler blir videresendt til"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Liste over domener hvor en tillater RFC1918 svar"
 
@@ -1425,6 +1508,9 @@ msgstr "Belastning Gjennomsnitt"
 msgid "Loading"
 msgstr "Laster"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Lokal IPv4 adresse"
 
@@ -1497,6 +1583,9 @@ msgstr "MAC-Filter"
 msgid "MAC-List"
 msgstr "MAC-Liste"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1511,6 +1600,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Maksimal hastighet"
 
@@ -1529,6 +1621,11 @@ msgstr "Maksimalt antall sekunder å vente på at modemet skal bli klart"
 msgid "Maximum hold time"
 msgstr "Maksimal holde tid"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Maksimalt antall utleide adresser."
 
@@ -1596,12 +1693,18 @@ msgstr ""
 "Monterings punkter definerer hvor lagrings enheter blir tilsluttet "
 "filsystemet"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Monterings alternativer"
 
 msgid "Mount point"
 msgstr "Monterings punkt"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Monterte Filsystemer"
 
@@ -1620,6 +1723,9 @@ msgstr "Multicast adresse"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1719,6 +1825,9 @@ msgstr "Ikke tilkoblet"
 msgid "Note: Configuration files will be erased."
 msgstr "Merk: Konfigurasjonsfiler vil bli slettet"
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Merk"
 
@@ -1849,9 +1958,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Pakken libiwinfo er nødvendig!"
 
@@ -1879,9 +1997,6 @@ msgstr "Passord for privatnøkkel"
 msgid "Password successfully changed!"
 msgstr "Passordet er endret!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "Sti til CA-sertifikat"
 
@@ -1897,6 +2012,9 @@ msgstr "Sti til program som håndterer handling ved bruk av knapp"
 msgid "Peak:"
 msgstr "Maksimalt:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Omstart nå"
 
@@ -1918,9 +2036,6 @@ msgstr "Pakker."
 msgid "Please enter your username and password."
 msgstr "Skriv inn ditt brukernavn og passord."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Vent: Enheten starter på nytt..."
-
 msgid "Policy"
 msgstr "Policy"
 
@@ -2202,9 +2317,6 @@ msgstr ""
 "Ruter, angir hvilket nettverksgrensesnitt og hvilken gateway som brukes for "
 "å nå et gitt nettverk eller vert."
 
-msgid "Rule #"
-msgstr "Regel #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Kjør filsystem sjekk før montering av enheten"
 
@@ -2222,6 +2334,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH Tilgang"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-Nøkler"
 
@@ -2313,6 +2434,9 @@ msgstr "Signal:"
 msgid "Size"
 msgstr "Størrelse"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Gå videre"
 
@@ -2600,6 +2724,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Den valgte protokoll må ha en enhet tilknyttet"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2660,6 +2787,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Dette IPv4 adressen til relayet"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2825,6 +2958,9 @@ msgstr "Ukjent feil, passordet ble ikke endret!"
 msgid "Unmanaged"
 msgstr "Uhåndtert"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Ulagrede Endringer"
 
@@ -2991,11 +3127,14 @@ msgstr "Venter på at endringer utføres..."
 msgid "Waiting for command to complete..."
 msgstr "Venter på at kommando fullføres..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Advarsel"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3227,6 +3366,26 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Tilbake"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Fjern dette grensesnitt"
+
+#~ msgid "Flags"
+#~ msgstr "Flagg"
+
+#~ msgid "Rule #"
+#~ msgstr "Regel #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorer vertsfiler"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Vent: Enheten starter på nytt..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index baa7ab8..9f0c553 100644 (file)
@@ -42,13 +42,16 @@ msgid "-- match by label --"
 msgstr ""
 
 msgid "1 Minute Load:"
-msgstr "Obciążenie w ciągu 1 minuty:"
+msgstr "Obciążenie 1 min.:"
 
 msgid "15 Minute Load:"
-msgstr "Obciążenie w ciągu 15 minut:"
+msgstr "Obciążenie 15 min.:"
+
+msgid "464XLAT (CLAT)"
+msgstr ""
 
 msgid "5 Minute Load:"
-msgstr "Obciążenie w ciągu 5 minut:"
+msgstr "Obciążenie 5 min.:"
 
 msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
 msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
@@ -215,6 +218,9 @@ msgstr "Dodaj nowy interfejs..."
 msgid "Additional Hosts files"
 msgstr "Dodatkowe pliki Hosts"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adres"
 
@@ -281,6 +287,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -338,6 +350,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Dostępne"
 
@@ -347,6 +374,9 @@ msgstr "Dostępne pakiety"
 msgid "Average:"
 msgstr "Średnia:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -424,6 +454,11 @@ msgstr "Bezprzewodowy kontroler Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr "Buforowana"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Przyciski"
 
@@ -460,6 +495,9 @@ msgstr "Kanał"
 msgid "Check"
 msgstr "Sprawdź"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Suma kontrolna"
 
@@ -583,6 +621,14 @@ msgstr "Interfejs Niestandardowy"
 msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
+msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
 # Spacji zabrało i napisy się skleiły
 msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
@@ -662,9 +708,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Usuń"
 
-msgid "Delete this interface"
-msgstr "Usuń ten interfejs"
-
 msgid "Delete this network"
 msgstr "Usuń tą sieć"
 
@@ -684,6 +727,12 @@ msgstr "Urządzenie"
 msgid "Device Configuration"
 msgstr "Konfiguracja urządzenia"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostyka"
 
@@ -724,6 +773,9 @@ msgstr "Optymalizacja odległości"
 msgid "Distance to farthest network member in meters."
 msgstr "Odległość do najdalej oddalonego członka sieci w metrach."
 
+msgid "Distribution feeds"
+msgstr ""
+
 # Jak poprzednio trzymam się konwencji
 msgid "Diversity"
 msgstr "Wielorakość"
@@ -802,6 +854,9 @@ msgstr ""
 "Dynamicznie rezerwuje adresy DHCP dla klientów. Jeśli jest wyłączone tylko "
 "klienci posiadający stałe dzierżawy będą obsłużeni."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Metoda EAP"
 
@@ -916,6 +971,9 @@ msgstr "Zewnętrzny serwer dla loga systemowego"
 msgid "External system log server port"
 msgstr "Port zewnętrznego serwera dla loga systemowego"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Szybkie ramki (Fast Frames)"
 
@@ -937,6 +995,11 @@ msgstr "Filtruj prywatne"
 msgid "Filter useless"
 msgstr "Filtruj bezużyteczne"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Znajdź i podłącz się do sieci"
 
@@ -962,9 +1025,6 @@ msgstr "Wersja firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Stały port źródłowy dla wychodzących zapytań DNS"
 
-msgid "Flags"
-msgstr "Flagi"
-
 msgid "Flash Firmware"
 msgstr "Aktualizuj firmware"
 
@@ -996,6 +1056,9 @@ msgstr "Wymuś TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Wymuś TKIP i CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Przekazuj ruch DHCP"
 
@@ -1035,6 +1098,12 @@ msgstr "Ustawienia główne"
 msgid "General Setup"
 msgstr "Ustawienia podstawowe"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Twórz archiwum"
 
@@ -1046,6 +1115,9 @@ msgstr ""
 "Hasło nie zostało zmienione, wpisane poprzednie hasło routera jest "
 "niewłaściwe!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1150,6 +1222,9 @@ msgstr "Maska IPv4"
 msgid "IPv4 only"
 msgstr "Tylko IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Długość prefiksu IPv4"
 
@@ -1249,8 +1324,8 @@ msgstr ""
 "Memory\">RAM</abbr> będzie dostępna. Uwaga - plik wymiany jest dużo "
 "wolniejszy niż pamięć <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignoruj pliki Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "Ignoruj interfejs"
@@ -1264,6 +1339,11 @@ msgstr "Obraz"
 msgid "In"
 msgstr "W"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Czas bezczynności"
 
@@ -1449,6 +1529,9 @@ msgstr ""
 "Lista serwerów <abbr title=\"Domain Name System\">DNS</abbr> do których będą "
 "przekazywane zapytania"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Lista domen zezwalających na odpowiedzi RFC1918"
 
@@ -1471,6 +1554,9 @@ msgstr "Średnie obciążenie"
 msgid "Loading"
 msgstr "Ładowanie"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Lokalny adres IPv4"
 
@@ -1544,6 +1630,9 @@ msgstr "Filtr adresów MAC"
 msgid "MAC-List"
 msgstr "Lista MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1558,6 +1647,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Maksymalna Szybkość"
 
@@ -1576,6 +1668,11 @@ msgstr "Maksymalny czas podany w sekundach do pełnej gotowości modemu"
 msgid "Maximum hold time"
 msgstr "Maksymalny czas podtrzymania"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Maksymalna liczba dzierżawionych adresów."
 
@@ -1643,12 +1740,18 @@ msgstr ""
 "Punkty montowania definiują gdzie urządzenie pamięci zostanie podłączone do "
 "systemu plików"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Opcje montowania"
 
 msgid "Mount point"
 msgstr "Punkt montownia"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Zamontowane systemy plików"
 
@@ -1667,6 +1770,9 @@ msgstr "Adres Multicast`u"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1766,6 +1872,9 @@ msgstr "Nie podłączony"
 msgid "Note: Configuration files will be erased."
 msgstr "UWAGA: Pliki konfiguracyjne zostaną usunięte."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Spostrzeżenie"
 
@@ -1838,7 +1947,7 @@ msgid "Out"
 msgstr "Wychodzące"
 
 msgid "Outbound:"
-msgstr "Wychodzące:"
+msgstr "Wychodzący:"
 
 msgid "Outdoor Channels"
 msgstr "Kanały zewnętrzne"
@@ -1895,9 +2004,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Wymagany pakiet libiwinfo!"
 
@@ -1925,9 +2043,6 @@ msgstr "Hasło lub klucz prywatny"
 msgid "Password successfully changed!"
 msgstr "Pomyślnie zmieniono hasło!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "Ścieżka do certyfikatu CA"
 
@@ -1945,6 +2060,9 @@ msgstr ""
 msgid "Peak:"
 msgstr "Szczyt:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Wykonaj restart"
 
@@ -1966,9 +2084,6 @@ msgstr "Pktw."
 msgid "Please enter your username and password."
 msgstr "Proszę wprowadź swój login i hasło."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Proszę czekać: Ponowne uruchamianie..."
-
 msgid "Policy"
 msgstr "Zasada"
 
@@ -2252,9 +2367,6 @@ msgstr ""
 "Ścieżki routingu pokazują routerowi przez który interfejs oraz którą bramę "
 "może skomunikować się z daną siecią lub komputerem."
 
-msgid "Rule #"
-msgstr "Zasada #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Sprawdź czy system plików nie zawiera błędów przed zamontowaniem urządzenia"
@@ -2273,6 +2385,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Dostęp SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Klucze SSH"
 
@@ -2365,6 +2486,9 @@ msgstr "Sygnał:"
 msgid "Size"
 msgstr "Rozmiar"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Pomiń"
 
@@ -2660,6 +2784,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Wybrany protokół potrzebuje przypisanego urządzenia"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2720,6 +2847,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Ten adres IPv4 przekaźnika"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2889,6 +3022,9 @@ msgstr "Nieznany błąd, hasło nie zostało zmienione"
 msgid "Unmanaged"
 msgstr "Niezarządzalny"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Niezapisane zmiany"
 
@@ -3057,13 +3193,14 @@ msgstr "Trwa wprowadzenie zmian..."
 msgid "Waiting for command to complete..."
 msgstr "Trwa wykonanie polecenia..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Ostrzeżenie"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas "
-"restartu!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3296,6 +3433,27 @@ msgstr "tak"
 msgid "« Back"
 msgstr "« Wróć"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Usuń ten interfejs"
+
+#~ msgid "Flags"
+#~ msgstr "Flagi"
+
+#~ msgid "Rule #"
+#~ msgstr "Zasada #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignoruj pliki Hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Proszę czekać: Ponowne uruchamianie..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas "
+#~ "restartu!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index ec4401b..d278974 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Carga 1 Minuto:"
 msgid "15 Minute Load:"
 msgstr "Carga 15 Minutos:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Carga 5 Minutos:"
 
@@ -215,6 +218,9 @@ msgstr "Adiciona uma nova interface..."
 msgid "Additional Hosts files"
 msgstr "Arquivos adicionais de equipamentos conhecidos (hosts)"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Endereço"
 
@@ -280,6 +286,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -336,6 +348,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponível"
 
@@ -345,6 +372,9 @@ msgstr "Pacotes disponíveis"
 msgid "Average:"
 msgstr "Média:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -420,6 +450,11 @@ msgstr "Broadcom BCM%04x 802.11 Wireless Controlador"
 msgid "Buffered"
 msgstr "Buffered"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Botões"
 
@@ -456,6 +491,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Verificar"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Soma de verificação"
 
@@ -579,6 +617,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -657,9 +703,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Apagar"
 
-msgid "Delete this interface"
-msgstr "Apagar esta interface"
-
 msgid "Delete this network"
 msgstr "Apagar esta rede"
 
@@ -678,6 +721,12 @@ msgstr "Dispositivo"
 msgid "Device Configuration"
 msgstr "Configuração do Dispositivo"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnóstico"
 
@@ -719,6 +768,9 @@ msgstr "Otimização de Distância"
 msgid "Distance to farthest network member in meters."
 msgstr "Distância para o computador mais distante da rede (em metros)."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversidade"
 
@@ -798,6 +850,9 @@ msgstr ""
 "Aloca dinamicamente os endereços do DHCP para os clientes. Se desabilitado, "
 "somente os clientes com atribuições estáticas serão servidos. "
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Método EAP"
 
@@ -909,6 +964,9 @@ msgstr "Servidor externo de registros do sistema (syslog)"
 msgid "External system log server port"
 msgstr "Porta do servidor externo de registro do sistema (syslog)"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Quadros Rápidos"
 
@@ -930,6 +988,11 @@ msgstr "Filtrar endereços privados"
 msgid "Filter useless"
 msgstr "Filtrar consultas inúteis"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Procurar e conectar à rede"
 
@@ -954,9 +1017,6 @@ msgstr "Versão do Firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Porta de origem fixa para saída de consultas DNS"
 
-msgid "Flags"
-msgstr "Marcadores"
-
 msgid "Flash Firmware"
 msgstr "Gravar Firmware"
 
@@ -987,6 +1047,9 @@ msgstr "Forçar TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forçar TKIP e CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Encaminhar tráfego DHCP"
 
@@ -1026,6 +1089,12 @@ msgstr "Configurações Gerais"
 msgid "General Setup"
 msgstr "Configurações Gerais"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Gerar arquivo"
 
@@ -1035,6 +1104,9 @@ msgstr "Generico 802.11%s Wireless Controlador"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "A senha de confirmação informada não casa. Senha não alterada!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1141,6 +1213,9 @@ msgstr "Máscara de rede IPv4"
 msgid "IPv4 only"
 msgstr "Somente IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Tamanho do prefixo IPv4"
 
@@ -1242,8 +1317,8 @@ msgstr ""
 "de transferência tão altas com a memória <abbr title=\"Memória de Acesso "
 "Aleatório\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignorar interface"
@@ -1257,6 +1332,11 @@ msgstr "Imagem"
 msgid "In"
 msgstr "Entrada"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Tempo limite de inatividade"
 
@@ -1444,6 +1524,9 @@ msgstr ""
 "Lista dos servidores <abbr title=\"Domain Name System\">DNS</abbr> para "
 "encaminhar as requisições"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 "Lista dos domínios para os quais será permitido respostas apontando para "
@@ -1470,6 +1553,9 @@ msgstr "Carga Média"
 msgid "Loading"
 msgstr "Carregando"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Endereço IPv4 local"
 
@@ -1545,6 +1631,9 @@ msgstr "Filtro de MAC"
 msgid "MAC-List"
 msgstr "Lista de MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1561,6 +1650,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Taxa Máxima"
 
@@ -1580,6 +1672,11 @@ msgstr "Tempo máximo, em segundos, para esperar que o modem fique pronto"
 msgid "Maximum hold time"
 msgstr "Tempo máximo de espera"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Número máximo de endereços atribuídos."
 
@@ -1647,12 +1744,18 @@ msgstr ""
 "Pontos de montagem definem em que ponto um dispositivo de armazenamento será "
 "anexado ao sistema de arquivos"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Opções de montagem"
 
 msgid "Mount point"
 msgstr "Ponto de montagem"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Sistemas de arquivos montados"
 
@@ -1671,6 +1774,9 @@ msgstr "Endereço de Multicast"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1770,6 +1876,9 @@ msgstr "Não conectado"
 msgid "Note: Configuration files will be erased."
 msgstr "Nota: Os arquivos de configuração serão apagados."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Aviso"
 
@@ -1902,9 +2011,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "O pacote libiwinfo é necessário!"
 
@@ -1932,9 +2050,6 @@ msgstr "Senha da Chave Privada"
 msgid "Password successfully changed!"
 msgstr "A senha foi alterada com sucesso!"
 
-msgid "Path"
-msgstr "Directório"
-
 msgid "Path to CA-Certificate"
 msgstr "Caminho para o Certificado da AC"
 
@@ -1950,6 +2065,9 @@ msgstr "Caminho para o executável que trata o evento do botão"
 msgid "Peak:"
 msgstr "Pico:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Reiniciar o sistema"
 
@@ -1971,9 +2089,6 @@ msgstr "Pcts."
 msgid "Please enter your username and password."
 msgstr "Entre com o seu usuário e senha."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Por favor aguarde: Equipamento reiniciando..."
-
 msgid "Policy"
 msgstr "Política"
 
@@ -2257,9 +2372,6 @@ msgstr ""
 "As rotas especificam através de qual interface e roteador um certo destino "
 "podem ser alcançado."
 
-msgid "Rule #"
-msgstr "Regra #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Execute a verificação do sistema de arquivos antes da montagem do dispositivo"
@@ -2278,6 +2390,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Acesso SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Chaves SSH"
 
@@ -2369,6 +2490,9 @@ msgstr "Sinal:"
 msgid "Size"
 msgstr "Tamanho"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Pular"
 
@@ -2663,6 +2787,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "O protocolo selecionado necessita estar associado a um dispositivo"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2724,6 +2851,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Este endereço IPv4 do repassar"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2891,6 +3024,9 @@ msgstr "Erro Desconhecido, a senha não foi alterada!"
 msgid "Unmanaged"
 msgstr "Não gerenciado"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Alterações Não Salvas"
 
@@ -3058,13 +3194,14 @@ msgstr "Esperando a aplicação das mudanças..."
 msgid "Waiting for command to complete..."
 msgstr "Esperando o término do comando..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Atenção"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Aviso: Existem alterações não salvas que serão perdidas durante a "
-"reiniciação!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3300,6 +3437,30 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Apagar esta interface"
+
+#~ msgid "Flags"
+#~ msgstr "Marcadores"
+
+#~ msgid "Rule #"
+#~ msgstr "Regra #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)"
+
+#~ msgid "Path"
+#~ msgstr "Directório"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Por favor aguarde: Equipamento reiniciando..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
+#~ "reiniciação!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -4158,9 +4319,6 @@ msgstr "« Voltar"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independente (Ad-Hoc)"
 
index 1acc852..874afc9 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Carga de 1 Minuto:"
 msgid "15 Minute Load:"
 msgstr "Carga de 15 minutos:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Carga 5 Minutos:"
 
@@ -215,6 +218,9 @@ msgstr "Adicionar uma nova interface..."
 msgid "Additional Hosts files"
 msgstr "Ficheiro Adicional de Hosts"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Endereço"
 
@@ -278,6 +284,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -334,6 +346,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponível"
 
@@ -343,6 +370,9 @@ msgstr "Pacotes disponíveis"
 msgid "Average:"
 msgstr "Média:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -418,6 +448,11 @@ msgstr "Controlador Wireless Broadcom BCM%04x 802.11"
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Botões"
 
@@ -454,6 +489,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Verificar"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Checksum"
 
@@ -576,6 +614,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -654,9 +700,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Apagar"
 
-msgid "Delete this interface"
-msgstr "Apagar esta interface"
-
 msgid "Delete this network"
 msgstr "Apagar esta rede"
 
@@ -675,6 +718,12 @@ msgstr "Dispositivo"
 msgid "Device Configuration"
 msgstr "Configuração do Dispositivo"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnósticos"
 
@@ -715,6 +764,9 @@ msgstr "Optimização de Distância"
 msgid "Distance to farthest network member in meters."
 msgstr "Distância para o último host da rede em metros."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversidade"
 
@@ -791,6 +843,9 @@ msgstr ""
 "Alocar dinamicamente endereços DHCP para clientes. Se desativado, só os "
 "clientes com reservas estáticas serão servidos."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Metodo-EAP"
 
@@ -902,6 +957,9 @@ msgstr "Servidor externo de logs de sistema"
 msgid "External system log server port"
 msgstr "Porta do Servidor externo de logs de sistema"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Frames Rápidas"
 
@@ -923,6 +981,11 @@ msgstr "Filtrar endereços privados"
 msgid "Filter useless"
 msgstr "Filtro inútil"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Procurar e ligar rede"
 
@@ -947,9 +1010,6 @@ msgstr "Versão do Firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Porta fixa de origem para saída das consultas DNS"
 
-msgid "Flags"
-msgstr "Flags"
-
 msgid "Flash Firmware"
 msgstr "Gravar Firmware"
 
@@ -980,6 +1040,9 @@ msgstr "Forçar TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forçar TKIP e CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Encaminhar tráfego DHCP"
 
@@ -1019,6 +1082,12 @@ msgstr "Definições Gerais"
 msgid "General Setup"
 msgstr "Configuração Geral"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Gerar arquivo"
 
@@ -1029,6 +1098,9 @@ msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 "A confirmação de password não corresponde, a password não foi alterada!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1133,6 +1205,9 @@ msgstr "Máscara IPv4"
 msgid "IPv4 only"
 msgstr "Só IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Comprimento do prefixo IPv4"
 
@@ -1228,8 +1303,8 @@ msgstr ""
 "lento pois o dispositivo swap não pode ser acedido com um nível elevado de "
 "memória <abbr title=\"Memória de Acesso Aleatório\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ignorar ficheiros de Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ignorar interface"
@@ -1243,6 +1318,11 @@ msgstr "Imagem"
 msgid "In"
 msgstr "Entrada"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Tempo de inatividade"
 
@@ -1427,6 +1507,9 @@ msgstr ""
 "Lista de servidores <abbr title=\"Sistema Nomes de Domínio\">DNS</abbr> para "
 "onde encaminhar os pedidos"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Lista de dominios que permitem respostas RFC1918 para"
 
@@ -1449,6 +1532,9 @@ msgstr "Carga Média"
 msgid "Loading"
 msgstr "A carregar"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Endereço IPv4 Local"
 
@@ -1521,6 +1607,9 @@ msgstr "Filtro-MAC"
 msgid "MAC-List"
 msgstr "Lista-MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1535,6 +1624,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Taxa Máxima"
 
@@ -1553,6 +1645,11 @@ msgstr "Número máximo de segundos a esperar pelo modem para ficar pronto"
 msgid "Maximum hold time"
 msgstr "Tempo máximo de espera"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Número máximo de endereços concessionados."
 
@@ -1620,12 +1717,18 @@ msgstr ""
 "Pontos de montagem definem em que ponto um dispositivo de memória será "
 "anexado ao sistema de arquivos"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr "Ponto de montagem"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Sistemas de arquivos montados"
 
@@ -1644,6 +1747,9 @@ msgstr "Endereço de multicast"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1743,6 +1849,9 @@ msgstr "Não ligado"
 msgid "Note: Configuration files will be erased."
 msgstr "Nota: Os ficheiros de configuração serão apagados."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Reparo"
 
@@ -1871,9 +1980,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtp"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "O pacote libiwinfo é necessário!"
 
@@ -1901,9 +2019,6 @@ msgstr "Senha da Chave Privada"
 msgid "Password successfully changed!"
 msgstr "Password alterada com sucesso!"
 
-msgid "Path"
-msgstr "Directório"
-
 msgid "Path to CA-Certificate"
 msgstr "Directorio do Certificado CA"
 
@@ -1919,6 +2034,9 @@ msgstr "Caminho do executável que lida com o botão de eventos"
 msgid "Peak:"
 msgstr "Pico:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Executar reinicialização"
 
@@ -1940,9 +2058,6 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Insira o seu username e password."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Por favor aguarde: Equipamento a reiniciar..."
-
 msgid "Policy"
 msgstr "Política"
 
@@ -2221,9 +2336,6 @@ msgstr ""
 "As rotas especificam através de que interfaces ou gateways podem ser "
 "alcançados determinadas redes ou hosts."
 
-msgid "Rule #"
-msgstr "Regra #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Correr uma verificação do sistema de ficheiros antes de montar um dispositivo"
@@ -2242,6 +2354,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Acesso SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Chaves-SSH"
 
@@ -2331,6 +2452,9 @@ msgstr "Sinal:"
 msgid "Size"
 msgstr "Tamanho"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Saltar"
 
@@ -2605,6 +2729,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "O protocolo escolhido precisa de um dispositivo atribuído."
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2666,6 +2793,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2825,6 +2958,9 @@ msgstr "Erro Desconhecido, a password não foi alterada!"
 msgid "Unmanaged"
 msgstr "Não gerido"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Alterações não Guardadas"
 
@@ -2984,13 +3120,14 @@ msgstr "A aguardar que as mudanças sejam aplicadas..."
 msgid "Waiting for command to complete..."
 msgstr "A aguardar que o comando termine..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Aviso"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Aviso: Existem alterações não salvas que serão perdidas durante a "
-"reinicialização!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3225,6 +3362,30 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Apagar esta interface"
+
+#~ msgid "Flags"
+#~ msgstr "Flags"
+
+#~ msgid "Rule #"
+#~ msgstr "Regra #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar ficheiros de Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Directório"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Por favor aguarde: Equipamento a reiniciar..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
+#~ "reinicialização!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -3860,9 +4021,6 @@ msgstr "« Voltar"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Independente (Ad-Hoc)"
 
index 3692b7d..cb2b7d5 100644 (file)
@@ -45,6 +45,9 @@ msgstr "Incarcarea in ultimul minut"
 msgid "15 Minute Load:"
 msgstr "Incarcarea in ultimele 15 minute"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Incarcarea in ultimele 5 minute"
 
@@ -202,6 +205,9 @@ msgstr "Adauga interfata noua.."
 msgid "Additional Hosts files"
 msgstr "Fisiere de tip hosts aditionale"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresa"
 
@@ -265,6 +271,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Antena 1"
 
@@ -321,6 +333,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Disponibil"
 
@@ -330,6 +357,9 @@ msgstr "Pachete disponibile"
 msgid "Average:"
 msgstr "Medie:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -402,6 +432,11 @@ msgstr "Broadcom BCM%04x 802.11 Controller Fara Fir"
 msgid "Buffered"
 msgstr "Incarcat"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Butoane"
 
@@ -438,6 +473,9 @@ msgstr "Canal"
 msgid "Check"
 msgstr "Verificare"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Suma de verificare"
 
@@ -552,6 +590,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -625,9 +671,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Sterge"
 
-msgid "Delete this interface"
-msgstr "Sterge aceasta interfata"
-
 msgid "Delete this network"
 msgstr "Sterge aceasta retea"
 
@@ -646,6 +689,12 @@ msgstr "Dispozitiv"
 msgid "Device Configuration"
 msgstr "Configurarea dispozitivului"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosticuri"
 
@@ -686,6 +735,9 @@ msgstr "Optimizarea distantei"
 msgid "Distance to farthest network member in meters."
 msgstr "Distanta catre cel mai departat membru din retea in metri."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Diversitate"
 
@@ -747,6 +799,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
@@ -855,6 +910,9 @@ msgstr "Server de log-uri extern"
 msgid "External system log server port"
 msgstr "Portul serverului de log-uri extern"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -876,6 +934,11 @@ msgstr "Filtreaza privatele"
 msgid "Filter useless"
 msgstr "Filtreaza nefolositele"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Gaseste si alatura in retea"
 
@@ -900,9 +963,6 @@ msgstr "Versiunea de firmware"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Portul sursa pentru intrebarile DNS catre exterior"
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr "Rescrie firmware"
 
@@ -934,6 +994,9 @@ msgstr "Forteaza TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Forteaza TKIP si CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -973,6 +1036,12 @@ msgstr "Setari principale"
 msgid "General Setup"
 msgstr "Configurare generala"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -982,6 +1051,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "Confirmarea parolei nu se potriveste cu prima, parola neschimbata !"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1081,6 +1153,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr "Doar IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1170,7 +1245,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1185,6 +1260,11 @@ msgstr "Imagine"
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1366,6 +1446,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1387,6 +1470,9 @@ msgstr "Incarcarea medie"
 msgid "Loading"
 msgstr "Incarcare"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Adresa IPv4 locala"
 
@@ -1454,6 +1540,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1468,6 +1557,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Rata maxima"
 
@@ -1486,6 +1578,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1551,12 +1648,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1575,6 +1678,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1674,6 +1780,9 @@ msgstr "Nu este conectat"
 msgid "Note: Configuration files will be erased."
 msgstr "Nota: fisierele de configurare vor fi sterse."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Notificare"
 
@@ -1796,9 +1905,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Pachetul libiwinfo este necesar !"
 
@@ -1826,9 +1944,6 @@ msgstr "Parola cheii private"
 msgid "Password successfully changed!"
 msgstr "Parola schimbata cu succes !"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "Calea catre certificatul CA"
 
@@ -1844,6 +1959,9 @@ msgstr "Calea catre executabilul care se ocupa de evenimentul butonului"
 msgid "Peak:"
 msgstr "Maxim:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Restarteaza"
 
@@ -1865,9 +1983,6 @@ msgstr "Packete."
 msgid "Please enter your username and password."
 msgstr "Introdu utilizatorul si parola."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Asteapta: dispozitivul se restarteaza.."
-
 msgid "Policy"
 msgstr ""
 
@@ -2133,9 +2248,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr "Regula #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2153,6 +2265,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Acces SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "Cheile SSH"
 
@@ -2242,6 +2363,9 @@ msgstr "Semnal:"
 msgid "Size"
 msgstr "Marime"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2492,6 +2616,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2542,6 +2669,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2693,6 +2826,9 @@ msgstr "Eroare necunoscuta, parola neschimbata !"
 msgid "Unmanaged"
 msgstr "Neadministrate"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Modificari nesalvate"
 
@@ -2852,11 +2988,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Avertizare"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Atentie: exista modificari nesalvate care vor fi pierdute la restart !"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3080,6 +3219,20 @@ msgstr "da"
 msgid "« Back"
 msgstr "« Inapoi"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Sterge aceasta interfata"
+
+#~ msgid "Rule #"
+#~ msgstr "Regula #"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Asteapta: dispozitivul se restarteaza.."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Atentie: exista modificari nesalvate care vor fi pierdute la restart !"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index 94fa6fb..0a1cfea 100644 (file)
@@ -48,6 +48,9 @@ msgstr "Загрузка за 1 минуту:"
 msgid "15 Minute Load:"
 msgstr "Загрузка за 15 минут:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Загрузка за 5 минут:"
 
@@ -212,6 +215,9 @@ msgstr "Добавить новый интерфейс..."
 msgid "Additional Hosts files"
 msgstr "Дополнительные файлы hosts"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Адрес"
 
@@ -277,6 +283,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Антенна 1"
 
@@ -333,6 +345,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Доступно"
 
@@ -342,6 +369,9 @@ msgstr "Доступные пакеты"
 msgid "Average:"
 msgstr "Средняя:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -418,6 +448,11 @@ msgstr "Беспроводной 802.11 контроллер Broadcom BCM%04x"
 msgid "Buffered"
 msgstr "Буферизировано"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Кнопки"
 
@@ -454,6 +489,9 @@ msgstr "Канал"
 msgid "Check"
 msgstr "Проверить"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Контрольная сумма"
 
@@ -576,6 +614,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -653,9 +699,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Удалить"
 
-msgid "Delete this interface"
-msgstr "Удалить этот интерфейс"
-
 msgid "Delete this network"
 msgstr "Удалить эту сеть"
 
@@ -674,6 +717,12 @@ msgstr "Устройство"
 msgid "Device Configuration"
 msgstr "Конфигурация устройства"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Диагностика"
 
@@ -714,6 +763,9 @@ msgstr "Оптимизация расстояния"
 msgid "Distance to farthest network member in meters."
 msgstr "Расстояние до самого удалённого сетевого узла в метрах."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Разновидность антенн"
 
@@ -789,6 +841,9 @@ msgstr ""
 "Динамически выделять DHCP-адреса клиентам. Если выключено, то будут "
 "обслужены только клиенты с постоянно арендованными адресами."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "Метод EAP"
 
@@ -903,6 +958,9 @@ msgstr "Сервер системного журнала"
 msgid "External system log server port"
 msgstr "Порт сервера системного журнала"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Быстрые кадры"
 
@@ -924,6 +982,11 @@ msgstr "Фильтровать частные"
 msgid "Filter useless"
 msgstr "Фильтровать бесполезные"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Найти и присоединиться к сети"
 
@@ -948,9 +1011,6 @@ msgstr "Версия прошивки"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Фиксированный порт для исходящих DNS-запросов"
 
-msgid "Flags"
-msgstr "Флаги"
-
 msgid "Flash Firmware"
 msgstr "Установить прошивку"
 
@@ -982,6 +1042,9 @@ msgstr "Требовать TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "TKIP или CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Перенаправлять трафик DHCP"
 
@@ -1021,6 +1084,12 @@ msgstr "Основные настройки"
 msgid "General Setup"
 msgstr "Основные настройки"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Создать архив"
 
@@ -1030,6 +1099,9 @@ msgstr "Беспроводной 802.11%s контроллер"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "Введённые пароли не совпадают, пароль не изменён!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1132,6 +1204,9 @@ msgstr "Маска сети IPv4"
 msgid "IPv4 only"
 msgstr "Только IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Длина префикса IPv4"
 
@@ -1231,8 +1306,8 @@ msgstr ""
 "устройство, на котором располагается раздел подкачки, работает гораздо "
 "медленнее, чем <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Игнорировать файлы hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignore <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Игнорировать интерфейс"
@@ -1246,6 +1321,11 @@ msgstr "Образ"
 msgid "In"
 msgstr "В"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Таймаут бездействия"
 
@@ -1431,6 +1511,9 @@ msgstr ""
 "Список <abbr title=\"Domain Name System\">DNS</abbr>-серверов для "
 "перенаправления запросов"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Список доменов, для которых разрешены ответы RFC1918"
 
@@ -1452,6 +1535,9 @@ msgstr "Средняя загрузка"
 msgid "Loading"
 msgstr "Загрузка"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Локальный IPv4-адрес"
 
@@ -1526,6 +1612,9 @@ msgstr "MAC-фильтр"
 msgid "MAC-List"
 msgstr "Список MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "МБ/с"
 
@@ -1540,6 +1629,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Максимальная скорость"
 
@@ -1558,6 +1650,11 @@ msgstr "Максимальное время ожидания готовност
 msgid "Maximum hold time"
 msgstr "Максимальное время удержания"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Максимальное количество арендованных адресов."
 
@@ -1626,12 +1723,18 @@ msgstr ""
 "Точки монтирования определяют, куда в файловой системе будет прикреплено "
 "запоминающее устройство"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Опции монтирования"
 
 msgid "Mount point"
 msgstr "Точка монтирования"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Смонтированные файловые системы"
 
@@ -1650,6 +1753,9 @@ msgstr "Адрес групповой передачи"
 msgid "NAS ID"
 msgstr "Идентификатор NAS"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1749,6 +1855,9 @@ msgstr "Не подключено"
 msgid "Note: Configuration files will be erased."
 msgstr "Примечание: конфигурационные файлы будут стёрты."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Заметка"
 
@@ -1879,9 +1988,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPTP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Требуется пакет libiwinfo!"
 
@@ -1909,9 +2027,6 @@ msgstr "Пароль или закрытый ключ"
 msgid "Password successfully changed!"
 msgstr "Пароль успешно изменён!"
 
-msgid "Path"
-msgstr "Путь"
-
 msgid "Path to CA-Certificate"
 msgstr "Путь к центру сертификации"
 
@@ -1927,6 +2042,9 @@ msgstr "Путь к программе, обрабатывающей нажат
 msgid "Peak:"
 msgstr "Пиковая:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Выполнить перезагрузку"
 
@@ -1948,9 +2066,6 @@ msgstr "Пакетов."
 msgid "Please enter your username and password."
 msgstr "Пожалуйста, введите логин и пароль."
 
-msgid "Please wait: Device rebooting..."
-msgstr "Пожалуйста подождите: устройство перезагружается..."
-
 msgid "Policy"
 msgstr "Политика"
 
@@ -2232,9 +2347,6 @@ msgstr ""
 "Маршрутизация служит для определения через какой интерфейс и шлюз можно "
 "достичть определённого хоста или сети."
 
-msgid "Rule #"
-msgstr "Правило №"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Проверять файловую систему перед монтированием устройства"
 
@@ -2252,6 +2364,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "Доступ по SSH"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-ключи"
 
@@ -2343,6 +2464,9 @@ msgstr "Сигнал:"
 msgid "Size"
 msgstr "Размер"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Пропустить"
 
@@ -2633,6 +2757,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Для выбранного протокола необходимо задать устройство"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2693,6 +2820,12 @@ msgid "This IPv4 address of the relay"
 msgstr "IPv4-адрес ретранслятора"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2860,6 +2993,9 @@ msgstr "Неизвестная ошибка, пароль не был измен
 msgid "Unmanaged"
 msgstr "Неуправляемый"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Непринятые изменения"
 
@@ -3027,13 +3163,14 @@ msgstr "Ожидание применения изменений..."
 msgid "Waiting for command to complete..."
 msgstr "Ожидание завершения выполнения команды..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Внимание"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
-"Внимание: есть несохранённые изменения, которые потеряются после "
-"перезагрузки!"
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3267,6 +3404,30 @@ msgstr "да"
 msgid "« Back"
 msgstr "« Назад"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Удалить этот интерфейс"
+
+#~ msgid "Flags"
+#~ msgstr "Флаги"
+
+#~ msgid "Rule #"
+#~ msgstr "Правило №"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Игнорировать файлы hosts"
+
+#~ msgid "Path"
+#~ msgstr "Путь"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Пожалуйста подождите: устройство перезагружается..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Внимание: есть несохранённые изменения, которые потеряются после "
+#~ "перезагрузки!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
@@ -4101,9 +4262,6 @@ msgstr "« Назад"
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Здесь вы можете настроить установленные Wi-Fi устройства."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignore <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Незаыисимая (Ad-Hoc)"
 
index d943ccb..a536bb1 100644 (file)
@@ -41,6 +41,9 @@ msgstr ""
 msgid "15 Minute Load:"
 msgstr ""
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr ""
 
@@ -190,6 +193,9 @@ msgstr ""
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr ""
 
@@ -250,6 +256,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr ""
 
@@ -306,6 +318,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr ""
 
@@ -315,6 +342,9 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -387,6 +417,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr ""
 
@@ -423,6 +458,9 @@ msgstr ""
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr ""
 
@@ -534,6 +572,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -607,9 +653,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -628,6 +671,12 @@ msgstr ""
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -666,6 +715,9 @@ msgstr ""
 msgid "Distance to farthest network member in meters."
 msgstr ""
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr ""
 
@@ -727,6 +779,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
@@ -835,6 +890,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -856,6 +914,11 @@ msgstr ""
 msgid "Filter useless"
 msgstr ""
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -880,9 +943,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr ""
 
@@ -913,6 +973,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -952,6 +1015,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -961,6 +1030,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1058,6 +1130,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1147,7 +1222,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1162,6 +1237,11 @@ msgstr ""
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1340,6 +1420,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1361,6 +1444,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1428,6 +1514,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1442,6 +1531,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr ""
 
@@ -1460,6 +1552,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1525,12 +1622,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1549,6 +1652,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1648,6 +1754,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1770,9 +1879,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1800,9 +1918,6 @@ msgstr ""
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr ""
 
@@ -1818,6 +1933,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr ""
 
@@ -1839,9 +1957,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
 msgid "Policy"
 msgstr ""
 
@@ -2105,9 +2220,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2125,6 +2237,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2213,6 +2334,9 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2463,6 +2587,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2511,6 +2638,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2662,6 +2795,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr ""
 
@@ -2819,10 +2955,13 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
index 86fa224..1ac3f6c 100644 (file)
@@ -44,6 +44,9 @@ msgstr "Belastning senaste minuten:"
 msgid "15 Minute Load:"
 msgstr "Belastning senaste 15 minutrarna:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Belastning senaste 5 minutrarna:"
 
@@ -196,6 +199,9 @@ msgstr ""
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr ""
 
@@ -256,6 +262,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr ""
 
@@ -312,6 +324,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr ""
 
@@ -321,6 +348,9 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -393,6 +423,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr ""
 
@@ -429,6 +464,9 @@ msgstr ""
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr ""
 
@@ -540,6 +578,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -613,9 +659,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -634,6 +677,12 @@ msgstr ""
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -672,6 +721,9 @@ msgstr ""
 msgid "Distance to farthest network member in meters."
 msgstr ""
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr ""
 
@@ -733,6 +785,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
@@ -841,6 +896,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -862,6 +920,11 @@ msgstr ""
 msgid "Filter useless"
 msgstr ""
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -886,9 +949,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr ""
 
@@ -919,6 +979,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -958,6 +1021,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -967,6 +1036,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1064,6 +1136,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1153,7 +1228,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1168,6 +1243,11 @@ msgstr ""
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1346,6 +1426,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1367,6 +1450,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1434,6 +1520,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1448,6 +1537,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr ""
 
@@ -1466,6 +1558,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1531,12 +1628,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1555,6 +1658,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1654,6 +1760,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1776,9 +1885,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1806,9 +1924,6 @@ msgstr ""
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr ""
 
@@ -1824,6 +1939,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr ""
 
@@ -1845,9 +1963,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
 msgid "Policy"
 msgstr ""
 
@@ -2111,9 +2226,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2131,6 +2243,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2219,6 +2340,9 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2469,6 +2593,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2517,6 +2644,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2668,6 +2801,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr ""
 
@@ -2825,10 +2961,13 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
index 21ec657..baa1777 100644 (file)
@@ -34,6 +34,9 @@ msgstr ""
 msgid "15 Minute Load:"
 msgstr ""
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr ""
 
@@ -183,6 +186,9 @@ msgstr ""
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr ""
 
@@ -243,6 +249,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr ""
 
@@ -299,6 +311,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr ""
 
@@ -308,6 +335,9 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -380,6 +410,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr ""
 
@@ -416,6 +451,9 @@ msgstr ""
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr ""
 
@@ -527,6 +565,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -600,9 +646,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -621,6 +664,12 @@ msgstr ""
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -659,6 +708,9 @@ msgstr ""
 msgid "Distance to farthest network member in meters."
 msgstr ""
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr ""
 
@@ -720,12 +772,20 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
 msgid "Edit"
 msgstr ""
 
+msgid ""
+"Edit the raw configuration data above to fix any error and hit \"Save\" to "
+"reload the page."
+msgstr ""
+
 msgid "Edit this interface"
 msgstr ""
 
@@ -823,6 +883,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -844,6 +907,11 @@ msgstr ""
 msgid "Filter useless"
 msgstr ""
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -868,9 +936,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr ""
 
@@ -901,6 +966,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -940,6 +1008,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -949,6 +1023,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1046,6 +1123,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1135,7 +1215,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1150,6 +1230,11 @@ msgstr ""
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1328,6 +1413,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1349,6 +1437,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1416,6 +1507,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1430,6 +1524,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr ""
 
@@ -1448,6 +1545,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1513,12 +1615,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1537,6 +1645,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1636,6 +1747,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1758,9 +1872,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1788,9 +1911,6 @@ msgstr ""
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr ""
 
@@ -1806,6 +1926,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr ""
 
@@ -1827,9 +1950,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
 msgid "Policy"
 msgstr ""
 
@@ -2093,9 +2213,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2113,6 +2230,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2201,6 +2327,9 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2394,6 +2523,9 @@ msgid ""
 "code> and <code>_</code>"
 msgstr ""
 
+msgid "The configuration file could not be loaded due to the following error:"
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -2448,6 +2580,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2496,6 +2631,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2647,6 +2788,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr ""
 
@@ -2804,10 +2948,13 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
index 1bf53aa..6a5a0b2 100644 (file)
@@ -44,6 +44,9 @@ msgstr "1 Dakikalık Yük:"
 msgid "15 Minute Load:"
 msgstr "15 Dakikalık Yük:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "5 Dakikalık Yük:"
 
@@ -201,6 +204,9 @@ msgstr "Yeni arabirim ekle..."
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Adresler"
 
@@ -263,6 +269,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "1. Anten"
 
@@ -319,6 +331,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Kullanılabilir"
 
@@ -328,6 +355,9 @@ msgstr "Kullanılabilir Paketler"
 msgid "Average:"
 msgstr "Ortalama:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -400,6 +430,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr ""
 
@@ -436,6 +471,9 @@ msgstr ""
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr ""
 
@@ -547,6 +585,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -620,9 +666,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -641,6 +684,12 @@ msgstr ""
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -679,6 +728,9 @@ msgstr ""
 msgid "Distance to farthest network member in meters."
 msgstr ""
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr ""
 
@@ -740,6 +792,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr ""
 
@@ -848,6 +903,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr ""
 
@@ -869,6 +927,11 @@ msgstr ""
 msgid "Filter useless"
 msgstr ""
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -893,9 +956,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr ""
-
 msgid "Flash Firmware"
 msgstr ""
 
@@ -926,6 +986,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -965,6 +1028,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -974,6 +1043,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1071,6 +1143,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1160,7 +1235,7 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
 
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
 msgstr ""
 
 msgid "Ignore interface"
@@ -1175,6 +1250,11 @@ msgstr ""
 msgid "In"
 msgstr ""
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1353,6 +1433,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1374,6 +1457,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1441,6 +1527,9 @@ msgstr ""
 msgid "MAC-List"
 msgstr ""
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1455,6 +1544,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr ""
 
@@ -1473,6 +1565,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr ""
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1538,12 +1635,18 @@ msgid ""
 "filesystem"
 msgstr ""
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr ""
 
@@ -1562,6 +1665,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr ""
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1661,6 +1767,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1783,9 +1892,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1813,9 +1931,6 @@ msgstr ""
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr ""
 
@@ -1831,6 +1946,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr ""
 
@@ -1852,9 +1970,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
 msgid "Policy"
 msgstr ""
 
@@ -2118,9 +2233,6 @@ msgid ""
 "can be reached."
 msgstr ""
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2138,6 +2250,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2226,6 +2347,9 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2476,6 +2600,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2524,6 +2651,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2675,6 +2808,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr ""
 
@@ -2832,10 +2968,13 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
index c548322..df2964a 100644 (file)
@@ -45,6 +45,9 @@ msgstr "Навантаження за 1 хвилину:"
 msgid "15 Minute Load:"
 msgstr "Навантаження за 15 хвилин:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "Навантаження за 5 хвилин:"
 
@@ -222,6 +225,9 @@ msgstr "Додати новий інтерфейс..."
 msgid "Additional Hosts files"
 msgstr "Додаткові файли hosts"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "Адреса"
 
@@ -287,6 +293,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "Антена 1"
 
@@ -343,6 +355,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Доступно"
 
@@ -352,6 +379,9 @@ msgstr "Доступні пакети"
 msgid "Average:"
 msgstr "Середнє значення:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -427,6 +457,11 @@ msgstr "Бездротовий 802.11 контролер Broadcom BCM%04x"
 msgid "Buffered"
 msgstr "Буферизовано"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "Кнопки"
 
@@ -463,6 +498,9 @@ msgstr "Канал"
 msgid "Check"
 msgstr "Перевірити"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Контрольна сума"
 
@@ -585,6 +623,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -663,9 +709,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Видалити"
 
-msgid "Delete this interface"
-msgstr "Видалити цей інтерфейс"
-
 msgid "Delete this network"
 msgstr "Видалити цю мережу"
 
@@ -684,6 +727,12 @@ msgstr "Пристрій"
 msgid "Device Configuration"
 msgstr "Конфігурація пристрою"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Діагностика"
 
@@ -724,6 +773,9 @@ msgstr "Оптимізація за відстанню"
 msgid "Distance to farthest network member in meters."
 msgstr "Відстань до найвіддаленішого вузла мережі в метрах."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Різновидність"
 
@@ -801,6 +853,9 @@ msgstr ""
 "Динамічне виділення DHCP-адрес для клієнтів. Якщо вимкнути, будуть "
 "обслуговуватися тільки клієнти, які мають статичні оренди."
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Метод"
 
@@ -911,6 +966,9 @@ msgstr "Зовнішній сервер системного журналу"
 msgid "External system log server port"
 msgstr "Порт зовнішнього сервера системного журналу"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Швидкі фрейми"
 
@@ -932,6 +990,11 @@ msgstr "Фільтрувати приватні"
 msgid "Filter useless"
 msgstr "Фільтрувати непридатні"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "Знайти мережу й приєднатися"
 
@@ -956,9 +1019,6 @@ msgstr "Версія прошивки"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Фіксований порт для вихідних DNS-запитів"
 
-msgid "Flags"
-msgstr "Позначки"
-
 msgid "Flash Firmware"
 msgstr "Заливаємо прошивку"
 
@@ -989,6 +1049,9 @@ msgstr "Примусово TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Примусово TKIP та CCMP (AES)"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "Спрямовувати DHCP-трафік"
 
@@ -1028,6 +1091,12 @@ msgstr "Загальні настройки"
 msgid "General Setup"
 msgstr "Загальні настройки"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "Cтворити архів"
 
@@ -1037,6 +1106,9 @@ msgstr "Бездротовий 802.11%s контролер"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "Оскільки пароль і підтвердження не співпадають, то пароль не змінено!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1140,6 +1212,9 @@ msgstr "Маска мережі IPv4"
 msgid "IPv4 only"
 msgstr "Тільки IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "Довжина префікса IPv4"
 
@@ -1239,8 +1314,8 @@ msgstr ""
 "своп-пристрої не можуть бути доступні з такою високою швидкістю, як <abbr "
 "title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr "Ігнорувати файли hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "Ігнорувати интерфейс"
@@ -1254,6 +1329,11 @@ msgstr "Образ"
 msgid "In"
 msgstr "Вх."
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "Тайм-аут бездіяльності"
 
@@ -1438,6 +1518,9 @@ msgstr ""
 "Список <abbr title=\"Domain Name System\">DNS</abbr>-серверів, до яких "
 "пересилати запити"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "Список доменів, для яких дозволені RFC1918-відповіді"
 
@@ -1461,6 +1544,9 @@ msgstr "Середнє навантаження"
 msgid "Loading"
 msgstr "Завантаження"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "Локальна адреса IPv4"
 
@@ -1535,6 +1621,9 @@ msgstr "MAC-фільтр"
 msgid "MAC-List"
 msgstr "MAC-список"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MБ/с"
 
@@ -1549,6 +1638,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Максимальна швидкість"
 
@@ -1567,6 +1659,11 @@ msgstr "Максимальний час очікування готовност
 msgid "Maximum hold time"
 msgstr "Максимальний час утримування"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "Максимальна кількість орендованих адрес."
 
@@ -1634,12 +1731,18 @@ msgstr ""
 "Точки монтування визначають, до якої точки пристрою пам'яті буде прикріплена "
 "файлова система"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "Опції монтування"
 
 msgid "Mount point"
 msgstr "Точка монтування"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Змонтовані файлові системи"
 
@@ -1658,6 +1761,9 @@ msgstr "Адреса багатоадресного потоку"
 msgid "NAS ID"
 msgstr "Ідентифікатор NAS"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1757,6 +1863,9 @@ msgstr "Не підключено"
 msgid "Note: Configuration files will be erased."
 msgstr "Примітка: конфігураційні файли будуть видалені."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "Попередження"
 
@@ -1890,9 +1999,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "Потрібен пакет libiwinfo!"
 
@@ -1920,9 +2038,6 @@ msgstr "Пароль закритого ключа"
 msgid "Password successfully changed!"
 msgstr "Пароль успішно змінено!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "Шлях до центру сертифікції"
 
@@ -1938,6 +2053,9 @@ msgstr "Шлях до програми, яка обробляє натискан
 msgid "Peak:"
 msgstr "Пік:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Виконати перезавантаження"
 
@@ -1959,9 +2077,6 @@ msgstr "пакетів"
 msgid "Please enter your username and password."
 msgstr "Введіть ім'я користувача і пароль"
 
-msgid "Please wait: Device rebooting..."
-msgstr "Зачекайте. Пристрій перезавантажується..."
-
 msgid "Policy"
 msgstr "Політика"
 
@@ -2245,9 +2360,6 @@ msgstr ""
 "Маршрути визначають через який інтерфейс і шлюз можна досягнути певного "
 "вузла або мережі."
 
-msgid "Rule #"
-msgstr "Правило #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "Виконати перевірку файлової системи перед монтуванням пристрою"
 
@@ -2265,6 +2377,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH-доступ"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-ключі"
 
@@ -2356,6 +2477,9 @@ msgstr "Сигнал:"
 msgid "Size"
 msgstr "Розмір"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "Пропустити"
 
@@ -2647,6 +2771,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "Обраний протокол потребує призначених пристроїв"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2708,6 +2835,12 @@ msgid "This IPv4 address of the relay"
 msgstr "Це IPv4-адреса ретранслятора"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2876,6 +3009,9 @@ msgstr "Невідома помилка, пароль не змінився!"
 msgid "Unmanaged"
 msgstr "Некерований"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Незбережені зміни"
 
@@ -3042,11 +3178,14 @@ msgstr "Очікуємо, доки зміни наберуть чинності.
 msgid "Waiting for command to complete..."
 msgstr "Очікуємо завершення виконання команди..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "Застереження"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Увага: Є незбережені зміни, які будуть втрачені при перезавантаженні!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3280,6 +3419,26 @@ msgstr "так"
 msgid "« Back"
 msgstr "« Назад"
 
+#~ msgid "Delete this interface"
+#~ msgstr "Видалити цей інтерфейс"
+
+#~ msgid "Flags"
+#~ msgstr "Позначки"
+
+#~ msgid "Rule #"
+#~ msgstr "Правило #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ігнорувати файли hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Зачекайте. Пристрій перезавантажується..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Увага: Є незбережені зміни, які будуть втрачені при перезавантаженні!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index d81be16..56abb3c 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "15 Minute Load:"
 msgstr ""
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr ""
 
@@ -197,6 +200,9 @@ msgstr ""
 msgid "Additional Hosts files"
 msgstr ""
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr ""
 
@@ -257,6 +263,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr ""
 
@@ -313,6 +325,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "Sẵn có"
 
@@ -322,6 +349,9 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr ""
 
@@ -394,6 +424,11 @@ msgstr ""
 msgid "Buffered"
 msgstr ""
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr ""
 
@@ -430,6 +465,9 @@ msgstr "Kênh"
 msgid "Check"
 msgstr ""
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "Checksum"
 
@@ -541,6 +579,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -616,9 +662,6 @@ msgstr ""
 msgid "Delete"
 msgstr "Xóa"
 
-msgid "Delete this interface"
-msgstr ""
-
 msgid "Delete this network"
 msgstr ""
 
@@ -637,6 +680,12 @@ msgstr "Công cụ"
 msgid "Device Configuration"
 msgstr ""
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -675,6 +724,9 @@ msgstr "Khoảng cách tối ưu"
 msgid "Distance to farthest network member in meters."
 msgstr "Khoảng cách tới thành viên xa nhất trong mạng lưới tính bằng mét"
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "Tính đa dạng"
 
@@ -745,6 +797,9 @@ msgid ""
 "having static leases will be served."
 msgstr ""
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Method"
 
@@ -853,6 +908,9 @@ msgstr ""
 msgid "External system log server port"
 msgstr ""
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "Khung nhanh"
 
@@ -874,6 +932,11 @@ msgstr "Filter private"
 msgid "Filter useless"
 msgstr "Lọc không hữu dụng"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr ""
 
@@ -898,9 +961,6 @@ msgstr ""
 msgid "Fixed source port for outbound DNS queries"
 msgstr ""
 
-msgid "Flags"
-msgstr "Cờ"
-
 msgid "Flash Firmware"
 msgstr "Phần cứng flash"
 
@@ -931,6 +991,9 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr ""
 
@@ -970,6 +1033,12 @@ msgstr ""
 msgid "General Setup"
 msgstr ""
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr ""
 
@@ -979,6 +1048,9 @@ msgstr ""
 msgid "Given password confirmation did not match, password not changed!"
 msgstr ""
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1078,6 +1150,9 @@ msgstr ""
 msgid "IPv4 only"
 msgstr ""
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr ""
 
@@ -1172,8 +1247,8 @@ msgstr ""
 "một quá trình rất chậm vì một thiết bị swap không thể được truy cập với  "
 "datarates cao hơn của <abbr title=\"Random Access Memory\">RAM</abbr>."
 
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Lờ đi <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Lờ đi giao diện"
@@ -1187,6 +1262,11 @@ msgstr ""
 msgid "In"
 msgstr "Trong"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr ""
 
@@ -1368,6 +1448,9 @@ msgid ""
 "requests to"
 msgstr ""
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr ""
 
@@ -1389,6 +1472,9 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr ""
 
@@ -1456,6 +1542,9 @@ msgstr "Lọc MAC"
 msgid "MAC-List"
 msgstr "Danh sách MAC"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr ""
 
@@ -1470,6 +1559,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "Mức cao nhất"
 
@@ -1488,6 +1580,11 @@ msgstr ""
 msgid "Maximum hold time"
 msgstr "Mức cao nhất"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr ""
 
@@ -1555,12 +1652,18 @@ msgstr ""
 "Số điểm lắp xác định tại một điểm mà ở đó bộ nhớ sẽ được gắn vào hệ thống "
 "tập tin"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr ""
 
 msgid "Mount point"
 msgstr ""
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "Lắp tập tin hệ thống"
 
@@ -1579,6 +1682,9 @@ msgstr ""
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1678,6 +1784,9 @@ msgstr ""
 msgid "Note: Configuration files will be erased."
 msgstr ""
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr ""
 
@@ -1806,9 +1915,18 @@ msgstr ""
 msgid "PPPoE"
 msgstr ""
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr ""
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr ""
 
@@ -1836,9 +1954,6 @@ msgstr "Mật mã của private key"
 msgid "Password successfully changed!"
 msgstr ""
 
-msgid "Path"
-msgstr "Đường dẫn"
-
 msgid "Path to CA-Certificate"
 msgstr "Đường dẫn tới CA-Certificate"
 
@@ -1854,6 +1969,9 @@ msgstr ""
 msgid "Peak:"
 msgstr ""
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "Tiến hành reboot"
 
@@ -1875,9 +1993,6 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "Nhập tên và mật mã"
 
-msgid "Please wait: Device rebooting..."
-msgstr "Xin chờ: Công cụ đang reboot"
-
 msgid "Policy"
 msgstr "Chính sách"
 
@@ -2145,9 +2260,6 @@ msgstr ""
 "Routes chỉ định trên giao diện và cổng một host nhất định hay network được "
 "tiếp cận."
 
-msgid "Rule #"
-msgstr ""
-
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2165,6 +2277,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr ""
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr ""
 
@@ -2253,6 +2374,9 @@ msgstr ""
 msgid "Size"
 msgstr "Dung lượng "
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -2507,6 +2631,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr ""
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2561,6 +2688,12 @@ msgid "This IPv4 address of the relay"
 msgstr ""
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2717,6 +2850,9 @@ msgstr ""
 msgid "Unmanaged"
 msgstr ""
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "Thay đổi không lưu"
 
@@ -2874,11 +3010,14 @@ msgstr ""
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr ""
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Cảnh báo: Các thay đổi chưa lưu sẽ bị mất trong khi khởi động lại!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3109,6 +3248,19 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "Flags"
+#~ msgstr "Cờ"
+
+#~ msgid "Path"
+#~ msgstr "Đường dẫn"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Xin chờ: Công cụ đang reboot"
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Cảnh báo: Các thay đổi chưa lưu sẽ bị mất trong khi khởi động lại!"
+
 #~ msgid "Frequency Hopping"
 #~ msgstr "Tần số Hopping"
 
@@ -3685,9 +3837,6 @@ msgstr ""
 #~ msgid "Here you can configure installed wifi devices."
 #~ msgstr "Ở đây bạn có thể định cấu hình của công cụ wifi được cài đặt."
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Lờ đi <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "Độc lập (Ad-Hoc)"
 
index 72bf937..d3b4034 100644 (file)
@@ -45,6 +45,9 @@ msgstr "1分钟负载:"
 msgid "15 Minute Load:"
 msgstr "15分钟负载:"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "5分钟负载:"
 
@@ -200,6 +203,9 @@ msgstr "添加新接口..."
 msgid "Additional Hosts files"
 msgstr "额外的HOSTS文件"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "地址"
 
@@ -262,6 +268,12 @@ msgstr "广播的DNS域名"
 msgid "Announced DNS servers"
 msgstr "广播的DNS服务器"
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "天线 1"
 
@@ -318,6 +330,21 @@ msgstr "自动"
 msgid "Automatic Homenet (HNCP)"
 msgstr "自动家庭网络(HNCP)"
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "可用"
 
@@ -327,6 +354,9 @@ msgstr "可用软件包"
 msgid "Average:"
 msgstr "平均:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -401,6 +431,11 @@ msgstr "Broadcom BCM%04x 802.11 无线网卡"
 msgid "Buffered"
 msgstr "已缓冲"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "按键"
 
@@ -437,6 +472,9 @@ msgstr "信道"
 msgid "Check"
 msgstr "检查"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "校验值"
 
@@ -548,6 +586,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr "自定义分配的IPv6前缀"
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr "自定义<abbr title=\"Light Emitting Diode\">LED</abbr>的活动状态。"
@@ -623,9 +669,6 @@ msgstr ""
 msgid "Delete"
 msgstr "删除"
 
-msgid "Delete this interface"
-msgstr "删除此接口"
-
 msgid "Delete this network"
 msgstr "删除此网络"
 
@@ -644,6 +687,12 @@ msgstr "设备"
 msgid "Device Configuration"
 msgstr "设备配置"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "网络诊断"
 
@@ -683,6 +732,9 @@ msgstr "距离优化"
 msgid "Distance to farthest network member in meters."
 msgstr "最远客户端的距离(米)。"
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "分集"
 
@@ -746,6 +798,9 @@ msgid ""
 "having static leases will be served."
 msgstr "动态分配DHCP地址。如果禁用,则只能为静态租用表中的客户端提供网络服务。"
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP-Method"
 
@@ -855,6 +910,9 @@ msgstr "远程log服务器"
 msgid "External system log server port"
 msgstr "远程log服务器端口"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "快速帧"
 
@@ -876,6 +934,11 @@ msgstr "过滤本地包"
 msgid "Filter useless"
 msgstr "过滤无用包"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "搜索并加入网络"
 
@@ -900,9 +963,6 @@ msgstr "固件版本"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "指定的DNS查询源端口"
 
-msgid "Flags"
-msgstr "标识"
-
 msgid "Flash Firmware"
 msgstr "刷新固件"
 
@@ -933,6 +993,9 @@ msgstr "强制使用TKIP加密"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "TKIP和CCMP(AES)混合加密"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "转发DHCP数据包"
 
@@ -972,6 +1035,12 @@ msgstr "基本设置"
 msgid "General Setup"
 msgstr "基本设置"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "生成备份"
 
@@ -981,6 +1050,9 @@ msgstr "Generic 802.11%s 无线网卡"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "由于密码验证不匹配,密码没有更改!"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr "全局网络选项"
 
@@ -1078,6 +1150,9 @@ msgstr "IPv4子网掩码"
 msgid "IPv4 only"
 msgstr "仅IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "IPv4地址前缀长度"
 
@@ -1167,8 +1242,8 @@ msgid ""
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr "如果物理内存不足,闲置数据可自动移到交换区暂存,以提高可用内存。"
 
-msgid "Ignore Hosts files"
-msgstr "忽略HOSTS文件"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "忽略 <code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "关闭DHCP"
@@ -1182,6 +1257,11 @@ msgstr "固件文件"
 msgid "In"
 msgstr "入口"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "活动超时"
 
@@ -1361,6 +1441,9 @@ msgid ""
 "requests to"
 msgstr "将指定的域名DNS解析转发到指定的DNS服务器(按照示例填写)"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "允许RFC1918响应的域名列表"
 
@@ -1382,6 +1465,9 @@ msgstr "平均负载"
 msgid "Loading"
 msgstr "加载中"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "本地IPv4地址"
 
@@ -1450,6 +1536,9 @@ msgstr "MAC-过滤"
 msgid "MAC-List"
 msgstr "MAC-列表"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1464,6 +1553,9 @@ msgid ""
 "below:"
 msgstr "请确认你已经复制过整个根文件系统,例如使用以下命令:"
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "最高速率"
 
@@ -1482,6 +1574,11 @@ msgstr "调制解调器就绪的最大等待时间(秒)"
 msgid "Maximum hold time"
 msgstr "最大持续时间"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "最大地址分配数量。"
 
@@ -1547,12 +1644,18 @@ msgid ""
 "filesystem"
 msgstr "配置存储设备挂载到文件系统中的位置和参数。"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "挂载选项"
 
 msgid "Mount point"
 msgstr "挂载点"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "已挂载的文件系统"
 
@@ -1571,6 +1674,9 @@ msgstr "多播地址"
 msgid "NAS ID"
 msgstr "NAS ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr "NDP-代理"
 
@@ -1670,6 +1776,9 @@ msgstr "未连接"
 msgid "Note: Configuration files will be erased."
 msgstr "注意:配置文件将被删除。"
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "注意"
 
@@ -1792,9 +1901,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "需要libiwinfo软件包!"
 
@@ -1822,9 +1940,6 @@ msgstr "私有密钥"
 msgid "Password successfully changed!"
 msgstr "密码修改成功!"
 
-msgid "Path"
-msgstr "路径"
-
 msgid "Path to CA-Certificate"
 msgstr "CA证书路径"
 
@@ -1840,6 +1955,9 @@ msgstr "处理按键动作的可执行文件路径"
 msgid "Peak:"
 msgstr "峰值:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "执行重启"
 
@@ -1861,9 +1979,6 @@ msgstr "数据包"
 msgid "Please enter your username and password."
 msgstr "请输入用户名和密码。"
 
-msgid "Please wait: Device rebooting..."
-msgstr "请稍等:设备重启中..."
-
 msgid "Policy"
 msgstr "策略"
 
@@ -2138,9 +2253,6 @@ msgid ""
 "can be reached."
 msgstr "路由表描述了数据包的可达路径。"
 
-msgid "Rule #"
-msgstr "规则 #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "挂载设备前运行文件系统检查"
 
@@ -2158,6 +2270,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH访问"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-密钥"
 
@@ -2247,6 +2368,9 @@ msgstr "信号:"
 msgid "Size"
 msgstr "大小"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "跳过"
 
@@ -2518,6 +2642,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "所选的协议需要分配设备"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2569,6 +2696,12 @@ msgid "This IPv4 address of the relay"
 msgstr "中继的IPv4地址"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2724,6 +2857,9 @@ msgstr "未知错误,密码未更改!"
 msgid "Unmanaged"
 msgstr "不配置协议"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "未保存的配置"
 
@@ -2885,11 +3021,14 @@ msgstr "正在应用更改..."
 msgid "Waiting for command to complete..."
 msgstr "正在执行命令..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "警告"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告: 有尚未保存的更改,重启将丢失!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3118,6 +3257,28 @@ msgstr "是"
 msgid "« Back"
 msgstr "« 后退"
 
+#~ msgid "Delete this interface"
+#~ msgstr "删除此接口"
+
+#~ msgid "Flags"
+#~ msgstr "标识"
+
+#~ msgid "Rule #"
+#~ msgstr "规则 #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "忽略HOSTS文件"
+
+#~ msgid "Path"
+#~ msgstr "路径"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "请稍等:设备重启中..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告: 有尚未保存的更改,重启将丢失!"
+
 #~ msgid "CPU frequency"
 #~ msgstr "CPU 频率"
 
@@ -3906,9 +4067,6 @@ msgstr "« 后退"
 #~ "如果连接在已有网络,那么它会被<em>桥接</em>到现有接口,并且被所选的防火墙"
 #~ "区域覆盖。取消附加选项可以重定义此接口为新的独立网络。"
 
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "忽略 <code>/etc/hosts</code>"
-
 #~ msgid "Independent (Ad-Hoc)"
 #~ msgstr "独立(点对点Ad-Hoc)"
 
index ec901b8..330ec7b 100644 (file)
@@ -44,6 +44,9 @@ msgstr "1分鐘負載"
 msgid "15 Minute Load:"
 msgstr "15分鐘負載"
 
+msgid "464XLAT (CLAT)"
+msgstr ""
+
 msgid "5 Minute Load:"
 msgstr "5分鐘負載"
 
@@ -200,6 +203,9 @@ msgstr "增加新界面"
 msgid "Additional Hosts files"
 msgstr "額外的HOST檔案"
 
+msgid "Additional servers file"
+msgstr ""
+
 msgid "Address"
 msgstr "位置"
 
@@ -260,6 +266,12 @@ msgstr ""
 msgid "Announced DNS servers"
 msgstr ""
 
+msgid "Anonymous Mount"
+msgstr ""
+
+msgid "Anonymous Swap"
+msgstr ""
+
 msgid "Antenna 1"
 msgstr "天線 1"
 
@@ -316,6 +328,21 @@ msgstr ""
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
 
+msgid "Automatically check filesystem for errors before mounting"
+msgstr ""
+
+msgid "Automatically mount filesystems on hotplug"
+msgstr ""
+
+msgid "Automatically mount swap on hotplug"
+msgstr ""
+
+msgid "Automount Filesystem"
+msgstr ""
+
+msgid "Automount Swap"
+msgstr ""
+
 msgid "Available"
 msgstr "可用"
 
@@ -325,6 +352,9 @@ msgstr "可用軟體包"
 msgid "Average:"
 msgstr "平均:"
 
+msgid "BR / DMR / AFTR"
+msgstr ""
+
 msgid "BSSID"
 msgstr "BSSID"
 
@@ -399,6 +429,11 @@ msgstr "Broadcom BCM%04x 802.11 無線控制器"
 msgid "Buffered"
 msgstr "已緩衝"
 
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
 msgid "Buttons"
 msgstr "按鈕"
 
@@ -435,6 +470,9 @@ msgstr "頻道"
 msgid "Check"
 msgstr "檢查"
 
+msgid "Check fileystems before mount"
+msgstr ""
+
 msgid "Checksum"
 msgstr "效驗碼"
 
@@ -552,6 +590,14 @@ msgid "Custom delegated IPv6-prefix"
 msgstr ""
 
 msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
@@ -629,9 +675,6 @@ msgstr ""
 msgid "Delete"
 msgstr "刪除"
 
-msgid "Delete this interface"
-msgstr "刪除這個介面"
-
 msgid "Delete this network"
 msgstr "刪除這個網路"
 
@@ -650,6 +693,12 @@ msgstr "設備"
 msgid "Device Configuration"
 msgstr "設定設備"
 
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "診斷"
 
@@ -689,6 +738,9 @@ msgstr "最佳化距離"
 msgid "Distance to farthest network member in meters."
 msgstr "到最遠的網路距離以米表示."
 
+msgid "Distribution feeds"
+msgstr ""
+
 msgid "Diversity"
 msgstr "差異"
 
@@ -757,6 +809,9 @@ msgid ""
 "having static leases will be served."
 msgstr "幫用戶端動態發配DHCP位址. 假如關閉的話,僅有有靜態位址的用戶端能被服務"
 
+msgid "EA-bits length"
+msgstr ""
+
 msgid "EAP-Method"
 msgstr "EAP協定驗證方式"
 
@@ -866,6 +921,9 @@ msgstr "外部系統日誌伺服器"
 msgid "External system log server port"
 msgstr "外部系統日誌伺服器埠號"
 
+msgid "Extra SSH command options"
+msgstr ""
+
 msgid "Fast Frames"
 msgstr "快速迅框群"
 
@@ -887,6 +945,11 @@ msgstr "私人過濾器"
 msgid "Filter useless"
 msgstr "無用過濾器"
 
+msgid ""
+"Find all currently attached filesystems and swap and replace configuration "
+"with defaults based on what was detected"
+msgstr ""
+
 msgid "Find and join network"
 msgstr "搜尋並加入網路"
 
@@ -911,9 +974,6 @@ msgstr "防火牆版本"
 msgid "Fixed source port for outbound DNS queries"
 msgstr "外發DNS請求的固定埠號"
 
-msgid "Flags"
-msgstr "旗標"
-
 msgid "Flash Firmware"
 msgstr "韌體更新"
 
@@ -944,6 +1004,9 @@ msgstr "強制TKIP加密"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "強制TKIP+CCMP (AES)加密"
 
+msgid "Form token mismatch"
+msgstr ""
+
 msgid "Forward DHCP traffic"
 msgstr "轉發DHCP流量"
 
@@ -983,6 +1046,12 @@ msgstr "一般設定"
 msgid "General Setup"
 msgstr "一般設置"
 
+msgid "General options for opkg"
+msgstr ""
+
+msgid "Generate Config"
+msgstr ""
+
 msgid "Generate archive"
 msgstr "製作壓縮檔"
 
@@ -992,6 +1061,9 @@ msgstr "通用 802.11%s 無線控制器"
 msgid "Given password confirmation did not match, password not changed!"
 msgstr "鍵入的密碼不吻合,密碼將不變更"
 
+msgid "Global Settings"
+msgstr ""
+
 msgid "Global network options"
 msgstr ""
 
@@ -1089,6 +1161,9 @@ msgstr "IPv4網路遮罩"
 msgid "IPv4 only"
 msgstr "僅用IPv4"
 
+msgid "IPv4 prefix"
+msgstr ""
+
 msgid "IPv4 prefix length"
 msgstr "IPv4前綴長度"
 
@@ -1182,8 +1257,8 @@ msgstr ""
 "緩慢的過程,作為交換裝置不能用高數據速率訪問該<abbr title=\"Random Access "
 "Memory\">RAM</縮寫>"
 
-msgid "Ignore Hosts files"
-msgstr "被忽視的主機檔案"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
 
 msgid "Ignore interface"
 msgstr "被忽視的介面"
@@ -1197,6 +1272,11 @@ msgstr "映像檔"
 msgid "In"
 msgstr "輸入"
 
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
 msgid "Inactivity timeout"
 msgstr "閒置過期"
 
@@ -1376,6 +1456,9 @@ msgid ""
 "requests to"
 msgstr "列出 <abbr title=\"Domain Name System\">DNS</abbr> 伺服器以便轉發請求"
 
+msgid "List of SSH key files for auth"
+msgstr ""
+
 msgid "List of domains to allow RFC1918 responses for"
 msgstr "列出允許RFC1918文件虛擬IP回應的網域"
 
@@ -1397,6 +1480,9 @@ msgstr "平均掛載"
 msgid "Loading"
 msgstr "掛載中"
 
+msgid "Local IP address to assign"
+msgstr ""
+
 msgid "Local IPv4 address"
 msgstr "本地IPv4位址"
 
@@ -1465,6 +1551,9 @@ msgstr "MAC-過濾"
 msgid "MAC-List"
 msgstr "MAC-清單"
 
+msgid "MAP / LW4over6"
+msgstr ""
+
 msgid "MB/s"
 msgstr "MB/s"
 
@@ -1479,6 +1568,9 @@ msgid ""
 "below:"
 msgstr ""
 
+msgid "Manual"
+msgstr ""
+
 msgid "Maximum Rate"
 msgstr "最快速度"
 
@@ -1497,6 +1589,11 @@ msgstr "等待數據機待命的最大秒數"
 msgid "Maximum hold time"
 msgstr "可持有最長時間"
 
+msgid ""
+"Maximum length of the name is 15 characters including the automatic protocol/"
+"bridge prefix (br-, 6in4-, pppoe- etc.)"
+msgstr ""
+
 msgid "Maximum number of leased addresses."
 msgstr "釋放出的位址群最大數量"
 
@@ -1562,12 +1659,18 @@ msgid ""
 "filesystem"
 msgstr "掛載各點定義所指定到記憶體設備將會被附載到檔案系統上"
 
+msgid "Mount filesystems not specifically configured"
+msgstr ""
+
 msgid "Mount options"
 msgstr "掛載選項"
 
 msgid "Mount point"
 msgstr "掛載點"
 
+msgid "Mount swap not specifically configured"
+msgstr ""
+
 msgid "Mounted file systems"
 msgstr "已掛載檔案系統"
 
@@ -1586,6 +1689,9 @@ msgstr "多點群播位址"
 msgid "NAS ID"
 msgstr " 網路附存伺服器ID"
 
+msgid "NAT64 Prefix"
+msgstr ""
+
 msgid "NDP-Proxy"
 msgstr ""
 
@@ -1685,6 +1791,9 @@ msgstr "尚未連線"
 msgid "Note: Configuration files will be erased."
 msgstr "注意:設定檔將被刪除."
 
+msgid "Note: interface name length"
+msgstr ""
+
 msgid "Notice"
 msgstr "通知"
 
@@ -1811,9 +1920,18 @@ msgstr "PPPoATM"
 msgid "PPPoE"
 msgstr "PPPoE"
 
+msgid "PPPoSSH"
+msgstr ""
+
 msgid "PPtP"
 msgstr "PPtP點對點VPN虛擬私人隧道協定"
 
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
 msgid "Package libiwinfo required!"
 msgstr "軟體包必需有libiwinfo!"
 
@@ -1841,9 +1959,6 @@ msgstr "私人金鑰密碼"
 msgid "Password successfully changed!"
 msgstr "密碼已變更成功!"
 
-msgid "Path"
-msgstr ""
-
 msgid "Path to CA-Certificate"
 msgstr "CA-證書的路徑"
 
@@ -1859,6 +1974,9 @@ msgstr "處理按鍵效果可執行檔路徑"
 msgid "Peak:"
 msgstr "峰值:"
 
+msgid "Peer IP address to assign"
+msgstr ""
+
 msgid "Perform reboot"
 msgstr "執行重開"
 
@@ -1880,9 +1998,6 @@ msgstr "封包數."
 msgid "Please enter your username and password."
 msgstr "請輸入你的用戶名稱和密碼"
 
-msgid "Please wait: Device rebooting..."
-msgstr "請稍等:設備正重開中..."
-
 msgid "Policy"
 msgstr "策略"
 
@@ -2157,9 +2272,6 @@ msgid ""
 "can be reached."
 msgstr "路由器指定介面導出到特定主機或者能夠到達的網路."
 
-msgid "Rule #"
-msgstr "規則 #"
-
 msgid "Run a filesystem check before mounting the device"
 msgstr "掛載這個設備前先跑系統檢查"
 
@@ -2177,6 +2289,15 @@ msgstr ""
 msgid "SSH Access"
 msgstr "SSH存取"
 
+msgid "SSH server address"
+msgstr ""
+
+msgid "SSH server port"
+msgstr ""
+
+msgid "SSH username"
+msgstr ""
+
 msgid "SSH-Keys"
 msgstr "SSH-金鑰"
 
@@ -2266,6 +2387,9 @@ msgstr "信號:"
 msgid "Size"
 msgstr "大小"
 
+msgid "Size (.ipk)"
+msgstr ""
+
 msgid "Skip"
 msgstr "跳過"
 
@@ -2541,6 +2665,9 @@ msgstr ""
 msgid "The selected protocol needs a device assigned"
 msgstr "選到的協定需要指定到設備上"
 
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
 msgid ""
 "The system is erasing the configuration partition now and will reboot itself "
 "when finished."
@@ -2593,6 +2720,12 @@ msgid "This IPv4 address of the relay"
 msgstr "IPv4位址的轉驛"
 
 msgid ""
+"This file may contain lines like 'server=/domain/1.2.3.4' or "
+"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
+"Name System\">DNS</abbr> servers."
+msgstr ""
+
+msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
 "include during sysupgrade. Modified files in /etc/config/ and certain other "
 "configurations are automatically preserved."
@@ -2750,6 +2883,9 @@ msgstr "未知錯誤, 密碼尚未改變!"
 msgid "Unmanaged"
 msgstr "非託管"
 
+msgid "Unmount"
+msgstr ""
+
 msgid "Unsaved Changes"
 msgstr "尚未存檔的修改"
 
@@ -2914,11 +3050,14 @@ msgstr "等待修改被啟用..."
 msgid "Waiting for command to complete..."
 msgstr "等待完整性指令..."
 
+msgid "Waiting for device..."
+msgstr ""
+
 msgid "Warning"
 msgstr "警告"
 
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告:重開機後某些未存檔的修改將會漏失!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
 
 msgid "Whether to create an IPv6 default route over the tunnel"
 msgstr ""
@@ -3146,6 +3285,25 @@ msgstr "是的"
 msgid "« Back"
 msgstr "« 倒退"
 
+#~ msgid "Delete this interface"
+#~ msgstr "刪除這個介面"
+
+#~ msgid "Flags"
+#~ msgstr "旗標"
+
+#~ msgid "Rule #"
+#~ msgstr "規則 #"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "被忽視的主機檔案"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "請稍等:設備正重開中..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告:重開機後某些未存檔的修改將會漏失!"
+
 #~ msgid ""
 #~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
 #~ "this option does not comply with IEEE 802.11n-2009!"
index c503a8f..baa3ac5 100644 (file)
@@ -1,6 +1,6 @@
 config core main
        option lang auto
-       option mediaurlbase /luci-static/openwrt.org
+       option mediaurlbase /luci-static/bootstrap
        option resourcebase /luci-static/resources
        
 config extern flash_keep
diff --git a/modules/luci-base/root/etc/luci-uploads/.placeholder b/modules/luci-base/root/etc/luci-uploads/.placeholder
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/luci-base/root/lib/uci/upload/.placeholder b/modules/luci-base/root/lib/uci/upload/.placeholder
deleted file mode 100644 (file)
index e69de29..0000000
index 0b5fa1d..59b0d84 100644 (file)
@@ -5,7 +5,7 @@
 <meta http-equiv="Cache-Control" content="no-cache" />
 <meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" />
 </head>
-<body style="background-color: black">
-<a style="color: white; text-decoration: none" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
+<body style="background-color: white">
+<a style="color: black; font-family: arial, helvetica, sans-serif;" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
 </body>
 </html>
index 66c78e2..5fed279 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Administration - full-featured for full control
-LUCI_DEPENDS:=+luci-base +libubus-lua
+LUCI_DEPENDS:=+luci-base
 
 PKG_BUILD_DEPENDS:=iwinfo
 
index d00d546..cc8c2e3 100644 (file)
@@ -33,12 +33,10 @@ function action_logout()
        if sid then
                utl.ubus("session", "destroy", { ubus_rpc_session = sid })
 
-               dsp.context.urltoken.stok = nil
-
                luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
                        sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
                })
        end
 
-       luci.http.redirect(luci.dispatcher.build_url())
+       luci.http.redirect(dsp.build_url())
 end
index 6e578e0..aa533cb 100644 (file)
@@ -1,5 +1,5 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
+-- Copyright 2011-2015 Jo-Philipp Wich <jow@openwrt.org>
 -- Licensed to the public under the Apache License 2.0.
 
 module("luci.controller.admin.network", package.seeall)
@@ -43,22 +43,22 @@ function index()
                        end)
 
                if has_wifi then
-                       page = entry({"admin", "network", "wireless_join"}, call("wifi_join"), nil)
+                       page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil)
                        page.leaf = true
 
-                       page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil)
+                       page = entry({"admin", "network", "wireless_add"}, post("wifi_add"), nil)
                        page.leaf = true
 
-                       page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil)
+                       page = entry({"admin", "network", "wireless_delete"}, post("wifi_delete"), nil)
                        page.leaf = true
 
                        page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil)
                        page.leaf = true
 
-                       page = entry({"admin", "network", "wireless_reconnect"}, call("wifi_reconnect"), nil)
+                       page = entry({"admin", "network", "wireless_reconnect"}, post("wifi_reconnect"), nil)
                        page.leaf = true
 
-                       page = entry({"admin", "network", "wireless_shutdown"}, call("wifi_shutdown"), nil)
+                       page = entry({"admin", "network", "wireless_shutdown"}, post("wifi_shutdown"), nil)
                        page.leaf = true
 
                        page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15)
@@ -85,16 +85,16 @@ function index()
                page = entry({"admin", "network", "iface_add"}, cbi("admin_network/iface_add"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "iface_delete"}, call("iface_delete"), nil)
+               page = entry({"admin", "network", "iface_delete"}, post("iface_delete"), nil)
                page.leaf = true
 
                page = entry({"admin", "network", "iface_status"}, call("iface_status"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "iface_reconnect"}, call("iface_reconnect"), nil)
+               page = entry({"admin", "network", "iface_reconnect"}, post("iface_reconnect"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "iface_shutdown"}, call("iface_shutdown"), nil)
+               page = entry({"admin", "network", "iface_shutdown"}, post("iface_shutdown"), nil)
                page.leaf = true
 
                page = entry({"admin", "network", "network"}, arcombine(cbi("admin_network/network"), cbi("admin_network/ifaces")), _("Interfaces"), 10)
@@ -138,44 +138,33 @@ function index()
                page.title  = _("Diagnostics")
                page.order  = 60
 
-               page = entry({"admin", "network", "diag_ping"}, call("diag_ping"), nil)
+               page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "diag_nslookup"}, call("diag_nslookup"), nil)
+               page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "diag_traceroute"}, call("diag_traceroute"), nil)
+               page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "diag_ping6"}, call("diag_ping6"), nil)
+               page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil)
                page.leaf = true
 
-               page = entry({"admin", "network", "diag_traceroute6"}, call("diag_traceroute6"), nil)
+               page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil)
                page.leaf = true
 --     end
 end
 
 function wifi_join()
-       local function param(x)
-               return luci.http.formvalue(x)
-       end
-
-       local function ptable(x)
-               x = param(x)
-               return x and (type(x) ~= "table" and { x } or x) or {}
-       end
-
-       local dev  = param("device")
-       local ssid = param("join")
+       local tpl  = require "luci.template"
+       local http = require "luci.http"
+       local dev  = http.formvalue("device")
+       local ssid = http.formvalue("join")
 
        if dev and ssid then
-               local cancel  = (param("cancel") or param("cbi.cancel")) and true or false
-
-               if cancel then
-                       luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless_join?device=" .. dev))
-               else
+               local cancel = (http.formvalue("cancel") or http.formvalue("cbi.cancel"))
+               if not cancel then
                        local cbi = require "luci.cbi"
-                       local tpl = require "luci.template"
                        local map = luci.cbi.load("admin_network/wifi_add")[1]
 
                        if map:parse() ~= cbi.FORM_DONE then
@@ -183,10 +172,12 @@ function wifi_join()
                                map:render()
                                tpl.render("footer")
                        end
+
+                       return
                end
-       else
-               luci.template.render("admin_network/wifi_join")
        end
+
+       tpl.render("admin_network/wifi_join")
 end
 
 function wifi_add()
@@ -244,6 +235,8 @@ function iface_status(ifaces)
                                proto      = net:proto(),
                                uptime     = net:uptime(),
                                gwaddr     = net:gwaddr(),
+                               ipaddrs    = net:ipaddrs(),
+                               ip6addrs   = net:ip6addrs(),
                                dnsaddrs   = net:dnsaddrs(),
                                name       = device:shortname(),
                                type       = device:type(),
@@ -255,29 +248,9 @@ function iface_status(ifaces)
                                rx_packets = device:rx_packets(),
                                tx_packets = device:tx_packets(),
 
-                               ipaddrs    = { },
-                               ip6addrs   = { },
                                subdevices = { }
                        }
 
-                       local _, a
-                       for _, a in ipairs(device:ipaddrs()) do
-                               data.ipaddrs[#data.ipaddrs+1] = {
-                                       addr      = a:host():string(),
-                                       netmask   = a:mask():string(),
-                                       prefix    = a:prefix()
-                               }
-                       end
-                       for _, a in ipairs(device:ip6addrs()) do
-                               if not a:is6linklocal() then
-                                       data.ip6addrs[#data.ip6addrs+1] = {
-                                               addr      = a:host():string(),
-                                               netmask   = a:mask():string(),
-                                               prefix    = a:prefix()
-                                       }
-                               end
-                       end
-
                        for _, device in ipairs(net:get_interfaces() or {}) do
                                data.subdevices[#data.subdevices+1] = {
                                        name       = device:shortname(),
index 1ceb24d..24db1e4 100644 (file)
@@ -7,7 +7,10 @@ module("luci.controller.admin.status", package.seeall)
 function index()
        entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true
        entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
-       entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2).leaf = true
+
+       entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true
+       entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true
+
        entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3)
        entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4)
        entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5)
@@ -42,22 +45,16 @@ end
 
 function action_iptables()
        if luci.http.formvalue("zero") then
-               if luci.http.formvalue("zero") == "6" then
-                       luci.util.exec("ip6tables -Z")
+               if luci.http.formvalue("family") == "6" then
+                       luci.util.exec("/usr/sbin/ip6tables -Z")
                else
-                       luci.util.exec("iptables -Z")
+                       luci.util.exec("/usr/sbin/iptables -Z")
                end
-               luci.http.redirect(
-                       luci.dispatcher.build_url("admin", "status", "iptables")
-               )
-       elseif luci.http.formvalue("restart") == "1" then
+       elseif luci.http.formvalue("restart") then
                luci.util.exec("/etc/init.d/firewall restart")
-               luci.http.redirect(
-                       luci.dispatcher.build_url("admin", "status", "iptables")
-               )
-       else
-               luci.template.render("admin_status/iptables")
        end
+
+       luci.http.redirect(luci.dispatcher.build_url("admin/status/iptables"))
 end
 
 function action_bandwidth(iface)
index 1b38c67..cbba48c 100644 (file)
@@ -9,12 +9,12 @@ function index()
 
        entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
        entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
-       entry({"admin", "system", "clock_status"}, call("action_clock_status"))
+       entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status"))
 
        entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
 
        if fs.access("/bin/opkg") then
-               entry({"admin", "system", "packages"}, call("action_packages"), _("Software"), 10)
+               entry({"admin", "system", "packages"}, post_on({ exec = "1" }, "action_packages"), _("Software"), 10)
                entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"))
        end
 
@@ -32,9 +32,16 @@ function index()
        end
 
        entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
+       entry({"admin", "system", "flashops", "reset"}, post("action_reset"))
+       entry({"admin", "system", "flashops", "backup"}, post("action_backup"))
        entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles"))
 
-       entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
+       -- call() instead of post() due to upload handling!
+       entry({"admin", "system", "flashops", "restore"}, call("action_restore"))
+       entry({"admin", "system", "flashops", "sysupgrade"}, call("action_sysupgrade"))
+
+       entry({"admin", "system", "reboot"}, template("admin_system/reboot"), _("Reboot"), 90)
+       entry({"admin", "system", "reboot", "call"}, post("action_reboot"))
 end
 
 function action_clock_status()
@@ -55,7 +62,8 @@ end
 function action_packages()
        local fs = require "nixio.fs"
        local ipkg = require "luci.model.ipkg"
-       local submit = luci.http.formvalue("submit")
+       local submit = (luci.http.formvalue("exec") == "1")
+       local update, upgrade
        local changes = false
        local install = { }
        local remove  = { }
@@ -75,59 +83,62 @@ function action_packages()
        query = (query ~= '') and query or nil
 
 
-       -- Packets to be installed
-       local ninst = submit and luci.http.formvalue("install")
-       local uinst = nil
-
-       -- Install from URL
-       local url = luci.http.formvalue("url")
-       if url and url ~= '' and submit then
-               uinst = url
-       end
+       -- Modifying actions
+       if submit then
+               -- Packets to be installed
+               local ninst = luci.http.formvalue("install")
+               local uinst = nil
 
-       -- Do install
-       if ninst then
-               install[ninst], out, err = ipkg.install(ninst)
-               stdout[#stdout+1] = out
-               stderr[#stderr+1] = err
-               changes = true
-       end
+               -- Install from URL
+               local url = luci.http.formvalue("url")
+               if url and url ~= '' then
+                       uinst = url
+               end
 
-       if uinst then
-               local pkg
-               for pkg in luci.util.imatch(uinst) do
-                       install[uinst], out, err = ipkg.install(pkg)
+               -- Do install
+               if ninst then
+                       install[ninst], out, err = ipkg.install(ninst)
                        stdout[#stdout+1] = out
                        stderr[#stderr+1] = err
                        changes = true
                end
-       end
 
-       -- Remove packets
-       local rem = submit and luci.http.formvalue("remove")
-       if rem then
-               remove[rem], out, err = ipkg.remove(rem)
-               stdout[#stdout+1] = out
-               stderr[#stderr+1] = err
-               changes = true
-       end
+               if uinst then
+                       local pkg
+                       for pkg in luci.util.imatch(uinst) do
+                               install[uinst], out, err = ipkg.install(pkg)
+                               stdout[#stdout+1] = out
+                               stderr[#stderr+1] = err
+                               changes = true
+                       end
+               end
 
+               -- Remove packets
+               local rem = luci.http.formvalue("remove")
+               if rem then
+                       remove[rem], out, err = ipkg.remove(rem)
+                       stdout[#stdout+1] = out
+                       stderr[#stderr+1] = err
+                       changes = true
+               end
 
-       -- Update all packets
-       local update = luci.http.formvalue("update")
-       if update then
-               update, out, err = ipkg.update()
-               stdout[#stdout+1] = out
-               stderr[#stderr+1] = err
-       end
+
+               -- Update all packets
+               update = luci.http.formvalue("update")
+               if update then
+                       update, out, err = ipkg.update()
+                       stdout[#stdout+1] = out
+                       stderr[#stderr+1] = err
+               end
 
 
-       -- Upgrade all packets
-       local upgrade = luci.http.formvalue("upgrade")
-       if upgrade then
-               upgrade, out, err = ipkg.upgrade()
-               stdout[#stdout+1] = out
-               stderr[#stderr+1] = err
+               -- Upgrade all packets
+               upgrade = luci.http.formvalue("upgrade")
+               if upgrade then
+                       upgrade, out, err = ipkg.upgrade()
+                       stdout[#stdout+1] = out
+                       stderr[#stderr+1] = err
+               end
        end
 
 
@@ -166,137 +177,185 @@ function action_packages()
        end
 end
 
-function action_flashops()
-       local sys = require "luci.sys"
-       local fs  = require "nixio.fs"
-
-       local upgrade_avail = fs.access("/lib/upgrade/platform.sh")
-       local reset_avail   = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+local function image_supported(image)
+       return (os.execute("sysupgrade -T %q >/dev/null" % image) == 0)
+end
 
-       local restore_cmd = "tar -xzC/ >/dev/null 2>&1"
-       local backup_cmd  = "sysupgrade --create-backup - 2>/dev/null"
-       local image_tmp   = "/tmp/firmware.img"
+local function image_checksum(image)
+       return (luci.sys.exec("md5sum %q" % image):match("^([^%s]+)"))
+end
 
-       local function image_supported()
-               return (os.execute("sysupgrade -T %q >/dev/null" % image_tmp) == 0)
-       end
+local function supports_sysupgrade()
+       return nixio.fs.access("/lib/upgrade/platform.sh")
+end
 
-       local function image_checksum()
-               return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)"))
-       end
+local function supports_reset()
+       return (os.execute([[grep -sq '"rootfs_data"' /proc/mtd]]) == 0)
+end
 
-       local function storage_size()
-               local size = 0
-               if fs.access("/proc/mtd") then
-                       for l in io.lines("/proc/mtd") do
-                               local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
-                               if n == "linux" or n == "firmware" then
-                                       size = tonumber(s, 16)
-                                       break
-                               end
+local function storage_size()
+       local size = 0
+       if nixio.fs.access("/proc/mtd") then
+               for l in io.lines("/proc/mtd") do
+                       local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
+                       if n == "linux" or n == "firmware" then
+                               size = tonumber(s, 16)
+                               break
                        end
-               elseif fs.access("/proc/partitions") then
-                       for l in io.lines("/proc/partitions") do
-                               local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
-                               if b and n and not n:match('[0-9]') then
-                                       size = tonumber(b) * 1024
-                                       break
-                               end
+               end
+       elseif nixio.fs.access("/proc/partitions") then
+               for l in io.lines("/proc/partitions") do
+                       local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
+                       if b and n and not n:match('[0-9]') then
+                               size = tonumber(b) * 1024
+                               break
                        end
                end
-               return size
        end
+       return size
+end
+
+
+function action_flashops()
+       --
+       -- Overview
+       --
+       luci.template.render("admin_system/flashops", {
+               reset_avail   = supports_reset(),
+               upgrade_avail = supports_sysupgrade()
+       })
+end
 
+function action_sysupgrade()
+       local fs = require "nixio.fs"
+       local http = require "luci.http"
+       local image_tmp = "/tmp/firmware.img"
 
        local fp
-       luci.http.setfilehandler(
+       http.setfilehandler(
                function(meta, chunk, eof)
-                       if not fp then
-                               if meta and meta.name == "image" then
-                                       fp = io.open(image_tmp, "w")
-                               else
-                                       fp = io.popen(restore_cmd, "w")
-                               end
+                       if not fp and meta and meta.name == "image" then
+                               fp = io.open(image_tmp, "w")
                        end
-                       if chunk then
+                       if fp and chunk then
                                fp:write(chunk)
                        end
-                       if eof then
+                       if fp and eof then
                                fp:close()
                        end
                end
        )
 
-       if luci.http.formvalue("backup") then
-               --
-               -- Assemble file list, generate backup
-               --
-               local reader = ltn12_popen(backup_cmd)
-               luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
-                       luci.sys.hostname(), os.date("%Y-%m-%d")})
-               luci.http.prepare_content("application/x-targz")
-               luci.ltn12.pump.all(reader, luci.http.write)
-       elseif luci.http.formvalue("restore") then
-               --
-               -- Unpack received .tar.gz
-               --
-               local upload = luci.http.formvalue("archive")
-               if upload and #upload > 0 then
-                       luci.template.render("admin_system/applyreboot")
-                       luci.sys.reboot()
+       if not luci.dispatcher.test_post_security() then
+               fs.unlink(image_tmp)
+               return
+       end
+
+       --
+       -- Cancel firmware flash
+       --
+       if http.formvalue("cancel") then
+               fs.unlink(image_tmp)
+               http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
+               return
+       end
+
+       --
+       -- Initiate firmware flash
+       --
+       local step = tonumber(http.formvalue("step") or 1)
+       if step == 1 then
+               if image_supported(image_tmp) then
+                       luci.template.render("admin_system/upgrade", {
+                               checksum = image_checksum(image_tmp),
+                               storage  = storage_size(),
+                               size     = (fs.stat(image_tmp, "size") or 0),
+                               keep     = (not not http.formvalue("keep"))
+                       })
+               else
+                       fs.unlink(image_tmp)
+                       luci.template.render("admin_system/flashops", {
+                               reset_avail   = supports_reset(),
+                               upgrade_avail = supports_sysupgrade(),
+                               image_invalid = true
+                       })
                end
-       elseif luci.http.formvalue("image") or luci.http.formvalue("step") then
-               --
-               -- Initiate firmware flash
-               --
-               local step = tonumber(luci.http.formvalue("step") or 1)
-               if step == 1 then
-                       if image_supported() then
-                               luci.template.render("admin_system/upgrade", {
-                                       checksum = image_checksum(),
-                                       storage  = storage_size(),
-                                       size     = (fs.stat(image_tmp, "size") or 0),
-                                       keep     = (not not luci.http.formvalue("keep"))
-                               })
-                       else
-                               fs.unlink(image_tmp)
-                               luci.template.render("admin_system/flashops", {
-                                       reset_avail   = reset_avail,
-                                       upgrade_avail = upgrade_avail,
-                                       image_invalid = true
-                               })
+       --
+       -- Start sysupgrade flash
+       --
+       elseif step == 2 then
+               local keep = (http.formvalue("keep") == "1") and "" or "-n"
+               luci.template.render("admin_system/applyreboot", {
+                       title = luci.i18n.translate("Flashing..."),
+                       msg   = luci.i18n.translate("The system is flashing 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  = (#keep > 0) and "192.168.1.1" or nil
+               })
+               fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
+       end
+end
+
+function action_backup()
+       local reader = ltn12_popen("sysupgrade --create-backup - 2>/dev/null")
+
+       luci.http.header(
+               'Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' %{
+                       luci.sys.hostname(),
+                       os.date("%Y-%m-%d")
+               })
+
+       luci.http.prepare_content("application/x-targz")
+       luci.ltn12.pump.all(reader, luci.http.write)
+end
+
+function action_restore()
+       local fs = require "nixio.fs"
+       local http = require "luci.http"
+       local archive_tmp = "/tmp/restore.tar.gz"
+
+       local fp
+       http.setfilehandler(
+               function(meta, chunk, eof)
+                       if not fp and meta and meta.name == "archive" then
+                               fp = io.open(archive_tmp, "w")
+                       end
+                       if fp and chunk then
+                               fp:write(chunk)
+                       end
+                       if fp and eof then
+                               fp:close()
                        end
-               --
-               -- Start sysupgrade flash
-               --
-               elseif step == 2 then
-                       local keep = (luci.http.formvalue("keep") == "1") and "" or "-n"
-                       luci.template.render("admin_system/applyreboot", {
-                               title = luci.i18n.translate("Flashing..."),
-                               msg   = luci.i18n.translate("The system is flashing 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  = (#keep > 0) and "192.168.1.1" or nil
-                       })
-                       fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
                end
-       elseif reset_avail and luci.http.formvalue("reset") then
-               --
-               -- Reset system
-               --
+       )
+
+       if not luci.dispatcher.test_post_security() then
+               fs.unlink(archive_tmp)
+               return
+       end
+
+       local upload = http.formvalue("archive")
+       if upload and #upload > 0 then
+               luci.template.render("admin_system/applyreboot")
+               os.execute("tar -C / -xzf %q >/dev/null 2>&1" % archive_tmp)
+               luci.sys.reboot()
+               return
+       end
+
+       http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
+end
+
+function action_reset()
+       if supports_reset() then
                luci.template.render("admin_system/applyreboot", {
                        title = luci.i18n.translate("Erasing..."),
                        msg   = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."),
                        addr  = "192.168.1.1"
                })
+
                fork_exec("killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data")
-       else
-               --
-               -- Overview
-               --
-               luci.template.render("admin_system/flashops", {
-                       reset_avail   = reset_avail,
-                       upgrade_avail = upgrade_avail
-               })
+               return
        end
+
+       http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
 end
 
 function action_passwd()
@@ -316,11 +375,7 @@ function action_passwd()
 end
 
 function action_reboot()
-       local reboot = luci.http.formvalue("reboot")
-       luci.template.render("admin_system/reboot", {reboot=reboot})
-       if reboot then
-               luci.sys.reboot()
-       end
+       luci.sys.reboot()
 end
 
 function fork_exec(command)
index 6de3c73..9c33d9c 100644 (file)
@@ -1,5 +1,5 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
+-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
 -- Licensed to the public under the Apache License 2.0.
 
 module("luci.controller.admin.uci", package.seeall)
@@ -10,9 +10,9 @@ function index()
 
        entry({"admin", "uci"}, nil, _("Configuration"))
        entry({"admin", "uci", "changes"}, call("action_changes"), _("Changes"), 40).query = {redir=redir}
-       entry({"admin", "uci", "revert"}, call("action_revert"), _("Revert"), 30).query = {redir=redir}
-       entry({"admin", "uci", "apply"}, call("action_apply"), _("Apply"), 20).query = {redir=redir}
-       entry({"admin", "uci", "saveapply"}, call("action_apply"), _("Save &#38; Apply"), 10).query = {redir=redir}
+       entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir}
+       entry({"admin", "uci", "apply"}, post("action_apply"), _("Apply"), 20).query = {redir=redir}
+       entry({"admin", "uci", "saveapply"}, post("action_apply"), _("Save &#38; Apply"), 10).query = {redir=redir}
 end
 
 function action_changes()
index 49103a8..572446f 100644 (file)
@@ -51,13 +51,10 @@ rf.optional = true
 
 
 s:taboption("files", Flag, "nohosts",
-       translate("Ignore Hosts files")).optional = true
+       translate("Ignore <code>/etc/hosts</code>")).optional = true
 
-hf = s:taboption("files", DynamicList, "addnhosts",
-       translate("Additional Hosts files"))
-
-hf:depends("nohosts", "")
-hf.optional = true
+s:taboption("files", DynamicList, "addnhosts",
+       translate("Additional Hosts files")).optional = true
 
 
 s:taboption("advanced", Flag, "boguspriv",
@@ -138,7 +135,7 @@ rd = s:taboption("general", DynamicList, "rebind_domain",
        translate("List of domains to allow RFC1918 responses for"))
 
 rd:depends("rebind_protection", "1")
-rd.datatype = "host"
+rd.datatype = "host(1)"
 rd.placeholder = "ihost.netflix.com"
 
 
index da1e140..e48e3b4 100644 (file)
@@ -17,7 +17,12 @@ newnet = m:field(Value, "_netname", translate("Name of the new interface"),
 
 newnet:depends("_attach", "")
 newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_")
-newnet.datatype = "uciname"
+newnet.datatype = "and(uciname,maxlength(15))"
+
+advice = m:field(DummyValue, "d1", translate("Note: interface name length"),
+        translate("Maximum length of the name is 15 characters including " ..
+               "the automatic protocol/bridge prefix (br-, 6in4-, pppoe- etc.)"
+       ))
 
 newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface"))
 
index 40f8014..ce3c3ef 100644 (file)
@@ -107,6 +107,12 @@ m.uci:foreach("network", "switch",
                        local sp = s:option(ListValue, "mirror_source_port", translate("Mirror source port"))
                        local mp = s:option(ListValue, "mirror_monitor_port", translate("Mirror monitor port"))
 
+                       sp:depends("enable_mirror_tx", "1")
+                       sp:depends("enable_mirror_rx", "1")
+
+                       mp:depends("enable_mirror_tx", "1")
+                       mp:depends("enable_mirror_rx", "1")
+
                        local pt
                        for pt = 0, num_ports - 1 do
                                local name
index 9a2bd5d..4452892 100644 (file)
@@ -361,7 +361,8 @@ s:tab("encryption", translate("Wireless Security"))
 s:tab("macfilter", translate("MAC-Filter"))
 s:tab("advanced", translate("Advanced Settings"))
 
-s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+ssid = s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+ssid.datatype = "maxlength(32)"
 
 mode = s:taboption("general", ListValue, "mode", translate("Mode"))
 mode.override_values = true
@@ -748,7 +749,7 @@ auth_server:depends({mode="ap", encryption="wpa2"})
 auth_server:depends({mode="ap-wds", encryption="wpa"})
 auth_server:depends({mode="ap-wds", encryption="wpa2"})
 auth_server.rmempty = true
-auth_server.datatype = "host"
+auth_server.datatype = "host(0)"
 
 auth_port = s:taboption("encryption", Value, "auth_port", translate("Radius-Authentication-Port"), translatef("Default %d", 1812))
 auth_port:depends({mode="ap", encryption="wpa"})
@@ -772,7 +773,7 @@ acct_server:depends({mode="ap", encryption="wpa2"})
 acct_server:depends({mode="ap-wds", encryption="wpa"})
 acct_server:depends({mode="ap-wds", encryption="wpa2"})
 acct_server.rmempty = true
-acct_server.datatype = "host"
+acct_server.datatype = "host(0)"
 
 acct_port = s:taboption("encryption", Value, "acct_port", translate("Radius-Accounting-Port"), translatef("Default %d", 1813))
 acct_port:depends({mode="ap", encryption="wpa"})
index d4e834d..fd466d5 100644 (file)
@@ -33,12 +33,67 @@ until not ln
 
 block:close()
 
-
 m = Map("fstab", translate("Mount Points"))
+s = m:section(TypedSection, "global", translate("Global Settings"))
+s.addremove = false
+s.anonymous = true
+
+detect = s:option(Button, "block_detect", translate("Generate Config"), translate("Find all currently attached filesystems and swap and replace configuration with defaults based on what was detected"))
+detect.inputstyle = "reload"
+
+detect.write = function(self, section)
+       luci.sys.call("block detect >/etc/config/fstab")
+       luci.http.redirect(luci.dispatcher.build_url("admin/system", "fstab"))
+end
+
+o = s:option(Flag, "anon_swap", translate("Anonymous Swap"), translate("Mount swap not specifically configured"))
+o.default = o.disabled
+o.rmempty = false
+
+o = s:option(Flag, "anon_mount", translate("Anonymous Mount"), translate("Mount filesystems not specifically configured"))
+o.default = o.disabled
+o.rmempty = false
+
+o = s:option(Flag, "auto_swap", translate("Automount Swap"), translate("Automatically mount swap on hotplug"))
+o.default = o.enabled
+o.rmempty = false
+
+o = s:option(Flag, "auto_mount", translate("Automount Filesystem"), translate("Automatically mount filesystems on hotplug"))
+o.default = o.enabled
+o.rmempty = false
+
+o = s:option(Flag, "check_fs", translate("Check fileystems before mount"), translate("Automatically check filesystem for errors before mounting"))
+o.default = o.disabled
+o.rmempty = false
 
 local mounts = luci.sys.mounts()
+local non_system_mounts = {}
+for rawmount, val in pairs(mounts) do
+    if (string.find(val.mountpoint, "/tmp/.jail") == nil) then
+      repeat 
+          val.umount = false
+          if (val.mountpoint == "/") then
+              break
+          elseif (val.mountpoint == "/overlay") then
+              break
+          elseif (val.mountpoint == "/rom") then
+              break
+          elseif (val.mountpoint == "/tmp") then
+              break
+          elseif (val.mountpoint == "/tmp/shm") then
+              break
+          elseif (val.mountpoint == "/tmp/upgrade") then
+              break
+          elseif (val.mountpoint == "/dev") then
+              break
+          end
+          val.umount = true
+      until true
+      non_system_mounts[rawmount] = val       
+   end   
+end
 
-v = m:section(Table, mounts, translate("Mounted file systems"))
+v = m:section(Table, non_system_mounts, translate("Mounted file systems"))
 
 fs = v:option(DummyValue, "fs", translate("Filesystem"))
 
@@ -61,7 +116,21 @@ function used.cfgvalue(self, section)
        ) .. ")"
 end
 
+unmount = v:option(Button, "unmount", translate("Unmount"))
+unmount.render = function(self, section, scope)
+       if non_system_mounts[section].umount then
+               self.title = translate("Unmount")
+               self.inputstyle = "remove"
+               Button.render(self, section, scope)
+       end
+end
 
+unmount.write = function(self, section)
+       if non_system_mounts[section].umount then
+               luci.sys.call("/bin/umount '%s'" % luci.util.shellstartsqescape(non_system_mounts[section].mountpoint))
+               return luci.http.redirect(luci.dispatcher.build_url("admin/system", "fstab"))
+        end
+end
 
 mount = m:section(TypedSection, "mount", translate("Mount Points"), translate("Mount Points define at which point a memory device will be attached to the filesystem"))
 mount.anonymous = true
index 2652e00..f575167 100644 (file)
@@ -112,7 +112,7 @@ o.default = [[
 mkdir -p /tmp/extroot
 mount --bind / /tmp/introot
 mount /dev/sda1 /tmp/extroot
-tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf -
+tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
 umount /tmp/introot
 umount /tmp/extroot</pre>
 ]] %{
index 2f3c492..7c6d7e1 100644 (file)
@@ -3,12 +3,15 @@
 -- Licensed to the public under the Apache License 2.0.
 
 local ipkgfile = "/etc/opkg.conf"
+local distfeeds = "/etc/opkg/distfeeds.conf"
+local customfeeds = "/etc/opkg/customfeeds.conf"
 
-f = SimpleForm("ipkgconf", translate("OPKG-Configuration"))
+f = SimpleForm("ipkgconf", translate("OPKG-Configuration"), translate("General options for opkg"))
 
 f:append(Template("admin_system/ipkg"))
 
 t = f:field(TextValue, "lines")
+t.wrap = "off"
 t.rows = 10
 function t.cfgvalue()
        return nixio.fs.readfile(ipkgfile) or ""
@@ -22,4 +25,40 @@ function f.handle(self, state, data)
        return true
 end
 
-return f
+g = SimpleForm("distfeedconf", translate("Distribution feeds"),
+       translate("Build/distribution specific feed definitions. This file will NOT be preserved in any sysupgrade."))
+
+d = g:field(TextValue, "lines2")
+d.wrap = "off"
+d.rows = 10
+function d.cfgvalue()
+       return nixio.fs.readfile(distfeeds) or ""
+end
+
+function d.write(self, section, data)
+       return nixio.fs.writefile(distfeeds, data:gsub("\r\n", "\n"))
+end
+
+function g.handle(self, state, data)
+       return true
+end
+
+h = SimpleForm("customfeedconf", translate("Custom feeds"),
+       translate("Custom feed definitions, e.g. private feeds. This file can be preserved in a sysupgrade."))
+
+c = h:field(TextValue, "lines3")
+c.wrap = "off"
+c.rows = 10
+function c.cfgvalue()
+       return nixio.fs.readfile(customfeeds) or ""
+end
+
+function c.write(self, section, data)
+       return nixio.fs.writefile(customfeeds, data:gsub("\r\n", "\n"))
+end
+
+function h.handle(self, state, data)
+       return true
+end
+
+return f, g, h
index 94ba805..2874b56 100644 (file)
@@ -204,7 +204,7 @@ if has_ntpd then
 
 
                o = s:option(DynamicList, "server", translate("NTP server candidates"))
-               o.datatype = "host"
+               o.datatype = "host(0)"
                o:depends("enable", "1")
 
                -- retain server list even if disabled
index 05c8661..685082a 100644 (file)
@@ -34,7 +34,7 @@ local has_traceroute6 = fs.access("/usr/bin/traceroute6")
                        legend.parentNode.style.display = 'block';
                        legend.style.display = 'inline';
 
-                       stxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/diag_' + tool + protocol + '/' + addr, null,
+                       stxhr.post('<%=url('admin/network')%>/diag_' + tool + protocol + '/' + addr, { token: '<%=token%>' },
                                function(x)
                                {
                                        if (x.responseText)
@@ -53,9 +53,9 @@ local has_traceroute6 = fs.access("/usr/bin/traceroute6")
        }
 //]]></script>
 
-<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
+<form method="post" action="<%=url('admin/network/diagnostics')%>">
        <div class="cbi-map">
-               <h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+               <h2 name="content"><%:Diagnostics%></h2>
 
                <fieldset class="cbi-section">
                        <legend><%:Network Utilities%></legend>
index 1de3498..646d931 100644 (file)
@@ -49,7 +49,7 @@
                        s.innerHTML = '<%:Waiting for changes to be applied...%>';
                }
 
-               XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+               (new XHR()).post('<%=url('admin/network')%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
                        function(x)
                        {
                                if (s)
                );
        }
 
+       function iface_delete(id) {
+               if (!confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>'))
+                       return;
+
+               (new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
+                       function(x) {
+                               location.href = '<%=url('admin/network/network')%>';
+                       }
+               );
+       }
 
        var iwxhr = new XHR();
        var wifidevs = <%=luci.http.write_json(netdevs)%>;
        var arptable = <%=luci.http.write_json(arpcache)%>;
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", table.concat(ifaces, ","))%>', null,
+       XHR.poll(5, '<%=url('admin/network/iface_status', table.concat(ifaces, ","))%>', null,
                function(x, ifcs)
                {
                        if (ifcs)
                                                        html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
                                                }
 
-                                               if (ifc.type != 'tunnel')
+                                               if (ifc.macaddr)
                                                {
                                                        html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
                                                }
 
                                                if (ifc.ipaddrs && ifc.ipaddrs.length)
                                                {
-                                                       html += '<strong><%:IPv4%>: </strong>';
-
                                                        for (var i = 0; i < ifc.ipaddrs.length; i++)
                                                                html += String.format(
-                                                                       '%s%s/%d',
-                                                                       i ? ', ' : '',
-                                                                       ifc.ipaddrs[i].addr,
-                                                                       ifc.ipaddrs[i].prefix
+                                                                       '<strong><%:IPv4%>:</strong> %s<br />',
+                                                                       ifc.ipaddrs[i]
                                                                );
-
-                                                       html += '<br />';
                                                }
 
                                                if (ifc.ip6addrs && ifc.ip6addrs.length)
                                                {
-                                                       html += '<strong><%:IPv6%>: </strong>';
-
                                                        for (var i = 0; i < ifc.ip6addrs.length; i++)
                                                                html += String.format(
-                                                                       '%s%s/%d',
-                                                                       i ? ', ' : '',
-                                                                       ifc.ip6addrs[i].addr.toUpperCase(),
-                                                                       ifc.ip6addrs[i].prefix
+                                                                       '<strong><%:IPv6%>:</strong> %s<br />',
+                                                                       ifc.ip6addrs[i]
                                                                );
-
-                                                       html += '<br />';
                                                }
 
                                                d.innerHTML = html;
                                                d.innerHTML = String.format(
                                                        '<em><%:Unsupported protocol type.%></em><br />' +
                                                        '<a href="%h"><%:Install protocol extensions...%></a>',
-                                                               '<%=luci.dispatcher.build_url("admin/system/packages")%>?query=luci-proto&display=available'
+                                                               '<%=url("admin/system/packages")%>?query=luci-proto&display=available'
                                                );
                                        }
                                        else if (d && !ifc.ifname)
                                        {
                                                d.innerHTML = String.format(
                                                        '<em><%:Network without interfaces.%></em><br />' +
-                                                       '<a href="<%=luci.dispatcher.build_url("admin/network/network/%s")%>?tab.network.%s=physical"><%:Assign interfaces...%></a>',
+                                                       '<a href="<%=url("admin/network/network/%s")%>?tab.network.%s=physical"><%:Assign interfaces...%></a>',
                                                                ifc.name, ifc.name
                                                );
                                        }
                                        <td style="width:420px">
                                                <input type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
                                                <input type="button" class="cbi-button cbi-button-reset" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
-                                               <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
-                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="if (confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>')) location.href='<%=luci.dispatcher.build_url("admin/network/iface_delete", net[1])%>'" title="<%:Delete this interface%>" value="<%:Delete%>" />
+                                               <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
+                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
                                        </td>
                                </tr>
                        <% end %>
                </table>
 
-               <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/iface_add")%>'" />
+               <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=url("admin/network/iface_add")%>'" />
        </fieldset>
 </div>
index 8136383..94d9e88 100644 (file)
@@ -1,7 +1,7 @@
 <%+cbi/valueheader%>
 
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", self.network)%>', null,
+       XHR.poll(5, '<%=url('admin/network/iface_status', self.network)%>', null,
                function(x, ifc)
                {
                        if (ifc && (ifc = ifc[0]))
@@ -25,7 +25,7 @@
                                                html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
                                        }
 
-                                       if (ifc.type != 'tunnel')
+                                       if (ifc.macaddr)
                                        {
                                                html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
                                        }
 
                                                for (var i = 0; i < ifc.ipaddrs.length; i++)
                                                        html += String.format(
-                                                               '%s%s/%d',
+                                                               '%s%s',
                                                                i ? ', ' : '',
-                                                               ifc.ipaddrs[i].addr,
-                                                               ifc.ipaddrs[i].prefix
+                                                               ifc.ipaddrs[i]
                                                        );
 
                                                html += '<br />';
 
                                                for (var i = 0; i < ifc.ip6addrs.length; i++)
                                                        html += String.format(
-                                                               '%s%s/%d',
+                                                               '%s%s',
                                                                i ? ', ' : '',
-                                                               ifc.ip6addrs[i].addr.toUpperCase(),
-                                                               ifc.ip6addrs[i].prefix
+                                                               ifc.ip6addrs[i].toUpperCase()
                                                        );
 
                                                html += '<br />';
index 0ba334e..ab8e732 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "dhcplease_status")%>', null,
+       XHR.poll(5, '<%=url('admin/network/dhcplease_status')%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('lease_status_table');
index b299575..53c35ae 100644 (file)
@@ -1,6 +1,6 @@
 <script type="text/javascript">//<![CDATA[
        var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "switch_status")%>/' + switches.join(','), null,
+       XHR.poll(5, '<%=url('admin/network/switch_status')%>/' + switches.join(','), null,
                function(x, st)
                {
                        for (var i = 0; i < switches.length; i++)
index 90cc4c0..3533c6f 100644 (file)
@@ -1,5 +1,5 @@
 <%#
- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
@@ -87,7 +87,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Join Network: Wireless Scan%></a></h2>
+<h2 name="content"><%:Join Network: Wireless Scan%></h2>
 
 <div class="cbi-map">
        <fieldset class="cbi-section">
                                        <strong>Encryption:</strong> <%=format_wifi_encryption(net.encryption)%>
                                </td>
                                <td class="cbi-value-field" style="width:40px">
-                                       <form action="<%=REQUEST_URI%>" method="post">
+                                       <form action="<%=url('admin/network/wireless_join')%>" method="post">
+                                               <input type="hidden" name="token" value="<%=token%>" />
                                                <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
                                                <input type="hidden" name="join" value="<%=utl.pcdata(net.ssid)%>" />
                                                <input type="hidden" name="mode" value="<%=net.mode%>" />
        </fieldset>
 </div>
 <div class="cbi-page-actions right">
-       <form class="inline" action="<%=luci.dispatcher.build_url("admin/network/wireless")%>" method="get">
+       <form class="inline" action="<%=url("admin/network/wireless")%>" method="get">
                <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>" />
        </form>
-       <form class="inline" action="<%=REQUEST_URI%>" method="get">
+       <form class="inline" action="<%=url('admin/network/wireless_join')%>" method="post">
+               <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
                <input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>" />
        </form>
index 4fc268e..f82d06d 100644 (file)
                                st.innerHTML = '<em><%:Wireless is restarting...%></em>';
                }
 
-               XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+               (new XHR()).post('<%=url('admin/network')%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
                        function(x)
                        {
                                if (s)
                );
        }
 
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", table.concat(netlist, ","))%>', null,
+       function wifi_delete(id) {
+               if (!confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>'))
+                       return;
+
+               (new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
+                       function(x) {
+                               location.href = '<%=url('admin/network/wireless')%>';
+                       }
+               );
+       }
+
+       XHR.poll(5, '<%=url('admin/network/wireless_status', table.concat(netlist, ","))%>', null,
                function(x, st)
                {
                        if (st)
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Wireless Overview%></a></h2>
+<h2 name="content"><%:Wireless Overview%></h2>
 
 <fieldset class="cbi-section" style="display:none">
        <legend><%:Reconnecting interface%></legend>
                                        <span id="<%=dev:name()%>-iw-devinfo"></span>
                                </td>
                                <td style="width:310px;text-align:right">
-                                       <input type="button" class="cbi-button cbi-button-find" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/wireless_join")%>?device=<%=dev:name()%>'" title="<%:Find and join network%>" value="<%:Scan%>" />
-                                       <input type="button" class="cbi-button cbi-button-add" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/wireless_add")%>?device=<%=dev:name()%>'" title="<%:Provide new network%>" value="<%:Add%>" />
+                                       <form action="<%=url('admin/network/wireless_join')%>" method="post" class="inline">
+                                               <input type="hidden" name="device" value="<%=dev:name()%>" />
+                                               <input type="hidden" name="token" value="<%=token%>" />
+                                               <input type="submit" class="cbi-button cbi-button-find" style="width:100px" title="<%:Find and join network%>" value="<%:Scan%>" />
+                                       </form>
+                                       <form action="<%=url('admin/network/wireless_add')%>" method="post" class="inline">
+                                               <input type="hidden" name="device" value="<%=dev:name()%>" />
+                                               <input type="hidden" name="token" value="<%=token%>" />
+                                               <input type="submit" class="cbi-button cbi-button-add" style="width:100px" title="<%:Provide new network%>" value="<%:Add%>" />
+                                       </form>
                                </td>
                        </tr>
                        <!-- /physical device -->
                                        <td class="cbi-value-field" style="width:310px;text-align:right">
                                                <input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Delete this network%>" value="<%:Enable%>" />
                                                <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
-                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="if (confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>')) location.href='<%=luci.dispatcher.build_url("admin/network/wireless_delete", net:ifname())%>'" title="<%:Delete this network%>" value="<%:Remove%>" />
+                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="wifi_delete('<%=net:ifname()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
                                        </td>
                                </tr>
                                <% end %>
        <% end %>
 
 
-       <h2><a id="content" name="content"><%:Associated Stations%></a></h2>
+       <h2><%:Associated Stations%></h2>
 
        <fieldset class="cbi-section">
                <table class="cbi-section-table" style="margin:10px" id="iw-assoclist">
index fa0a97b..04687f3 100644 (file)
@@ -1,7 +1,7 @@
 <%+cbi/valueheader%>
 
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", self.ifname)%>', null,
+       XHR.poll(5, '<%=url('admin/network/wireless_status', self.ifname)%>', null,
                function(x, iw)
                {
                        if (iw && (iw = iw[0]))
index dbcf06b..04da3c1 100644 (file)
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Realtime Traffic%></a></h2>
+<h2 name="content"><%:Realtime Traffic%></h2>
 
 <ul class="cbi-tabmenu">
        <% for _, dev in ipairs(devices) do %>
index 64b950e..0b2e52e 100644 (file)
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Realtime Connections%></a></h2>
+<h2 name="content"><%:Realtime Connections%></h2>
 
 <div class="cbi-map-descr"><%:This page gives an overview over currently active network connections.%></div>
 
index a63bb71..c119b57 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:Kernel Log%></a></h2>
+<h2 name="content"><%:Kernel Log%></h2>
 <div id="content_syslog">
 <textarea readonly="readonly" wrap="off" rows="<%=dmesg:cmatch("\n")+2%>" id="syslog"><%=dmesg:pcdata()%></textarea>
 </div>
index 07a96b2..62188e4 100644 (file)
@@ -88,7 +88,9 @@
                if has_dsl then
                        local dsl_stat = luci.sys.exec("/etc/init.d/dsl_control lucistat")
                        local dsl_func = loadstring(dsl_stat)
-                       rv.dsl = dsl_func()
+                       if dsl_func then
+                               rv.dsl = dsl_func()
+                       end
                end
 
                luci.http.prepare_content("application/json")
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Status%></a></h2>
+<h2 name="content"><%:Status%></h2>
 
 <fieldset class="cbi-section">
        <legend><%:System%></legend>
index ba2933a..f49469a 100644 (file)
@@ -1,6 +1,6 @@
 <%#
  Copyright 2008-2009 Steven Barth <steven@midlink.org>
- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
@@ -37,7 +37,7 @@
                local net = wba.iface_get_network(i)
                if net and i ~= "lo" then
                        return '<a href="%s">%s</a>' %{
-                               luci.dispatcher.build_url("admin", "network", "network", net), i
+                               url("admin/network/network", net), i
                        }
 
                end
        }
 </style>
 
-<h2><a id="content" name="content"><%:Firewall Status%></a></h2>
+<h2 name="content"><%:Firewall Status%></h2>
+<br />
 
 <% if has_ip6tables then %>
 <ul class="cbi-tabmenu">
-       <li class="cbi-tab<%= mode ~= 4 and "-disabled" %>"><a href="<%=luci.dispatcher.build_url("admin/status/iptables/4")%>"><%:IPv4 Firewall%></a></li>
-       <li class="cbi-tab<%= mode ~= 6 and "-disabled" %>"><a href="<%=luci.dispatcher.build_url("admin/status/iptables/6")%>"><%:IPv6 Firewall%></a></li>
+       <li class="cbi-tab<%= mode ~= 4 and "-disabled" %>"><a href="<%=url("admin/status/iptables/4")%>"><%:IPv4 Firewall%></a></li>
+       <li class="cbi-tab<%= mode ~= 6 and "-disabled" %>"><a href="<%=url("admin/status/iptables/6")%>"><%:IPv6 Firewall%></a></li>
 </ul>
 <% end %>
 
-<form method="post" action="<%=REQUEST_URI%>">
-       <div class="cbi-map">
-               <fieldset class="cbi-section">
-                       <h3><%:Actions%></h3>
-                       <ul>
-                               <li><a href="<%=REQUEST_URI%>?zero=<%=mode%>"><%:Reset Counters%></a></li>
-                               <li><a href="<%=REQUEST_URI%>?restart=1"><%:Restart Firewall%></a></li>
-                       </ul>
-                       <br /><br />
-
-                       <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
-                               <h3><%:Table%>: <%=tbl%></h3>
-                               <table class="cbi-section-table" style="font-size:90%">
-                                       <% for _, chain in ipairs(ipt:chains(tbl)) do
-                                               rowcnt    = 0
-                                               chaincnt  = chaincnt + 1
-                                               chaininfo = ipt:chain(tbl, chain)
-                                       %>
-                                               <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                                       <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
-                                                               <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
-                                                               <%:Chain%> <em><%=chain%></em>
-                                                               (<%- if chaininfo.policy then -%>
-                                                                       <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
-                                                               <%- else -%>
-                                                                       <%:References%>: <%=chaininfo.references-%>
-                                                               <%- end -%>)</span>
-                                                       </th>
+<div class="cbi-map" style="position: relative">
+
+       <form method="post" action="<%=url("admin/status/iptables_action")%>" style="position: absolute; right: 0">
+               <input type="hidden" name="token" value="<%=token%>" />
+               <input type="hidden" name="family" value="<%=mode%>" />
+               <input type="submit" class="cbi-button" name="zero" value="<%:Reset Counters%>" />
+               <input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
+       </form>
+
+       <fieldset class="cbi-section">
+
+               <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
+                       <h3><%:Table%>: <%=tbl%></h3>
+                       <table class="cbi-section-table" style="font-size:90%">
+                               <% for _, chain in ipairs(ipt:chains(tbl)) do
+                                       rowcnt    = 0
+                                       chaincnt  = chaincnt + 1
+                                       chaininfo = ipt:chain(tbl, chain)
+                               %>
+                                       <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
+                                               <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
+                                                       <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
+                                                       <%:Chain%> <em><%=chain%></em>
+                                                       (<%- if chaininfo.policy then -%>
+                                                               <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
+                                                       <%- else -%>
+                                                               <%:References%>: <%=chaininfo.references-%>
+                                                       <%- end -%>)</span>
+                                               </th>
+                                       </tr>
+                                       <tr class="cbi-section-table-descr">
+                                               <th class="cbi-section-table-cell"><%:Pkts.%></th>
+                                               <th class="cbi-section-table-cell"><%:Traffic%></th>
+                                               <th class="cbi-section-table-cell"><%:Target%></th>
+                                               <th class="cbi-section-table-cell"><%:Prot.%></th>
+                                               <th class="cbi-section-table-cell"><%:In%></th>
+                                               <th class="cbi-section-table-cell"><%:Out%></th>
+                                               <th class="cbi-section-table-cell"><%:Source%></th>
+                                               <th class="cbi-section-table-cell"><%:Destination%></th>
+                                               <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
+                                       </tr>
+
+                                       <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
+                                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+                                                       <td><%=rule.packets%></td>
+                                                       <td style="white-space: nowrap"><%=wba.byte_format(rule.bytes)%></td>
+                                                       <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
+                                                       <td><%=rule.protocol%></td>
+                                                       <td><%=link_iface(rule.inputif)%></td>
+                                                       <td><%=link_iface(rule.outputif)%></td>
+                                                       <td><%=rule.source%></td>
+                                                       <td><%=rule.destination%></td>
+                                                       <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
                                                </tr>
-                                               <tr class="cbi-section-table-descr">
-                                                       <th class="cbi-section-table-cell"><%:Rule #%></th>
-                                                       <th class="cbi-section-table-cell"><%:Pkts.%></th>
-                                                       <th class="cbi-section-table-cell"><%:Traffic%></th>
-                                                       <th class="cbi-section-table-cell"><%:Target%></th>
-                                                       <th class="cbi-section-table-cell"><%:Prot.%></th>
-                                                       <th class="cbi-section-table-cell"><%:Flags%></th>
-                                                       <th class="cbi-section-table-cell"><%:In%></th>
-                                                       <th class="cbi-section-table-cell"><%:Out%></th>
-                                                       <th class="cbi-section-table-cell"><%:Source%></th>
-                                                       <th class="cbi-section-table-cell"><%:Destination%></th>
-                                                       <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
-                                               </tr>
-
-                                               <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
-                                                       <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                                               <td><%=rule.index%></td>
-                                                               <td><%=rule.packets%></td>
-                                                               <td><%=wba.byte_format(rule.bytes)%></td>
-                                                               <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
-                                                               <td><%=rule.protocol%></td>
-                                                               <td><%=rule.flags%></td>
-                                                               <td><%=link_iface(rule.inputif)%></td>
-                                                               <td><%=link_iface(rule.outputif)%></td>
-                                                               <td><%=rule.source%></td>
-                                                               <td><%=rule.destination%></td>
-                                                               <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
-                                                       </tr>
-                                               <% end %>
-
-                                               <% if rowcnt == 1 then %>
-                                                       <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                                               <td colspan="11"><em><%:No rules in this chain%></em></td>
-                                                       </tr>
-                                               <% end %>
                                        <% end %>
 
-                                       <% if chaincnt == 0 then %>
+                                       <% if rowcnt == 1 then %>
                                                <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                                       <td colspan="11"><em><%:No chains in this table%></em></td>
+                                                       <td colspan="9"><em><%:No rules in this chain%></em></td>
                                                </tr>
                                        <% end %>
-                               </table>
-                               <br /><br />
-                       <% end %>
-               </fieldset>
-       </div>
-</form>
+                               <% end %>
+
+                               <% if chaincnt == 0 then %>
+                                       <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
+                                               <td colspan="9"><em><%:No chains in this table%></em></td>
+                                       </tr>
+                               <% end %>
+                       </table>
+                       <br /><br />
+               <% end %>
+       </fieldset>
+</div>
 
 <%+footer%>
index d095948..97a2f5e 100644 (file)
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Realtime Load%></a></h2>
+<h2 name="content"><%:Realtime Load%></h2>
 
 <embed id="bwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/load.svg" />
 <div style="text-align:right"><small id="scale">-</small></div>
index 82dd3a7..5f2c074 100644 (file)
@@ -33,7 +33,7 @@
 <%+header%>
 
 <div class="cbi-map" id="cbi-network">
-       <h2><a id="content" name="content"><%:Routes%></a></h2>
+       <h2 name="content"><%:Routes%></h2>
        <div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
 
        <fieldset class="cbi-section">
index 40032a1..b87f21d 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System Log%></a></h2>
+<h2 name="content"><%:System Log%></h2>
 <div id="content_syslog">
 <textarea readonly="readonly" wrap="off" rows="<%=syslog:cmatch("\n")+2%>" id="syslog"><%=syslog:pcdata()%></textarea>
 </div>
index 025fece..f185926 100644 (file)
        );
 //]]></script>
 
-<h2><a id="content" name="content"><%:Realtime Wireless%></a></h2>
+<h2 name="content"><%:Realtime Wireless%></h2>
 
 <ul class="cbi-tabmenu">
        <% for _, dev in ipairs(devices) do %>
index 15c96e3..e722a48 100644 (file)
@@ -25,7 +25,7 @@
        <body>
                <div id="maincontainer">
                        <div id="maincontent">
-                               <h2><a id="content" name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></a></h2>
+                               <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
                                <fieldset class="cbi-section">
                                        <p>
                                                <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
index 0a6df10..c1f3361 100644 (file)
@@ -5,6 +5,6 @@
 -%>
 
 <ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/system/flashops")%>"><%:Actions%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=url("admin/system/flashops")%>"><%:Actions%></a></li>
        <li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
 </ul>
index 84e1510..37d8ae0 100644 (file)
@@ -1,7 +1,7 @@
 <%+cbi/valueheader%>
 
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "system", "clock_status")%>', null,
+       XHR.poll(5, '<%=url('admin/system/clock_status')%>', null,
                function(x, rv)
                {
                        var s = document.getElementById('<%=self.option%>-clock-status');
@@ -17,8 +17,8 @@
                btn.disabled = true;
                btn.value    = '<%:Synchronizing...%>';
 
-               XHR.get('<%=luci.dispatcher.build_url("admin", "system", "clock_status")%>',
-                       { set: Math.floor((new Date()).getTime() / 1000) },
+               (new XHR()).post('<%=url('admin/system/clock_status')%>',
+                       { token: '<%=token%>', set: Math.floor((new Date()).getTime() / 1000) },
                        function()
                        {
                                btn.disabled = false;
index bea565a..82a1fdb 100644 (file)
@@ -1,12 +1,12 @@
 <%#
  Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Flash operations%></a></h2>
+<h2 name="content"><%:Flash operations%></h2>
 
 <ul class="cbi-tabmenu">
        <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
 
        <fieldset class="cbi-section">
                <legend><%:Backup / Restore%></legend>
-               <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
-                       <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
-                       <div class="cbi-section-node">
+               <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
+               <div class="cbi-section-node">
+                       <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
+                               <input type="hidden" name="token" value="<%=token%>" />
                                <div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
                                        <label class="cbi-value-title" for="image"><%:Download backup%>:</label>
                                        <div class="cbi-value-field">
                                                <input class="cbi-button cbi-button-apply" type="submit" name="backup" value="<%:Generate archive%>" />
                                        </div>
                                </div>
-                               <% if reset_avail then %>
+                       </form>
+                       <% if reset_avail then %>
+                       <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
+                               <input type="hidden" name="token" value="<%=token%>" />
                                <div class="cbi-value cbi-value-last">
                                        <label class="cbi-value-title"><%:Reset to defaults%>:</label>
                                        <div class="cbi-value-field">
                                                <input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
                                        </div>
                                </div>
-                               <% end %>
-                       </div>
-                       <br />
-                       <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
-                       <div class="cbi-section-node">
+                       </form>
+                       <% end %>
+               </div>
+               <br />
+               <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
+               <div class="cbi-section-node">
+                       <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
                                <div class="cbi-value cbi-value-last">
                                        <label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
                                        <div class="cbi-value-field">
+                                               <input type="hidden" name="token" value="<%=token%>" />
                                                <input type="file" name="archive" id="archive" />
                                                <input type="submit" class="cbi-button cbi-input-apply" name="restore" value="<%:Upload archive...%>" />
                                        </div>
                                </div>
-                       </div>
-               </form>
+                       </form>
+               </div>
        </fieldset>
 
        <br />
@@ -54,7 +61,8 @@
        <fieldset class="cbi-section">
                <legend><%:Flash new firmware image%></legend>
                <% if upgrade_avail then %>
-                       <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
+                       <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
+                               <input type="hidden" name="token" value="<%=token%>" />
                                <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires an OpenWrt compatible firmware image).%></div>
                                <div class="cbi-section-node">
                                        <div class="cbi-value">
index 6b812e8..a7ff4e5 100644 (file)
@@ -5,6 +5,6 @@
 -%>
 
 <ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/system/packages")%>"><%:Actions%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=url("admin/system/packages")%>"><%:Actions%></a></li>
        <li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
 </ul>
index 1ceda47..1bc9cac 100644 (file)
@@ -44,19 +44,20 @@ end
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Software%></a></h2>
+<h2 name="content"><%:Software%></h2>
 
-<form method="post" action="<%=REQUEST_URI%>">
-       <div class="cbi-map">
+<div class="cbi-map">
 
-               <ul class="cbi-tabmenu">
-                       <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
-                       <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/ipkg"><%:Configuration%></a></li>
-               </ul>
-
-               <fieldset class="cbi-section">
+       <ul class="cbi-tabmenu">
+               <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
+               <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/ipkg"><%:Configuration%></a></li>
+       </ul>
 
+       <form method="post" action="<%=REQUEST_URI%>">
+               <input type="hidden" name="exec" value="1" />
+               <input type="hidden" name="token" value="<%=token%>" />
 
+               <fieldset class="cbi-section">
                        <fieldset class="cbi-section-node">
                                <% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %>
                                <div class="cbi-value">
@@ -80,7 +81,7 @@ end
                                        <% else %>
                                                <%:No package lists available%>
                                        <% end %>
-                                       <input type="button" onclick="location.href='?update=1'" href="#" class="cbi-button cbi-button-apply" style="margin-left:3em" value="<%:Update lists%>" />
+                                       <input type="submit" name="update" href="#" class="cbi-button cbi-button-apply" style="margin-left:3em" value="<%:Update lists%>" />
                                </div>
                                <% end %>
 
@@ -101,7 +102,7 @@ end
                                        <label class="cbi-value-title"><%:Download and install package%>:</label>
                                        <div class="cbi-value-field">
                                                <input type="text" name="url" size="30" value="" />
-                                               <input class="cbi-button cbi-input-save" type="submit" name="submit" value="<%:OK%>" />
+                                               <input class="cbi-button cbi-input-save" type="submit" name="exec" value="<%:OK%>" />
                                        </div>
                                </div>
 
@@ -114,80 +115,98 @@ end
                                </div>
                        </fieldset>
                </fieldset>
-               <br />
-
-               <h3><%:Status%></h3>
-
-
-               <ul class="cbi-tabmenu">
-                       <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
-                       <li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&amp;query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
-               </ul>
-
-               <% if display ~= "available" then %>
-                       <fieldset class="cbi-section">
-                               <table class="cbi-section-table" style="width:100%">
-                                       <tr class="cbi-section-table-titles">
-                                               <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
-                                               <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
-                                               <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
-                                       </tr>
-                                       <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, d) empty = false; filter[n] = true %>
-                                       <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                               <td style="text-align:left; width:10%"><a onclick="return window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?')" href="<%=REQUEST_URI%>?submit=1&amp;remove=<%=luci.util.pcdata(n)%>"><%:Remove%></a></td>
-                                               <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
-                                               <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
-                                       </tr>
-                                       <% end) %>
-                                       <% if empty then %>
-                                       <tr class="cbi-section-table-row">
-                                               <td style="text-align:left">&#160;</td>
-                                               <td style="text-align:left"><em><%:none%></em></td>
-                                               <td style="text-align:left"><em><%:none%></em></td>
-                                       </tr>
-                                       <% end %>
-                               </table>
-                       </fieldset>
-               <% else %>
-                       <fieldset class="cbi-section">
-                       <% if not querypat then %>
-                               <ul class="cbi-tabmenu">
-                                       <% local i; for i = 65, 90 do %>
-                                       <li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&amp;letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
-                                       <% end %>
-                                       <li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&amp;letter=%23">#</a></li>
-                               </ul>
-                               <div class="cbi-section-node">
-                       <% end %>
-                               <table class="cbi-section-table" style="width:100%">
-                                       <tr class="cbi-section-table-titles">
-                                               <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
-                                               <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
-                                               <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
-                                               <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
-                                       </tr>
-                                       <% local empty = true; opkg_list(querypat or letterpat, function(n, v, d) if filter[n] then return end; empty = false %>
-                                       <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                               <td style="text-align:left; width:10%"><a onclick="return window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?')" href="<%=REQUEST_URI%>?submit=1&amp;install=<%=luci.util.pcdata(n)%>"><%:Install%></a></td>
-                                               <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
-                                               <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
-                                               <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
-                                       </tr>
-                                       <% end) %>
-                                       <% if empty then %>
-                                       <tr class="cbi-section-table-row">
-                                               <td style="text-align:left">&#160;</td>
-                                               <td style="text-align:left"><em><%:none%></em></td>
-                                               <td style="text-align:left"><em><%:none%></em></td>
-                                               <td style="text-align:left"><em><%:none%></em></td>
-                                       </tr>
-                                       <% end %>
-                               </table>
-                       <% if not querypat then %>
-                               </div>
-                       <% end %>
-                       </fieldset>
+       </form>
+
+
+       <h3><%:Status%></h3>
+
+
+       <ul class="cbi-tabmenu">
+               <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+               <li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&amp;query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+       </ul>
+
+       <% if display ~= "available" then %>
+               <fieldset class="cbi-section">
+                       <table class="cbi-section-table" style="width:100%">
+                               <tr class="cbi-section-table-titles">
+                                       <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
+                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
+                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
+                               </tr>
+                               <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
+                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+                                       <td style="text-align:left; width:10%">
+                                               <form method="post" class="inline" action="<%=REQUEST_URI%>">
+                                                       <input type="hidden" name="exec" value="1" />
+                                                       <input type="hidden" name="token" value="<%=token%>" />
+                                                       <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
+                                                       <a onclick="window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Remove%></a>
+                                               </form>
+                                       </td>
+                                       <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
+                                       <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
+                               </tr>
+                               <% end) %>
+                               <% if empty then %>
+                               <tr class="cbi-section-table-row">
+                                       <td style="text-align:left">&#160;</td>
+                                       <td style="text-align:left"><em><%:none%></em></td>
+                                       <td style="text-align:left"><em><%:none%></em></td>
+                               </tr>
+                               <% end %>
+                       </table>
+               </fieldset>
+       <% else %>
+               <fieldset class="cbi-section">
+               <% if not querypat then %>
+                       <ul class="cbi-tabmenu">
+                               <% local i; for i = 65, 90 do %>
+                               <li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&amp;letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
+                               <% end %>
+                               <li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&amp;letter=%23">#</a></li>
+                       </ul>
+                       <div class="cbi-section-node">
+               <% end %>
+                       <table class="cbi-section-table" style="width:100%">
+                               <tr class="cbi-section-table-titles">
+                                       <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
+                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
+                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
+                                       <th class="cbi-section-table-cell" style="text-align:right"><%:Size (.ipk)%></th>
+                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
+                               </tr>
+                               <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
+                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+                                       <td style="text-align:left; width:10%">
+                                               <form method="post" class="inline" action="<%=REQUEST_URI%>">
+                                                       <input type="hidden" name="exec" value="1" />
+                                                       <input type="hidden" name="token" value="<%=token%>" />
+                                                       <input type="hidden" name="install" value="<%=pcdata(n)%>" />
+                                                       <a onclick="window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Install%></a>
+                                               </form>
+                                       </td>
+                                       <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
+                                       <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
+                                       <td style="text-align:right"><%=luci.util.pcdata(s)%></td>
+                                       <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
+                               </tr>
+                               <% end) %>
+                               <% if empty then %>
+                               <tr class="cbi-section-table-row">
+                                       <td style="text-align:left">&#160;</td>
+                                       <td style="text-align:left"><em><%:none%></em></td>
+                                       <td style="text-align:left"><em><%:none%></em></td>
+                                       <td style="text-align:right"><em><%:none%></em></td>
+                                       <td style="text-align:left"><em><%:none%></em></td>
+                               </tr>
+                               <% end %>
+                       </table>
+               <% if not querypat then %>
+                       </div>
                <% end %>
-       </div>
-</form>
+               </fieldset>
+       <% end %>
+</div>
+
 <%+footer%>
index 8076811..c955180 100644 (file)
@@ -1,25 +1,59 @@
 <%#
  Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
-<h3><%:Reboot%></h3>
+
+<h2 name="content"><%:Reboot%></h2>
+<br />
+
 <p><%:Reboots the operating system of your device%></p>
-<%-
-local c = require("luci.model.uci").cursor():changes()
-if c and next(c) then
--%>
-       <p class="warning"><%:Warning: There are unsaved changes that will be lost while rebooting!%></p> 
-<%-
-end
-if not reboot then 
--%>
-<p><a href="<%=controller%>/admin/system/reboot?reboot=1"><%:Perform reboot%></a></p>
-<%- else -%>
-<p><%:Please wait: Device rebooting...%></p>
-<script type="text/javascript">setTimeout("location='<%=controller%>/admin'", 60000)</script>
+
+<%- 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 -%>
-<%+footer%>
\ No newline at end of file
+
+<hr />
+
+<script type="text/javascript">//<![CDATA[
+       var tries = 0;
+
+       function ok() {
+               window.location = '<%=controller%>/admin';
+       }
+
+       function check() {
+               if (tries++ < 12)
+                       window.setTimeout(ping, 5000);
+               else
+                       alert('<%:Device unreachable%>');
+       }
+
+       function ping() {
+               var img = document.createElement('img');
+
+               img.onload = ok;
+               img.onerror = check;
+               img.src = '<%=resource%>/icons/loading.gif?' + Math.random();
+
+               document.getElementById('reboot-message').innerHTML = '<%:Waiting for device...%>';
+       }
+
+       function reboot(button) {
+               button.style.display = 'none';
+               document.getElementById('reboot-message').parentNode.style.display = '';
+
+               (new XHR()).post('<%=controller%>/admin/system/reboot/call', { token: '<%=token%>' }, check);
+       }
+//]]></script>
+
+<input class="cbi-button cbi-button-apply" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
+
+<p class="alert-message" style="display:none">
+       <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
+       <span id="reboot-message"><%:Device is rebooting...%></span>
+</p>
+
+<%+footer%>
index b9d4235..5ca0398 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Flash Firmware%> - <%:Verify%></a></h2>
+<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
 <p>
        <%_ The flash image was uploaded.
                Below is the checksum and file size listed,
 </fieldset>
 
 <div class="cbi-page-actions right">
-       <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
-               <input class="cbi-button cbi-button-reset" type="submit" value="<%:Cancel%>" />
-       </form>
-       <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
+       <form class="inline" action="<%=REQUEST_URI%>" method="post">
+               <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="step" value="2" />
                <input type="hidden" name="keep" value="<%=keep and "1" or ""%>" />
+               <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>
index 4284b44..370027e 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Configuration%> / <%:Apply%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Apply%></h2>
 
 <% if changes then %>
        <%+cbi/apply_xhr%>
index 84e2287..c337360 100644 (file)
@@ -1,12 +1,12 @@
 <%#
  Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Configuration%> / <%:Changes%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Changes%></h2>
 
 <% if changes then %>
        <%+admin_uci/changelog%>
        <% end %>
 
        <div style="text-align:right">
-               <form class="inline" method="get" action="<%=controller%>/admin/uci/apply">
+               <form class="inline" method="post" action="<%=controller%>/admin/uci/apply">
+                       <input type="hidden" name="token" value="<%=token%>" />
                        <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
                        <input class="cbi-button cbi-button-apply" type="submit" value="<%:Apply%>" />
                </form>
-               <form class="inline" method="get" action="<%=controller%>/admin/uci/saveapply">
+               <form class="inline" method="post" action="<%=controller%>/admin/uci/saveapply">
+                       <input type="hidden" name="token" value="<%=token%>" />
                        <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
                        <input class="cbi-button cbi-button-save" type="submit" value="<%:Save & Apply%>" />
                </form>
-               <form class="inline" method="get" action="<%=controller%>/admin/uci/revert">
+               <form class="inline" method="post" action="<%=controller%>/admin/uci/revert">
+                       <input type="hidden" name="token" value="<%=token%>" />
                        <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
                        <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
                </form>
index d2bdc7a..5da7281 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Configuration%> / <%:Revert%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Revert%></h2>
 
 <% if changes then %>
        <%+cbi/apply_xhr%>
index 4c53624..d33a2ca 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
 <br />
 <p><% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %></p>
 <p><%:Please wait: Device rebooting...%></p>
index b0f52f7..efc6aa7 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
 <h3><%:Backup / Restore%></h3>
 <p><%:Here you can backup and restore your configuration and - if possible - reset this device to the default settings.%></p>
 <br />
index 9fb03c3..5818a56 100644 (file)
@@ -4,7 +4,7 @@
  Licensed to the public under the Apache License 2.0.
 -%>
 
-<h2><a id="content" name="content"><%:Hello!%></a></h2>
+<h2 name="content"><%:Hello!%></h2>
 <p><%_This is the administration area of <abbr title="Lua Configuration Interface">LuCI</abbr>.%></p>
 <p><%_<abbr title="Lua Configuration Interface">LuCI</abbr> is a free, flexible, and user friendly graphical interface for configuring OpenWrt.%><br />
 <%:On the following pages you can adjust all important settings of this device.%></p>
index 0717f68..f70e7c9 100644 (file)
@@ -5,7 +5,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
 <h3><%:Reboot%></h3>
 <p><%:Reboots the operating system of your device%></p>
 <%-
index 474c220..ecd1e8a 100644 (file)
@@ -6,7 +6,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
 <h3><%:Flash Firmware%></h3>
 
 <% if step == 1 then %>
index 6f78643..60caadb 100644 (file)
@@ -84,11 +84,13 @@ function action_flashops()
                                        fp = io.open(image_tmp, "w")
                                end
                        end
-                       if chunk then
-                               fp:write(chunk)
-                       end
-                       if eof then
-                               fp:close()
+                       if fp then
+                               if chunk then
+                                       fp:write(chunk)
+                               end
+                               if eof then
+                                       fp:close()
+                               end
                        end
                end
        )
index 0c8cebc..12c138c 100644 (file)
@@ -25,7 +25,7 @@
        <body>
                <div id="maincontainer">
                        <div id="maincontent">
-                               <h2><a id="content" name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></a></h2>
+                               <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
                                <fieldset class="cbi-section">
                                        <p>
                                                <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
index 29c4d2d..3c8d11b 100644 (file)
@@ -7,7 +7,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Flash operations%></a></h2>
+<h2 name="content"><%:Flash operations%></h2>
 <fieldset class="cbi-section">
        <legend><%:Flash new firmware image%></legend>
        <% if upgrade_avail then %>
index 189939a..cbbe13b 100644 (file)
@@ -6,7 +6,7 @@
 -%>
 
 <%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
 <h3><%:Reboot%></h3>
 <p><%:Reboots the operating system of your device%></p>
 <%- if not reboot then -%>
index 619ed85..3be9ae1 100644 (file)
@@ -7,7 +7,7 @@
 
 <%+header%>
 
-<h2><a id="content" name="content"><%:Flash Firmware%> - <%:Verify%></a></h2>
+<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
 <p>
        <%_ The flash image was uploaded.
                Below is the checksum and file size listed,
index b2e1683..dbf3820 100644 (file)
@@ -11,7 +11,7 @@
 %>
 
 <% if has_latlon then %>
-       <iframe style="width:100%; height:640px; border:none" src="<%=luci.dispatcher.build_url("freifunk/map/content")%>"></iframe>
+       <iframe style="width:100%; height:640px; border:none" src="<%=url("freifunk/map/content")%>"></iframe>
        <h3><%:Legend%>:</h3>
        <ul>
                <li><strong><span style="color:#00cc00"><%:Green%></span></strong>:<%:Very good (ETX < 2)%></li>
index f7cb4a9..1add595 100644 (file)
@@ -27,7 +27,7 @@ else
 end
 %>
 
-<h2><a id="content" name="content"><%:Contact%></a></h2>
+<h2 name="content"><%:Contact%></h2>
 
 <fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
 <legend><%:Operator%></legend>
index 129ca43..759bb74 100644 (file)
@@ -49,10 +49,10 @@ function rpc_auth()
        server.challenge = function(user, pass)
                local sid, token, secret
 
-               require "luci.config"
+               local config = require "luci.config"
 
                if sys.user.checkpasswd(user, pass) then
-                       local sdat = util.ubus("session", "create", { timeout = luci.config.sauth.sessiontime })
+                       local sdat = util.ubus("session", "create", { timeout = config.sauth.sessiontime })
                        if sdat then
                                sid = sdat.ubus_rpc_session
                                token = sys.uniqueid(16)
index 9315dc2..7b5e604 100644 (file)
@@ -39,7 +39,7 @@ protocol.optional = true
 server = section:taboption("general", Value, "server",
        translate("Tunnel setup server"),
        translate("Optional, specify to override default server (tic.sixxs.net)"))
-server.datatype = "host"
+server.datatype = "host(0)"
 server.optional = true
 
 
index 2f8108e..37d4ec9 100644 (file)
@@ -50,7 +50,7 @@ ip6prefixlen.datatype    = "range(0,64)"
 
 
 s:taboption("general", Value, "ealen",
-       translate("EA-bits length")).datatype = "range(0,16)"
+       translate("EA-bits length")).datatype = "range(0,48)"
 
 s:taboption("general", Value, "psidlen",
        translate("PSID-bits length")).datatype = "range(0,16)"
index 4ed34ae..ad3f2ed 100644 (file)
@@ -13,7 +13,7 @@ oc_key_file = "/etc/openconnect/user-key-" .. ifc .. ".pem"
 oc_ca_file = "/etc/openconnect/ca-" .. ifc .. ".pem"
 
 server = section:taboption("general", Value, "server", translate("VPN Server"))
-server.datatype = "host"
+server.datatype = "host(0)"
 
 port = section:taboption("general", Value, "port", translate("VPN Server port"))
 port.placeholder = "443"
index 523ef1b..506170c 100644 (file)
@@ -8,7 +8,7 @@ local ipv6, defaultroute, metric, peerdns, dns, mtu
 
 
 server = section:taboption("general", Value, "server", translate("L2TP Server"))
-server.datatype = "host"
+server.datatype = "or(host(1), hostport(1))"
 
 
 username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
diff --git a/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppossh.lua b/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppossh.lua
new file mode 100644 (file)
index 0000000..eca7bdd
--- /dev/null
@@ -0,0 +1,122 @@
+-- Copyright (C) 2015 Yousong Zhou <yszhou4tech@gmail.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local map, section, net = ...
+
+local sshuser, server, port, ssh_options, identity, ipaddr, peeraddr
+
+sshuser = section:taboption("general", Value, "sshuser", translate("SSH username"))
+
+server = section:taboption("general", Value, "server", translate("SSH server address"))
+server.datatype = "host(0)"
+
+port = section:taboption("general", Value, "port", translate("SSH server port"))
+port.datatype = "port"
+port.optional = true
+port.default = 22
+
+ssh_options = section:taboption("general", Value, "ssh_options", translate("Extra SSH command options"))
+ssh_options.optional = true
+
+identity = section:taboption("general", DynamicList, "identity", translate("List of SSH key files for auth"))
+identity.optional = true
+identity.datatype = "file"
+
+ipaddr = section:taboption("general", Value, "ipaddr", translate("Local IP address to assign"))
+ipaddr.datatype = "ipaddr"
+
+peeraddr = section:taboption("general", Value, "peeraddr", translate("Peer IP address to assign"))
+peeraddr.datatype = "ipaddr"
+
+
+local ipv6, defaultroute, metric, peerdns, dns,
+      keepalive_failure, keepalive_interval, demand
+
+if luci.model.network:has_ipv6() then
+        ipv6 = section:taboption("advanced", Flag, "ipv6",
+                translate("Enable IPv6 negotiation on the PPP link"))
+        ipv6.default = ipv6.disabled
+end
+
+
+defaultroute = section:taboption("advanced", Flag, "defaultroute",
+       translate("Use default gateway"),
+       translate("If unchecked, no default route is configured"))
+
+defaultroute.default = defaultroute.enabled
+
+
+metric = section:taboption("advanced", Value, "metric",
+       translate("Use gateway metric"))
+
+metric.placeholder = "0"
+metric.datatype    = "uinteger"
+metric:depends("defaultroute", defaultroute.enabled)
+
+
+peerdns = section:taboption("advanced", Flag, "peerdns",
+       translate("Use DNS servers advertised by peer"),
+       translate("If unchecked, the advertised DNS server addresses are ignored"))
+
+peerdns.default = peerdns.enabled
+
+
+dns = section:taboption("advanced", DynamicList, "dns",
+       translate("Use custom DNS servers"))
+
+dns:depends("peerdns", "")
+dns.datatype = "ipaddr"
+dns.cast     = "string"
+
+
+keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
+       translate("LCP echo failure threshold"),
+       translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
+
+function keepalive_failure.cfgvalue(self, section)
+       local v = m:get(section, "keepalive")
+       if v and #v > 0 then
+               return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
+       end
+end
+
+function keepalive_failure.write() end
+function keepalive_failure.remove() end
+
+keepalive_failure.placeholder = "0"
+keepalive_failure.datatype    = "uinteger"
+
+
+keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
+       translate("LCP echo interval"),
+       translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
+
+function keepalive_interval.cfgvalue(self, section)
+       local v = m:get(section, "keepalive")
+       if v and #v > 0 then
+               return tonumber(v:match("^%d+[ ,]+(%d+)"))
+       end
+end
+
+function keepalive_interval.write(self, section, value)
+       local f = tonumber(keepalive_failure:formvalue(section)) or 0
+       local i = tonumber(value) or 5
+       if i < 1 then i = 1 end
+       if f > 0 then
+               m:set(section, "keepalive", "%d %d" %{ f, i })
+       else
+               m:del(section, "keepalive")
+       end
+end
+
+keepalive_interval.remove      = keepalive_interval.write
+keepalive_interval.placeholder = "5"
+keepalive_interval.datatype    = "min(1)"
+
+
+demand = section:taboption("advanced", Value, "demand",
+       translate("Inactivity timeout"),
+       translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
+
+demand.placeholder = "0"
+demand.datatype    = "uinteger"
index d81db1f..462d701 100644 (file)
@@ -9,7 +9,7 @@ local defaultroute, metric, peerdns, dns,
 
 
 server = section:taboption("general", Value, "server", translate("VPN Server"))
-server.datatype = "host"
+server.datatype = "host(0)"
 
 
 username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
index e84658c..7bbd78f 100644 (file)
@@ -4,7 +4,7 @@
 local netmod = luci.model.network
 
 local _, p
-for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do
+for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) do
 
        local proto = netmod:register_protocol(p)
 
@@ -21,6 +21,8 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do
                        return luci.i18n.translate("PPPoATM")
                elseif p == "l2tp" then
                        return luci.i18n.translate("L2TP")
+               elseif p == "pppossh" then
+                       return luci.i18n.translate("PPPoSSH")
                end
        end
 
@@ -41,6 +43,8 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do
                        return "ppp-mod-pppoa"
                elseif p == "l2tp" then
                        return "xl2tpd"
+               elseif p == "pppossh" then
+                       return "pppossh"
                end
        end
 
@@ -55,6 +59,8 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do
                        return nixio.fs.access("/lib/netifd/proto/3g.sh")
                elseif p == "l2tp" then
                        return nixio.fs.access("/lib/netifd/proto/l2tp.sh")
+               elseif p == "pppossh" then
+                       return nixio.fs.access("/lib/netifd/proto/pppossh.sh")
                else
                        return nixio.fs.access("/lib/netifd/proto/ppp.sh")
                end
diff --git a/protocols/luci-proto-vpnc/Makefile b/protocols/luci-proto-vpnc/Makefile
new file mode 100644 (file)
index 0000000..9c77e67
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Support for VPNC VPN
+LUCI_DEPENDS:=+vpnc
+LUCI_PKGARCH:=all
+
+PKG_NAME:=luci-proto-vpnc
+PKG_RELEASE=1
+PKG_VERSION:=1.0.0
+PKG_MAINTAINER:=Daniel Dickinson <openwrt@daniel.thecshore.com>
+PKG_LICENSE:=Apache-2.0
+
+LUA_TARGET:=source
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
\ No newline at end of file
diff --git a/protocols/luci-proto-vpnc/luasrc/model/cbi/admin_network/proto_vpnc.lua b/protocols/luci-proto-vpnc/luasrc/model/cbi/admin_network/proto_vpnc.lua
new file mode 100644 (file)
index 0000000..e450470
--- /dev/null
@@ -0,0 +1,82 @@
+-- Copyright 2015 Daniel Dickinson <openwrt@daniel.thecshore.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local map, section, net = ...
+
+local server, username, password, hexpassword
+local authgroup, interface, passgroup, hexpassgroup
+local domain, vendor, natt_mode, dh_group
+local pfs, enable_single_des, enable_no_enc
+local mtu, local_addr, local_port, dpd_idle
+local auth_mode, target_network
+
+local ifc = net:get_interface():name()
+
+server = section:taboption("general", Value, "server", translate("VPN Server"))
+server.datatype = "host(0)"
+
+port = section:taboption("general", Value, "local_addr", translate("VPN Local address"))
+port.placeholder = "0.0.0.0"
+port.datatype    = "ipaddr"
+
+port = section:taboption("general", Value, "local_port", translate("VPN Local port"))
+port.placeholder = "500"
+port.datatype    = "port"
+
+ifname = section:taboption("general", Value, "interface", translate("Output Interface"))
+ifname.template = "cbi/network_netlist"
+
+mtu = section.taboption("general", Value, "mtu", translate("MTU"))
+mtu.datatype = "uinteger"
+
+section:taboption("general", Value, "authgroup", translate("AuthGroup"))
+
+username = section:taboption("general", Value, "username", translate("Username"))
+password = section:taboption("general", Value, "password", translate("Password"))
+hexpassword = section:taboption("general", Value, "hexpassword", translate("Obfuscated Password"))
+password.password = true
+hexpassword.password = true
+authroup = section:taboption("general", Value, "authgroup", translate("Auth Group"))
+passgroup = section:taboption("general", Value, "passgroup", translate("Group Password"))
+hexpassgroup = section:taboption("general", Value, "hexpassgroup", translate("Obfuscated Group Password"))
+password.passgroup = true
+hexpassword.passgroup= true
+
+domain = section:taboption("general", Value, "domain", translate("NT Domain"))
+vendor = section:taboption("general", Value, "vendor", translate("Vendor"))
+dh_group = section:taboption("general", ListValue, "dh_group", translate("IKE DH Group"))
+dh_group:value("dh2")
+dh_group:value("dh1")
+dh_group:value("dh5")
+
+pfs = section:taboption("general", ListValue, "pfs", translate("Perfect Forward Secrecy"))
+dh_group:value("server")
+dh_group:value("nopfs")
+dh_group:value("dh1")
+dh_group:value("dh2")
+dh_group:value("dh5")
+
+natt_mode = section:taboption("general", ListValue, "natt_mode", translate("NAT-T Mode")
+natt_mode:value("natt", translate("RFC3947 NAT-T mode"))
+natt_mode:value("none", translate("No NAT-T"))
+natt_mode:value("force-natt", translate("Force use of NAT-T")
+natt_mode:value("cisco-udp", translate("Cisco UDP encapsulation")
+
+enable_no_enc = section:taboption("general", Flag, "enable_no_enc",
+       translate("Disable Encryption"),
+       translate("If checked, encryption is disabled"))
+enable_no_enc.default = enable_no_enc.disabled
+
+enable_single_des = section:taboption("general", Flag, "enable_single_des",
+       translate("Enable Single DES"),
+       translate("If checked, 1DES is enaled"))
+enable_no_enc.default = enable_single_des.disabled
+
+dpd_idle = section.taboption("general", Value, "dpd_idle", translate("DPD Idle Timeout"))
+dpd_idle.datatype = "uinteger"
+dpd.placeholder = "600"
+
+ifname = section:taboption("general", Value, "target_network", translate("Target network"))
+port.placeholder = "0.0.0.0/0"
+port.datatype    = "network"
+
diff --git a/protocols/luci-proto-vpnc/luasrc/model/network/proto_vpnc.lua b/protocols/luci-proto-vpnc/luasrc/model/network/proto_vpnc.lua
new file mode 100644 (file)
index 0000000..f4cae0b
--- /dev/null
@@ -0,0 +1,46 @@
+-- Copyright 2015 Daniel Dickinson <openwrt@daniel.thecshore.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local netmod = luci.model.network
+local interface = luci.model.network.interface
+local proto = netmod:register_protocol("vpnc")
+
+function proto.get_i18n(self)
+       return luci.i18n.translate("VPNC (CISCO 3000 (and others) VPN)")
+end
+
+function proto.ifname(self)
+       return "vpn-" .. self.sid
+end
+
+function proto.get_interface(self)
+       return interface(self:ifname(), self)
+end
+
+function proto.opkg_package(self)
+       return "vpnc"
+end
+
+function proto.is_installed(self)
+       return nixio.fs.access("/lib/netifd/proto/vpnc.sh")
+end
+
+function proto.is_floating(self)
+       return true
+end
+
+function proto.is_virtual(self)
+       return true
+end
+
+function proto.get_interfaces(self)
+       return nil
+end
+
+function proto.contains_interface(self, ifc)
+        return (netmod:ifnameof(ifc) == self:ifname())
+
+end
+
+netmod:register_pattern_virtual("^vpn-%w")
+
index f4a6810..3b40ad4 100644 (file)
        %>
        <div class="pull-right">
        <% if ucichanges > 0 then %>
-         <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes"><%:Unsaved Changes%>: <%=ucichanges%></a>
+         <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucichanges%></a>
        <% end %>
       <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
        <span class="label success" id="xhr_poll_status_on"><%:Auto Refresh%> <%:on%></span>
diff --git a/themes/luci-theme-freifunk-bno/Makefile b/themes/luci-theme-freifunk-bno/Makefile
deleted file mode 100644 (file)
index 1491a97..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
-#
-# This is free software, licensed under the Apache License, Version 2.0 .
-#
-
-include $(TOPDIR)/rules.mk
-
-LUCI_TITLE:=Freifunk Berlin Nordost Theme
-LUCI_DEPENDS:=
-
-include ../../luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css
deleted file mode 100644 (file)
index 4f89b2d..0000000
+++ /dev/null
@@ -1,872 +0,0 @@
-* {
-       margin: 0;
-       padding: 0;
-}
-
-body {
-       background-color: #ffffff;
-       color: #ffffff;
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 100%;
-       line-height: 100%;
-       background-image: url(images/main-back.png);
-       background-repeat: repeat-x;
-       background-position: left bottom;
-       }
-#all {
-        margin: 0px;
-       padding: 0px;
-        min-height: 800px;
-}
-
-code {
-       font-family: monospace;
-       white-space: pre;
-}
-
-a:link, a:visited {
-       color:#000000;
-       font-weight:bold;
-       text-decoration:none;
-       }
-a:hover {
-       color:#333333;
-       font-weight:bold;
-       }
-
-/* Custom*/
- #wrapper
-{
-       width: 95%;
-       color: #333333;
-       margin-left: auto;
-       margin-right: auto;
-/*     background-image: url(images/corner-left.gif);  */
-/*     background-repeat: no-repeat;                   */
-/*     background-position: left bottom;               */
-       background-color: #FffdF4;
-       min-width: 710px;
-   min-height: 710px;
-}
-#main {
-  clear: both;
-  width: 100%;
-  margin: 0;
-  padding: 0;
-  color: #333333;
-/*  background-image: url(images/corner-right.gif);    */
-/*  background-repeat: no-repeat;                      */
-/*  background-position: right bottom;                 */
-   min-height: 710px;
-}
-
-div#maincontent ul {
-       margin-left: 2em;
-}
-
-.warning {
-       color: red !important;
-       font-weight: bold;
-}
-
-.clear {
-       clear: both;
-       height: 1px;
-}
-
-.hidden {
-       display: none;
-}
-
-.error {
-       color: #ff0000;
-}
-
-#header
-{
- padding: 0px;
- height: 100px;
-}
-#headerleft
-{
- height: 100px;
- background-color: #FFFfff;
- background-image: url(images/header-left.gif);
- background-repeat: no-repeat;
- background-position: left top;
-}
-#headerright
-{
- height: 100px;
- background-color: #FFfffF;
-
- margin-left: 5px;
- background-image: url(images/header-right.gif);
- background-repeat: no-repeat;
- background-position: right top;
-}
-
-#headerback
-{
- margin-right: 5px;
- height: 100px;
- background-color: #FFfffF;
- background-image: url(images/header-back.gif);
- background-repeat: repeat-x;
- background-position: left top;
-}
-#schriftzug {
- font-size : 1.5em;
- text-align:left;
- margin-bottom: 7px;
- margin-top: 7px;
- float:left;
- width: 450px;
-}
-
-#schriftzug a:hover{
- background-color:transparent;
-}
-#logo{
- margin-top: 5px;
- float:right;
- width: 115px;
-}
-
-.pathbar {
-       display: none;
-}
-
-.menubar {
-       width: 100%;
-       min-height: 1.8em;
-       background: #ffffff;
-       color: #000000;
-       border-top:0.4em solid #DC0067;
-}
-
-.mainmenu {
-       float: left;
-       width: auto;
-       min-height: 1.8em;
-       background: #ffffff;
-       color: #000000;
-}
-.modemenu li {
-       border-top:0.3em solid #DC0067;
-       margin-left:  0.3em;
-       margin-top:  -0.3em;
-}
-.mainmenu div {
-       float: left;
-       border-top:0.3em solid #DC0067;
-       margin-right:  0.3em;
-       margin-top:  -0.3em;
-}
-.mainmenu div.preactive {
-       border-top: 0.3em solid #FFCB05;
-       margin-top:  -0.2em;
-}
-
-.mainmenu li {
-       white-space: nowrap;
-}
-
-.mainmenu div ul {
-       display: none;
-       position: absolute;
-       background: #ffffff;
-       color: #000000;
-       border-width: 0 1px 1px 1px;
-       border-style: solid;
-       border-color: #444444;
-       list-style-type: none;
-}
-
-.mainmenu ul li:hover > ul,
-.mainmenu div:hover > ul {
-       display: block;
-}
-
-.mainmenu ul li > ul {
-       left: 100%;
-       margin-top: -1.8em;
-       border-width: 1px;
-}
-
-.modemenu a,
-.mainmenu a {
-       display: block;
-       padding: 0.2em;
-       color: #000000;
-       text-decoration: none;
-       font-size: 70%;
-       font-weight: bold;
-}
-
-
-.modemenu .active a {
-       color: #000000;
-       font-weight: bold;
-       border-top:0.3em solid #FFCB05;
-       margin-top:  -0.2em;
-}
-.mainmenu .active a{
-       color: #000000;
-       font-weight: bold;
-       border-top:0.2em solid #FFCB05;
-}
-.mainmenu li > span:active {
-       background-color: #FFE990;
-}
-
-.mainmenu li:hover > span > a,
-.mainmenu div:hover > a {
-color: #ffffff;
-background-color: #FFCB05;
-}
-
-
-.modemenu a:focus,
-.mainmenu a:focus {
-       color: #000000;
-}
-
-.mainmenu a:hover,
-.modemenu a:hover {
-color: #ffffff;
-background-color: #FFCB05;
-}
-
-.mainmenu div.preactive > a {
-       color: #DC0067;
-       font-weight: bold;
-}
-.mainmenu div.preactive > a:hover,
-.mainmenu div.preactive > a:focus {
-       color: #ffffff;
-       font-weight: bold;
-}
-
-.modemenu ul {
-       width: auto;
-       background: #000000;
-       color: #ffffff;
-       list-style-type: none;
-}
-
-.modemenu li {
-       float: right;
-
-}
-
-#maincontent {
-       clear: both;
-       width: 98%;
-       margin: 0 auto;
-       padding: 0.5em;
-       background: #FFF4BE;
-       color: #000000;
-       font-size: 80%;
-       border-top:1px solid #D2A800;
-}
-
-#maincontent h2 {
-       margin: 0.25em 0 0.5em 0;
-       font-size: 150%;
-       font-weight: normal;
-}
-
-#maincontent h3 {
-       margin: 0.5em 0;
-       font-size: 120%;
-       font-weight: normal;
-       text-decoration: underline;
-}
-
-#maincontent p {
-       margin-bottom: 1em;
-}
-
-.cbi-section {
-       margin-bottom: 0.5em;
-       padding: 0.5em 1em;
-       border: 1px dotted #D2A800;
-       background-color: #FFE990;
-}
-
-.cbi-section legend {
-       font-size: 110%;
-       font-weight: bold;
-       height: 1em;
-       padding: 0 0.25em;
-       color: #555555;
-}
-
-.cbi-section h2 {
-       margin: 0em 0 0.5em -0.5em !important;
-}
-
-.cbi-section h3 {
-       height: 1.5em;
-       font-size: 90%;
-       color: #555555;
-}
-
-.cbi-section-descr {
-       margin-bottom: 0.5em;
-       font-size: 95%;
-}
-
-.cbi-title-ref {
-       color: inherit;
-       text-decoration: none;
-       padding-right: 18px;
-       background: url('../resources/cbi/link.gif') no-repeat scroll right center;
-       background-color: inherit;
-}
-
-input[type=submit],
-input[type=reset],
-input[type=image],
-label {
-       cursor: pointer;
-}
-
-select,
-input,
-textarea {
-       background: #FffdF4;
-       color: #000000;
-       border-width: 1px;
-       border-color: #000000;
-}
-
-input[type=image] {
-       border: none;
-}
-
-
-input:focus,
-input:hover,
-select:focus,
-select:hover,
-textarea:focus,
-textarea:hover {
-       background-color: #FFF4BE;
-}
-
-select,
-input[type=text],
-input[type=password] {
-       width: 20em;
-}
-
-td select,
-td input[type=text],
-td input[type=password] {
-       width: 99%;
-}
-
-img.cbi-image-button {
-       cursor: pointer;
-       margin: 0 2px;
-       vertical-align: middle;
-}
-
-input.cbi-input-user {
-       background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-}
-
-input.cbi-input-password {
-       background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-}
-
-input.cbi-input-find {
-       background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-}
-
-input.cbi-input-reload {
-       background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-}
-
-input.cbi-input-add,
-input.cbi-button-add {
-       background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
-       background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-reset,
-input.cbi-button-reset {
-       background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-save,
-input.cbi-button-save {
-       background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-apply,
-input.cbi-button-apply {
-       background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-remove,
-div.cbi-section-remove input {
-       background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-button-up {
-       background-image: url('../resources/cbi/up.gif');
-       padding-left: 11px;
-       padding-right: 1px;
-}
-
-input.cbi-button-down {
-       background-image: url('../resources/cbi/down.gif');
-       padding-left: 11px;
-       padding-right: 1px;
-}
-
-input.cbi-button-edit {
-       background-image: url('../resources/cbi/edit.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-button-reload {
-       background-image: url('../resources/cbi/reload.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-button-reset {
-       background-image: url('../resources/cbi/reset.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-button-remove {
-       background-image: url('../resources/cbi/remove.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-.cbi-input-invalid {
-       background-image: url('../resources/cbi/reset.gif');
-       background-repeat: no-repeat;
-       background-position: right;
-       color: #FF0000 !important;
-       border-color: #FF0000;
-}
-
-div.cbi-section-remove input {
-       border-bottom: none;
-}
-
-textarea {
-       margin-left: -1px;
-       margin-bottom: 0.5em;
-}
-
-form > div > input[type=submit],
-form > div > input[type=reset] {
-       float: right;
-       margin-left: 0.5em;
-}
-
-table.smalltext {
-background-color: #FFCB05;
-       border-top: 1px solid #666666;
-       border-right: 1px solid #666666;
-       border-bottom: 1px solid #666666;
-       font-size: 90%;
-       width: 80%;
-       margin-left: auto;
-       margin-right: auto;
-       border-collapse: collapse;
-}
-
-table.smalltext tr:hover td {
-background-color: #FFE990;
-}
-
-table.smalltext tr th {
-       padding: 0 0.25em;
-       border-left: 1px solid #666666;
-       text-align: left;
-}
-
-table.smalltext tr td {
-       padding: 0 0.25em;
-       border-top: 1px solid #666666;
-       border-left: 1px solid #666666;
-}
-
-.cbi-rowstyle-1 {
-       background-color: #FFF4BE;
-}
-
-.cbi-rowstyle-2 {
-}
-
-table.cbi-section-table .cbi-section-table-cell {
-       padding: 3px;
-       white-space: nowrap;
-}
-
-div.cbi-value {
-       clear: left;
-       vertical-align: middle;
-       padding-left: 0.25em;
-       border-bottom: 1px dotted #FFCB05;
-}
-
-div.cbi-value:hover {
-       background: #FFF4BE;
-}
-
-div.cbi-value:last-child {
-       border: none;
-}
-
-.cbi-value-title {
-       float: left;
-       width: 40%;
-}
-
-div.cbi-value-field {
-       width: 58%;
-       margin: 0.25em 0 0.25em 40%;
-}
-
-div.cbi-value-description {
-       font-size: 90%;
-}
-
-div.cbi-value-field > div.cbi-value-description {
-       display: none;
-}
-
-div.cbi-value:hover div.cbi-value-field > div.cbi-value-description {
-       display: block;
-       color: #ffffff;
-       background-color: #FFCB05;
-}
-
-option:active,
-option:before,
-option:after,
-option:focus,
-option:hover {
-       color: #ffffff;
-       background-color: #EEBA00;
-       background: url(images/bgoption.png);
-}
-
-div.cbi-section-create {
-       clear: left;
-       white-space: nowrap;
-}
-
-div.cbi-map-descr {
-       margin-bottom: 1em;
-}
-
-div.cbi-optionals {
-       margin: 0.5em 0;
-       padding: 0 0.25em;
-}
-
-div.cbi-section-remove {
-       float: right;
-}
-
-.cbi-section-node {
-       clear: both;
-       border: 1px dotted #FFCB05;
-       padding-bottom: 0;
-}
-
-.cbi-section-node div.cbi-section-table-row {
-       margin: 0.25em;
-}
-
-table.cbi-section-table {
-       width: 100%;
-       font-size: 95%;
-}
-
-table.cbi-section-table th,
-table.cbi-section-table td {
-       text-align: center;
-}
-
-tr.cbi-section-table-descr th {
-       font-weight: normal;
-       font-size: 90%;
-}
-
-td.cbi-section-table-optionals {
-       text-align: left !important;
-       padding-top: 1em;
-}
-
-.cbi-value-helpicon img {
-       vertical-align: bottom;
-}
-
-div.cbi-error {
-       font-size: 95%;
-       font-weight: bold;
-       color: #FF0000;
-}
-
-td.cbi-value-error {
-       border-color: red !important;
-}
-
-.cbi-value-error input,
-.cbi-value-error select {
-       color: red !important;
-       background-color: #FFCCCC;
-}
-
-.cbi-section-error {
-       color: red;
-       font-size: 95%;
-       border: 1px dotted red;
-       margin: 3px;
-       padding: 3px;
-}
-
-ul.cbi-apply {
-       font-size: 90%;
-}
-
-ul.cbi-tabmenu {
-       padding: 3px 0;
-       margin-left: 0 !important;
-       margin-bottom: -1px;
-       list-style-type: none;
-}
-
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
-       display: inline;
-       margin: 0;
-}
-
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
-       text-decoration: none;
-       padding: 3px 7px;
-       margin-right: 3px;
-       border: 1px outset #000;
-       border-bottom: none;
-       background-color: #eee;
-       color: #bbb;
-}
-
-ul.cbi-tabmenu li.cbi-tab-highlighted a {
-       color: #000;
-       background-color: #FFEEAA;
-}
-
-ul.cbi-tabmenu li a:hover {
-       color: #000;
-}
-
-ul.cbi-tabmenu li.cbi-tab a {
-       position: relative;
-       top: 1px;
-       padding-top: 4px;
-       color: #000;
-       background-color: #fff;
-}
-
-div.cbi-tab-descr {
-       background-image: url(/luci-static/resources/cbi/help.gif);
-       background-position: 0.25em 50%;
-       background-repeat: no-repeat;
-       border-bottom: 1px solid #ccc;
-       margin: 0.25em 0.25em 2em;
-       padding: 0.5em 0.5em 0.5em 2em;
-}
-
-
-.left {
-       text-align: left !important;
-}
-
-.right {
-       text-align: right !important;
-}
-
-.luci {
-       position: fixed;
-       bottom: 0;
-       left: 0;
-       text-align: right;
-}
-
-.luci a {
-       color: #666666;
-       text-decoration: none;
-       font-size: 70%;
-}
-
-.inline {
-       display: inline;
-}
-
-.error500 {
-       white-space: normal;
-       border: 1px dotted #FF0000;
-       background-color: #FFFFFF;
-       padding: 0.5em;
-}
-
-/* obligatory IE6 Voodoo Code */
-* html body {
-       padding-left: 50% !important;
-}
-
-* html div#header {
-       margin-left: -100% !important;
-}
-
-* html div.menubar {
-       margin-left: -100% !important;
-       width: 200% !important;
-}
-
-* html div#maincontent {
-       margin-left: -80% !important;
-       width: 160% !important;
-}
-
-* html div.mainmenu div.hover ul,
-* html div.mainmenu div li.hover ul,
-* html div.mainmenu div li li.hover ul,
-* html div.mainmenu div li li li.hover ul,
-* html div.mainmenu div li li li li.hover ul {
-       display: block !important;
-       margin-left: 3em;
-}
-
-* html div.mainmenu div.hover ul {
-       margin-left: 0;
-}
-
-* html div.mainmenu .hover ul ul,
-* html div.mainmenu .hover ul ul ul,
-* html div.mainmenu .hover ul ul ul ul,
-* html div.mainmenu .hover ul ul ul ul ul {
-       display: none !important;
-}
-
-* html div.mainmenu li {
-       height: 1em !important;
-       width: 10em !important;
-}
-
-* html .mainmenu {
-       height: 1.8em;
-}
-
-* html div.cbi-value-description {
-       margin-left: 40%;
-}
-
-
-.ifacebox {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
-       margin: 0 10px;
-       text-align: center;
-       white-space: nowrap;
-}
-
-.ifacebox .ifacebox-head {
-       border-bottom: 1px solid #CCCCCC;
-       padding: 2px;
-}
-
-.ifacebox .ifacebox-body {
-       padding: 2px;
-}
-
-
-.ifacebadge {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
-       padding: 2px;
-       margin-left: 2px;
-       display: inline-block;
-}
-
-.ifacebadge-active {
-       border-color: #000000;
-       font-weight: bold;
-}
-
-
-.zonebadge {
-       padding: 2px;
-       display: inline-block;
-       white-space: nowrap;
-       cursor: pointer;
-}
-
-.zonebadge em,
-.zonebadge strong {
-       margin: 3px;
-       display: inline-block;
-}
-
-.zonebadge input {
-       width: 6em;
-       height: 1.5em;
-}
-
-.zonebadge-empty {
-       border: 1px dashed #AAAAAA;
-       color: #AAAAAA;
-       font-style: italic;
-       font-size: smaller;
-}
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png
deleted file mode 100644 (file)
index 6fd1e2f..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico
deleted file mode 100644 (file)
index 7247cfa..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif
deleted file mode 100644 (file)
index 21fe02b..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif
deleted file mode 100644 (file)
index a3258cc..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-right.gif b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-right.gif
deleted file mode 100644 (file)
index 93d0291..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-right.gif and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif
deleted file mode 100644 (file)
index ff00d6d..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png
deleted file mode 100644 (file)
index 34aca44..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/schriftzug.gif b/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/schriftzug.gif
deleted file mode 100644 (file)
index 82607d5..0000000
Binary files a/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/schriftzug.gif and /dev/null differ
diff --git a/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/footer.htm b/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/footer.htm
deleted file mode 100644 (file)
index 2dbade3..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-               <br class="clear" />
-       </div>
-</div></div>
-</div>
-
-<div class="luci separator black whitetext bold">
-       <% local ver = require "luci.version" -%>
-       <a href="<%=controller%>/about">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a>
-</div>
-</div><!-- end main --><div align="center" style="padding-top:5px "></div>
-<br>
-</div><!-- end wrapper -->
-
-</center>
-</div>
-
-</body>
-</html>
diff --git a/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm b/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm
deleted file mode 100644 (file)
index d108a08..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
-require("luci.sys")
-require("luci.util")
-
-local boardinfo = luci.util.ubus("system", "board")
-
-local request  = require("luci.dispatcher").context.path
-local category = request[1]
-local tree     = luci.dispatcher.node()
-local cattree  = category and luci.dispatcher.node(category)
-local node     = luci.dispatcher.context.dispatched
-
-local c = tree
-for i,r in ipairs(request) do
-       if c.nodes and c.nodes[r] then
-               c = c.nodes[r]
-               c._menu_selected = true
-       end
-end
-
-require("luci.http").prepare_content("text/html")
-
--%>
-
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-       <link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
-       <% if node and node.css then %><link rel="stylesheet" type="text/css" href="<%=resource%>/<%=node.css%>" /><% end %>
-       <% if css then %><style title="text/css">
-       <%-= css %>
-       </style>
-       <% end -%>
-       <link rel="shortcut icon" href="<%=media%>/images/favicon.ico" />
-       <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
-       <meta http-equiv="content-script-type" content="text/javascript" />
-       <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
-       <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-
-       <!--[if lt IE 7]>
-               <script type="text/javascript">
-                       function setup_hover() {
-                               function ie_hover(e) {
-                                       e.onmouseover = function() { this.className = "hover" }
-                                       e.onmouseout  = function() { this.className = null    }
-                               }
-
-                               var lis  = document.getElementById("mainmenu").getElementsByTagName("LI");
-                               var divs = document.getElementById("mainmenu").getElementsByTagName("DIV");
-
-                               for( var i = 0; i < lis.length;  i++ ) ie_hover( lis[i]  );
-                               for( var i = 0; i < divs.length; i++ ) ie_hover( divs[i] );
-                       }
-               </script>
-       <![endif]-->
-</head>
-<body onload="window.setup_hover && setup_hover()">
-<div id="all">
-<center>
-
-<div id="wrapper">
-<%- if luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
-       <div class="warning">
-               <strong><%:No password set!%></strong><br />
-               <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
-       </div>
-<%- end -%>
-<div id="main">
-
-
-<div id="header">
-       <div id="headerleft">
-               <div id="headerright">
-                       <div id="headerback">
-       <div id="schriftzug"><img src="<%=media%>/images/schriftzug.gif" alt="Freifunk Nordost ueberschrift" name="Freifunk_nordost_ueberschrift" border="0"> </div>
-       <div id="logo"><img src="<%=media%>/images/logo.gif" alt="Freifunk Nordost logo" name="Freifunk_nordost" border="0"></a></div>
-       <div class="clear"></div>
-
-                       </div>
-               </div>
-       </div>
-</div>
-
-<div class="pathbar separator black whitetext bold">
-<%:Path%>: <%
-local c = tree
-local url = controller
-for k,v in pairs(request) do
-       if c.nodes and c.nodes[v] then
-               c = c.nodes[v]
-               url = url .. "/" .. v
-       %><a href="<%=url%>"><%=pcdata(striptags(translate(c.title) or v))%></a> <% if k ~= #request then %>&#187; <% end
-       end
-end
-%>
-</div>
-
-<div class="menubar">
-       <div id="mainmenu" class="mainmenu">
-<%-
-local function submenu(prefix, node)
-       if not node.nodes or node.hidden then
-               return false
-       end
-       local index = {}
-       local count = 0
-       for k, n in pairs(node.nodes) do
-               if n.title and n.target then
-                       table.insert(index, {name=k, order=n.order or 100})
-                       count = count + 1
-               end
-       end
-
-       table.sort(index, function(a, b) return a.order < b.order end)
-
-       if count > 0 then
-%>
-       <ul>
-       <%- for j, v in pairs(index) do
-               if not v.hidden and #v.name > 0 then
-                       local nnode = node.nodes[v.name]
-                       local href = controller .. prefix .. v.name
-                       href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
-               %>
-               <li>
-                       <span<% if nnode._menu_selected then %> class="active"<%end%>><a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></span>
-                       <%- submenu(prefix .. v.name .. "/", nnode) %>
-               </li>
-               <%- end %>
-       <%- end %>
-       </ul>
-<%-
-       end
-end
-
-if cattree and cattree.nodes then
-       local index = {}
-       for k, node in pairs(cattree.nodes) do
-               table.insert(index, {name=k, order=node.order or 100})
-       end
-
-       table.sort(index, function(a, b) return a.order < b.order end)
-
-       for i, k in ipairs(index) do
-               node = cattree.nodes[k.name]
-               if not node.hidden and node.title and node.target then
-                       local href = controller.."/"..category.."/"..k.name
-                       href = (k.query) and href .. luci.http.build_querystring(k.query) or href %>
-                       <div<% if node._menu_selected then %> class="preactive"<%end%>><a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(node.title)))%></a>
-                               <%submenu("/" .. category .. "/" .. k.name .. "/", node)%>
-                       </div>
-<%             end
-       end
-end
-%>
-       </div>
-       <div class="modemenu">
-               <ul><%
-                       for k,node in pairs(tree.nodes) do
-                               if node.title and not node.hidden then %>
-                                       <li<% if request[1] == k then %> class="active"<%end%>><a href="<%=controller%>/<%=k%>"><%=pcdata(striptags(translate(node.title)))%></a></li>
-<%                             end
-                       end%>
-               </ul>
-       </div>
-
-       <%
-               if tree.nodes[category] and tree.nodes[category].ucidata then
-                       local ucic = 0
-
-                       for i, j in pairs(require("luci.model.uci").cursor():changes()) do
-                               for k, l in pairs(j) do
-                                       for m, n in pairs(l) do
-                                               ucic = ucic + 1;
-                                       end
-                               end
-                       end
-       %>
-       <div class="mainmenu" style="float:right; margin-right:2em">
-               <div>
-                       <% if ucic > 0 then %>
-                       <a class="warning" href="<%=controller%>/<%=category%>/uci/changes"><%:Unsaved Changes%>: <%=ucic%></a>
-                       <% submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"]) -%>
-                       <% else %>
-                       <a href="#"><%:Changes%>: 0</a>
-                       <% end %>
-               </div>
-       </div>
-       <% end %>
-
-       <br class="clear" />
-</div>
-
-<div id="maincontent">
-<% if category ~= "freifunk" and category ~= "splash" then %>
-<noscript>
-       <div class="errorbox">
-               <strong><%:Java Script required!%></strong><br />
-               <%:You must enable Java Script in your browser or LuCI will not work properly.%>
-       </div>
-</noscript>
-<% end %>
diff --git a/themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno b/themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno
deleted file mode 100755 (executable)
index a19f2bb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-uci batch <<-EOF
-       set luci.themes.Freifunk_BNO=/luci-static/freifunk-bno
-       set luci.main.mediaurlbase=/luci-static/freifunk-bno
-        commit luci
-EOF
diff --git a/themes/luci-theme-material/Makefile b/themes/luci-theme-material/Makefile
new file mode 100755 (executable)
index 0000000..5bc16eb
--- /dev/null
@@ -0,0 +1,14 @@
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Material Theme
+LUCI_DEPENDS:=
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/css/style.css b/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
new file mode 100755 (executable)
index 0000000..d4feb36
--- /dev/null
@@ -0,0 +1,1504 @@
+/**
+ *  Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+ *
+ *  luci-theme-material
+ *      Copyright 2015 Lutty Yang <lutty@wcan.in>
+ *
+ *  Have a bug? Please create an issue here on GitHub!
+ *      https://github.com/LuttyYang/luci-theme-material/issues
+ *
+ *  luci-theme-bootstrap:
+ *      Copyright 2008 Steven Barth <steven@midlink.org>
+ *      Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ *      Copyright 2012 David Menting <david@nut-bolt.nl>
+ *
+ *  MUI:
+ *      https://github.com/muicss/mui
+ *
+ *  Licensed to the public under the Apache License 2.0
+ */
+
+/*
+ *  Font generate by Icomoon<icomoon.io>
+ */
+@font-face {
+    font-family: 'icomoon';
+    src: url('../fonts/font.eot');
+    src: url('../fonts/font.eot') format('embedded-opentype'),
+    url('../fonts/font.ttf') format('truetype'),
+    url('../fonts/font.woff') format('woff'),
+    url('../fonts/font.svg') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+.cbi-button-up,
+.cbi-button-down,
+.cbi-value-helpicon,
+.showSide,
+.main > .loading > span {
+    font-family: 'icomoon' !important;
+    speak: none;
+    font-style: normal !important;
+    font-weight: normal !important;
+    font-variant: normal !important;
+    text-transform: none !important;
+    line-height: 1;
+
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+    font-family: inherit;
+    font-weight: 500;
+    line-height: 1.1;
+    color: inherit;
+}
+
+html {
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+}
+
+html, body {
+    margin: 0px;
+    padding: 0px;
+    height: 100%;
+    font-family: "Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;
+}
+
+select {
+    padding: 0.36rem 0.8rem;
+    color: #555;
+    background-color: #fff;
+    background-image: none;
+    border: 1px solid #ccc;
+}
+
+select,
+input {
+    background-color: transparent;
+    color: rgba(0, 0, 0, .87);
+    border: none;
+    border-bottom: 1px solid rgba(0, 0, 0, .26);
+    outline: 0;
+    padding: 0;
+    box-shadow: none;
+    border-radius: 0;
+    background-image: none;
+    height: 2rem;
+    font-size: 1.1rem;
+}
+
+select:not([multiple="multiple"]):focus,
+input:focus {
+    height: 2rem;
+    height: calc(2rem + 1px);
+    margin-bottom: -1px;
+    border-color: #0099CC;
+    border-width: 2px;
+}
+
+select[multiple="multiple"] {
+    height: auto;
+}
+
+code {
+    color: #0099CC;
+}
+
+abbr {
+    color: #005470;
+    text-decoration: underline;
+    cursor: help;
+}
+
+hr{
+    margin: 1rem 0;
+    border-color: #EEE;
+    opacity: 0.1;
+}
+
+header, .main {
+    width: 100%;
+    position: absolute;
+}
+
+header {
+    height: 4rem;
+    box-shadow: 0 2px 5px rgba(0, 0, 0, .26);
+    transition: box-shadow .2s;
+    float: left;
+    position: fixed;
+    z-index: 101;
+}
+
+footer {
+    text-align: right;
+    padding: 1rem;
+    color: #aaa;
+    font-size: 0.8rem;
+    text-shadow: 0px 0px 2px #BBB;
+}
+
+footer > a {
+    color: #aaa;
+    text-decoration: none;
+}
+
+.main {
+    top: 4rem;
+    bottom: 0rem;
+    position: relative;
+    height: 100%;
+    height: calc(100% - 4rem);
+}
+
+.main > .loading {
+    position: fixed;
+    width: 100%;
+    height: 100%;
+    z-index: 1000;
+    display: block;
+    background-color: rgb(240, 240, 240);
+    top: 0;
+}
+
+.main > .loading > span {
+    display: block;
+    text-align: center;
+    margin-top: 2rem;
+    color: #888;
+    font-size: 1.3rem;
+}
+
+.main > .loading > span > .loading-img:before {
+    content: "\e603";
+}
+
+.main > .loading > span > .loading-img {
+    animation: anim-rotate 2s infinite linear;
+    margin-right: 0.2rem;
+    display: inline-block;
+}
+
+@keyframes anim-rotate {
+    0% {
+        -webkit-transform: rotate(0);
+        -ms-transform: rotate(0);
+        transform: rotate(0);
+    }
+    100% {
+        -webkit-transform: rotate(360deg);
+        -ms-transform: rotate(360deg);
+        transform: rotate(360deg)
+    }
+}
+
+.main-left {
+    float: left;
+    top: 4rem;
+    width: 15%;
+    width: calc(0% + 17rem);
+    height: 100%;
+    height: calc(100% - 4rem);
+    background-color: white;
+
+    overflow-x: auto;
+    position: fixed;
+}
+
+.main-right {
+    width: 85%;
+    width: calc(100% - 17rem);
+    float: right;
+    height: 100%;
+    background-color: #EEE;
+}
+
+.main-right > #maincontent {
+    background-color: #EEE;
+}
+
+.pull-right {
+    float: right;
+}
+
+.pull-left {
+    float: left;
+}
+
+header {
+    background: #0099CC;
+    color: white;
+}
+
+header > .container {
+    margin-top: 0.5rem;
+    padding: 0.5rem 1rem 0 1rem;
+}
+
+header > .container > .brand {
+    font-size: 1.5rem;
+    color: white;
+    text-decoration: none;
+    cursor: default;
+    vertical-align: text-bottom;
+}
+
+.warning {
+    background-color: #FF7D60 !important;
+    color: #FFF;
+}
+
+.errorbox,
+.alert-message {
+    margin: 2rem 0 0 0;
+    padding: 2rem;
+    border: 0;
+    font-weight: normal;
+    font-style: normal;
+    line-height: 1;
+    font-family: inherit;
+    min-width: inherit;
+    overflow: auto;
+    border-radius: 0;
+    background-color: #FFF;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+.errorbox {
+    color: #fff;
+    background-color: #f0ad4e;
+    border-color: #eea236;
+}
+
+.error {
+    color: red;
+}
+
+#maincontent > .container > div:nth-child(1).alert-message.warning > a {
+    font: inherit;
+    overflow: visible;
+    text-transform: none;
+    display: inline-block;
+    margin-bottom: 0;
+    font-weight: 400;
+    text-align: center;
+    white-space: nowrap;
+    vertical-align: middle;
+    touch-action: manipulation;
+    cursor: pointer;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    background-image: none;
+    min-width: 6rem;
+    padding: 0.5rem 1rem;
+    font-size: 1.1rem;
+    line-height: 1.42857143;
+    color: #fff;
+    background-color: #5bc0de;
+    border-color: #46b8da;
+    margin-top: 2rem;
+    text-decoration: inherit;
+}
+
+.main > .main-left > .nav {
+    margin-top: 0.5rem;
+}
+
+.main > .main-left > .nav > li a {
+    color: #404040;
+    display: block;
+}
+
+.main > .main-left > .nav > li:nth-last-child(1) {
+    margin-top: 2rem;
+    font-size: 1.2rem;
+}
+
+.main > .main-left > .nav > li {
+    padding: 0.5rem 1rem;
+    cursor: pointer;
+}
+
+.main > .main-left > .nav > .slide {
+    padding: 0;
+}
+
+.main > .main-left > .nav > .slide > ul {
+    display: none;
+}
+
+.main > .main-left > .nav > .slide > .menu {
+    display: block;
+    padding: 0.5rem 1rem;
+    text-decoration: none;
+    cursor: default;
+    font-size: 1.2rem;
+}
+
+.main > .main-left > .nav > li:hover,
+.main > .main-left > .nav > .slide > .menu:hover {
+    background: #D4D4D4;
+}
+
+.main > .main-left > .nav > .slide:hover {
+    background: none;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li {
+    padding: 0.4rem 2rem;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active {
+    background-color: #0099CC;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li > a {
+    text-decoration: none;
+    white-space: nowrap;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active > a {
+    color: white;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li:hover {
+    background: #D4D4D4;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active:hover {
+    background-color: #0099CC;
+    cursor: hand;
+}
+
+li {
+    list-style-type: none;
+}
+
+#maincontent > .container {
+    margin: 0 2rem 1rem 2rem;
+}
+
+h1 {
+    font-size: 4rem;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #eee;
+}
+
+h2 {
+    margin: 2rem 0 0 0;
+    font-size: 2.5rem;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #eee;
+}
+
+h3 {
+    margin: 2rem 0 0 0;
+    font-size: 2rem;
+    padding-bottom: 10px;
+}
+
+h4 {
+
+}
+
+fieldset {
+    margin: 2rem 0 0 0;
+    padding: 2rem;
+    border: 0;
+    font-weight: normal;
+    font-style: normal;
+    line-height: 1;
+    font-family: inherit;
+
+    min-width: inherit;
+    overflow-x: auto;
+    overflow-y: hidden;
+
+    border-radius: 0;
+    background-color: #FFF;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+
+    -webkit-overflow-scrolling: touch;
+}
+
+fieldset > legend {
+    display: none !important;
+}
+
+fieldset > fieldset {
+    margin: 0;
+    padding: 0;
+    border: none;
+    box-shadow: none;
+}
+
+.panel-title {
+    width: 100%;
+    display: block;
+    line-height: 1;
+    color: #404040;
+    font-size: 1.9rem;
+    padding-bottom: 2rem;
+    border-bottom: 1px solid #eee;
+}
+
+table {
+    border-spacing: 0;
+    border-collapse: collapse;
+    width: 100%;
+    border: 1px solid #eee;
+}
+
+table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th {
+    padding: 8px;
+    line-height: 1.42857143;
+    border-top: 1px solid #ddd;
+
+    white-space: nowrap;
+}
+
+.cbi-section-table-cell {
+    text-align: center;
+}
+
+.cbi-section-table-row {
+    text-align: center;
+}
+
+fieldset > table > tbody > tr:nth-of-type(odd) {
+    background-color: #f9f9f9;
+}
+
+/* fix progress bar */
+#swaptotal > div,
+#swapfree > div,
+#memfree > div,
+#membuff > div,
+#conns > div,
+#memtotal > div {
+    width: 100% !important;
+    height: 1.4rem !important;
+}
+
+#swaptotal > div > div,
+#swapfree > div > div,
+#memfree > div > div,
+#membuff > div > div,
+#conns > div > div,
+#memtotal > div > div {
+    height: 1.4rem !important;
+    background-color: #0099CC !important;
+}
+
+/* fix multiple table */
+
+table table {
+    border: none;
+}
+
+.cbi-value-field table {
+    border: none;
+}
+
+td > table > tbody > tr > td {
+    border: none;
+}
+
+.cbi-value-field > table > tbody > tr > td {
+    border: none;
+}
+
+/* button style */
+
+.cbi-button {
+    -webkit-appearance: none;
+    text-transform: uppercase;
+    color: rgba(0, 0, 0, 0.87);
+    background-color: #F0F0F0;
+    transition: all 0.2s ease-in-out;
+    display: inline-block;
+    padding: 0.5rem 1rem;
+    border: none;
+    border-radius: 0.2rem;
+    cursor: pointer;
+    -ms-touch-action: manipulation;
+    touch-action: manipulation;
+    background-image: none;
+    text-align: center;
+    vertical-align: middle;
+    white-space: nowrap;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    font-size: 1rem;
+    width: auto !important;
+}
+
+.cbi-button:hover,
+.cbi-button:focus,
+.cbi-button:active {
+    color: rgba(0, 0, 0, 0.87);
+    outline: 0;
+    text-decoration: none;
+    color: rgba(0, 0, 0, 0.87);
+}
+
+.cbi-button:hover,
+.cbi-button:focus {
+    box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2);
+}
+
+.cbi-button:active {
+    box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
+}
+
+.cbi-button:disabled {
+    cursor: not-allowed;
+    pointer-events: none;
+    opacity: 0.60;
+    box-shadow: none;
+}
+
+form.inline + form.inline,
+.cbi-button + .cbi-button {
+    margin-left: 0.6rem;
+}
+
+.cbi-button-reset,
+.cbi-input-remove {
+    color: #fff !important;
+    background-color: #f0ad4e !important;
+    border-color: #eea236 !important;
+}
+
+.cbi-input-find,
+.cbi-input-save,
+.cbi-button-add,
+.cbi-button-save,
+.cbi-button-find,
+.cbi-input-reload,
+.cbi-button-reload {
+    color: #fff !important;
+    background-color: #337ab7 !important;
+    border-color: #2e6da4 !important;
+}
+
+.cbi-input-apply,
+.cbi-button-apply,
+.cbi-button-edit {
+    color: #fff !important;
+    background-color: #5bc0de !important;
+    border-color: #46b8da !important;
+}
+
+.cbi-input-reset,
+.cbi-button-remove {
+    color: #fff !important;
+    background-color: #d9534f !important;
+    border-color: #d43f3a !important;
+}
+
+.a-to-btn {
+    text-decoration: none;
+}
+
+/* table */
+
+.tabs {
+    margin: 0 -2rem;
+    padding-left: 0.5rem;
+    background-color: #FFFFFF;
+}
+
+.cbi-tabmenu > li,
+.tabs > li {
+    display: inline-block;
+    padding: 0.9rem 0rem;
+}
+
+.cbi-tabmenu > li > a,
+.tabs > li > a {
+    text-decoration: none;
+    color: #404040;
+    padding: 0.9rem 1.5rem;
+}
+
+.tabs > li[class~="active"],
+.tabs > li:hover {
+    cursor: pointer;
+    border-bottom: 0.2rem solid #0099CC;
+    color: #0099CC;
+    margin-bottom: -0.18751rem;
+}
+
+.tabs > li[class~="active"] > a {
+    color: #0099cc;
+}
+
+.tabs > li:hover {
+    border-bottom: 0.18751rem solid #C9C9C9;
+}
+
+.cbi-tabmenu {
+    border-top: 1px solid #D4D4D4;
+    border-left: 1px solid #D4D4D4;
+    border-right: 1px solid #D4D4D4;
+}
+
+.cbi-tabmenu > li:hover {
+    background-color: #F1F1F1;
+}
+
+.cbi-tabmenu > li[class~="cbi-tab"] {
+    background-color: white;
+}
+
+.cbi-tabmenu {
+    background-color: #D4D4D4;
+}
+
+.cbi-section-node-tabbed {
+    padding: 0;
+    margin-top: 0;
+    border-bottom: 1px solid #D4D4D4;
+    border-left: 1px solid #D4D4D4;
+    border-right: 1px solid #D4D4D4;
+}
+
+.cbi-tabcontainer > .cbi-value:nth-of-type(2n) {
+    background-color: #f9f9f9;
+}
+
+.cbi-value-field,
+.cbi-value-description {
+    display: table-cell;
+}
+
+.cbi-value-helpicon > img {
+    display: none;
+}
+
+.cbi-value-helpicon:before {
+    content: "\f059";
+}
+
+.cbi-value-description {
+    font-size: small;
+    opacity: 0.5;
+    padding: 0.5rem 0 0 0;
+}
+
+.cbi-value-title {
+    word-wrap: break-word;
+    padding-top: 0.6rem;
+    width: 23rem;
+    float: left;
+    text-align: right;
+    padding-right: 2rem;
+    display: table-cell;
+}
+
+.cbi-value {
+    padding: 1rem;
+    display: inline-block;
+    width: 100%;
+}
+
+.cbi-section-table-descr > .cbi-section-table-cell,
+.cbi-section-table-titles > .cbi-section-table-cell {
+    border: none;
+}
+
+.cbi-rowstyle-2 {
+    background-color: #eee;
+}
+
+.cbi-rowstyle-2 .cbi-button-up,
+.cbi-rowstyle-2 .cbi-button-down{
+    background-color: #FFF !important;
+}
+
+.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell {
+    width: auto !important;
+}
+
+/* desc */
+.cbi-section-descr,
+.cbi-map-descr {
+    padding: 0.5rem;
+    color: #999;
+    font-size: small;
+}
+
+/* luci */
+
+.hidden {
+    display: none
+}
+
+.left {
+    text-align: left !important;
+}
+
+.right {
+    text-align: right !important;
+}
+
+.inline {
+    display: inline;
+}
+
+.cbi-page-actions {
+    border-top: 1px solid #eee;
+    padding-top: 2rem;
+    text-align: right;
+}
+
+/* input */
+.cbi-value input[type="password"],
+.cbi-value input[type="text"] {
+    min-width: 15rem;
+}
+
+/* select */
+.cbi-value-field .cbi-input-select {
+    min-width: 15rem;
+}
+
+.ifacebadge {
+    display: inline-flex;
+    border-bottom: 1px solid #CCCCCC;
+    padding: 0.5rem 1rem;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.ifacebadge > img {
+    float: right;
+    margin-left: 0.3rem;
+}
+
+/*textarea*/
+
+.cbi-input-textarea {
+    width: 100%;
+    min-height: 16rem;
+    padding: 1rem;
+    font-size: 0.9rem;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    color: black;
+}
+
+#syslog {
+    width: 100%;
+    min-height: 15rem;
+    padding: 1rem;
+    font-size: small;
+    color: #5F5F5F;
+
+    margin-bottom: 20px;
+    border-radius: 0;
+    background-color: #FFF;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+    border: none;
+}
+
+/* change */
+
+.uci-change-list {
+    font-family: monospace;
+}
+
+.uci-change-list ins,
+.uci-change-legend-label ins {
+    text-decoration: none;
+    border: 1px solid #00FF00;
+    background-color: #CCFFCC;
+    display: block;
+    padding: 2px;
+}
+
+.uci-change-list del,
+.uci-change-legend-label del {
+    text-decoration: none;
+    border: 1px solid #FF0000;
+    background-color: #FFCCCC;
+    display: block;
+    font-style: normal;
+    padding: 2px;
+}
+
+.uci-change-list var,
+.uci-change-legend-label var {
+    text-decoration: none;
+    border: 1px solid #CCCCCC;
+    background-color: #EEEEEE;
+    display: block;
+    font-style: normal;
+    padding: 2px;
+}
+
+.uci-change-list var ins,
+.uci-change-list var del {
+    border: none;
+    white-space: pre;
+    font-style: normal;
+    padding: 0px;
+}
+
+.uci-change-legend {
+    padding: 5px;
+}
+
+.uci-change-legend-label {
+    width: 150px;
+    float: left;
+}
+
+.uci-change-legend-label > ins,
+.uci-change-legend-label > del,
+.uci-change-legend-label > var {
+    float: left;
+    margin-right: 4px;
+    width: 10px;
+    height: 10px;
+    display: block;
+}
+
+.uci-change-legend-label var ins,
+.uci-change-legend-label var del {
+    line-height: 6px;
+    border: none;
+}
+
+.uci-change-list var,
+.uci-change-list del,
+.uci-change-list ins {
+    padding: 0.5rem;
+}
+
+/* other fix */
+#iwsvg,
+#iwsvg2,
+#bwsvg {
+    border: 1px solid #D4D4D4 !important;
+    border-top: none !important;
+}
+
+.ifacebox {
+    border: 1px solid #999;
+    background-color: #f9f9f9;
+}
+
+.cbi-image-button {
+    margin-left: 0.5rem;
+}
+
+.zonebadge {
+    padding: 0.2rem 0.5rem;
+    display: inline-block;
+    cursor: pointer;
+}
+
+.zonebadge > .ifacebadge {
+    padding: 0.2rem 1rem;
+    margin: 0.3rem;
+    border: 1px solid #6C6C6C;
+}
+
+.zonebadge > input[type="text"] {
+    padding: 0.16rem 1rem;
+    min-width: 10rem;
+    margin-top: 0.3rem;
+}
+
+.cbi-value-field .cbi-input-checkbox,
+.cbi-value-field .cbi-input-radio {
+    margin-top: 0.3rem;
+}
+
+.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+    min-width: 7rem;
+}
+
+.cbi-section-create > .cbi-button-add {
+    margin: 0.5rem;
+}
+
+div.cbi-value var, td.cbi-value-field var {
+    font-style: italic;
+    color: #0069D6;
+}
+
+small {
+    font-size: small;
+    white-space: normal;
+}
+
+.cbi-button-up,
+.cbi-button-down {
+    display: inline-block;
+    min-width: 0;
+    padding: 0.2rem 0.3rem;
+    font-size: 1.3rem;
+}
+
+.cbi-optionals {
+    padding: 1rem 1rem 0 1rem;
+    border-top: 1px solid #CCC;
+}
+
+#diag-rc-output > pre {
+    background-color: #f5f5f5;
+    display: block;
+    padding: 8.5px;
+    margin: 0 0 18px;
+    line-height: 1.5rem;
+    -moz-border-radius: 3px;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    font-size: 1.5rem;
+    color: #404040;
+}
+
+input[name="ping"],
+input[name="traceroute"],
+input[name="nslookup"] {
+    width: 80%;
+}
+
+header > .container > .pull-right > * {
+    position: relative;
+    top: 0.45rem;
+    cursor: pointer;
+}
+
+#xhr_poll_status > .label.success {
+    background-color: #14CE14;
+}
+
+.label {
+    padding: 0.3rem 0.8rem;
+    font-size: 1rem;
+    font-weight: bold;
+    color: #ffffff !important;
+    text-transform: uppercase;
+    white-space: nowrap;
+    background-color: #bfbfbf;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+    text-shadow: none;
+    text-decoration: none;
+}
+
+.notice {
+    background-color: #5BC0DE;
+}
+
+.showSide {
+    display: none;
+}
+
+.darkMask {
+    width: 100%;
+    height: 100%;
+    position: fixed;
+    background-color: rgba(0, 0, 0, 0.56);
+    content: "";
+    z-index: 99;
+    display: none;
+}
+
+/* fix Main Login*/
+.node-main-login > .main > .main-left {
+    display: none;
+}
+
+.node-main-login > .main > .main-right {
+    width: 100%;
+}
+
+.node-main-login > .main fieldset {
+    padding: 0.5rem;
+    margin-bottom: 1rem;
+    display: inline;
+    background: none;
+    border: none;
+    box-shadow: none;
+    overflow: hidden;
+}
+
+.node-main-login > .main .cbi-value-title {
+    width: 7rem;
+}
+
+.node-main-login > .main #maincontent {
+
+    text-align: center;
+}
+
+.node-main-login > .main .container {
+    display: inline-block;
+    padding: 2rem 4rem;
+    margin-top: 2rem !important;
+    background-color: #FFF;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+    text-align: left;
+}
+
+.node-main-login > .main form > div:nth-last-child(1) {
+    float: right;
+}
+
+.node-main-login > .main .cbi-value {
+    display: block;
+}
+
+.node-main-login > .main .cbi-value > * {
+    display: inline-block !important;
+}
+
+.node-main-login > .main .cbi-input-user,
+.node-main-login > .main .cbi-input-password {
+    min-width: 15rem;
+}
+
+.node-main-login footer {
+    bottom: 0;
+    position: absolute;
+    width: 100%;
+}
+
+/* fix status overview */
+
+.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2) {
+    white-space: normal;
+}
+
+/* fix status processes */
+
+.node-status-processes > .main table tr td:nth-child(3) {
+    white-space: normal;
+}
+
+.node-status-iptables > .main div > .cbi-map > form {
+    margin: 2rem 2rem 0 0;
+}
+
+/* fix system reboot */
+
+.node-system-reboot > .main > .main-right p,
+.node-system-reboot > .main > .main-right h3 {
+    padding-left: 2rem;
+}
+
+/* fix Services  Network Shares*/
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-title {
+    margin-bottom: 1rem;
+}
+
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-field {
+    display: list-item;
+}
+
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-description {
+    padding-top: 1rem;
+}
+
+/* fix System Software*/
+.node-system-packages > .main table tr td:nth-child(1) {
+    width: auto !important;
+}
+
+.node-system-packages > .main table tr td:nth-last-child(1) {
+    white-space: normal;
+    font-size: small;
+    color: #404040;
+}
+
+.node-system-packages > .main .cbi-tabmenu > li > a, .tabs > li > a {
+    padding: 0.5rem 1rem;
+}
+
+.node-system-packages > .main .cbi-value > pre {
+    background-color: #eee;
+    padding: 0.5rem;
+    overflow: auto;
+}
+
+.cbi-tabmenu + .cbi-section {
+    margin-top: 0;
+}
+
+/* fix network firewall*/
+.node-network-firewall > .main .cbi-section-table-row > .cbi-value-field .cbi-input-select {
+    min-width: 4rem;
+}
+
+.node-status-iptables fieldset,
+.node-system-packages fieldset,
+.node-system-flashops fieldset {
+    margin-top: 0;
+}
+
+.node-status-iptables .cbi-tabmenu,
+.node-system-packages .cbi-tabmenu,
+.node-system-flashops .cbi-tabmenu {
+    border: none;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+#cbi-firewall-redirect table *,
+#cbi-network-switch_vlan table *,
+#cbi-firewall-zone table *{
+    font-size: small;
+}
+
+#cbi-firewall-redirect table input[type="text"],
+#cbi-network-switch_vlan table input[type="text"],
+#cbi-firewall-zone table input[type="text"]{
+    width: 5rem;
+}
+
+#cbi-firewall-redirect table select,
+#cbi-network-switch_vlan table select,
+#cbi-firewall-zone table select{
+    min-width: 3.5rem;
+}
+
+
+/* language fix */
+body.lang_pl.node-main-login .cbi-value-title {
+    width: 12rem;
+}
+
+@media screen and (max-width: 1600px) {
+    .main-left {
+        width: calc(0% + 15rem);
+    }
+
+    .main-right {
+        width: calc(100% - 15rem);
+    }
+
+    .cbi-button {
+        padding: 0.3rem 0.6rem;
+        font-size: 1rem;
+        line-height: 1.5;
+    }
+
+    header > .container > .pull-right > * {
+        top: 0.35rem;
+    }
+
+    .label {
+        padding: 0.2rem 0.6rem;
+    }
+
+    .cbi-value-title {
+        width: 15rem;
+        padding-right: 0.6rem;
+    }
+
+    fieldset {
+        padding: 1rem;
+    }
+
+    .cbi-input-textarea {
+        font-size: small;
+    }
+
+    .node-status-iptables > .main fieldset li > a {
+        padding: 0.3rem 0.6rem;
+    }
+}
+
+@media screen and (max-width: 1280px) {
+    header {
+        height: 3.5rem;
+    }
+
+    header > .container {
+        margin-top: 0.25rem;
+    }
+
+    .main {
+        top: 3.5rem;
+        height: calc(100% - 3.5rem);
+    }
+
+    .main-left {
+        width: calc(0% + 13rem);
+        top: 3.5rem;
+        height: calc(100% - 3.5rem);
+    }
+
+    .main-right {
+        width: calc(100% - 13rem);
+    }
+
+    .cbi-tabmenu > li > a, .tabs > li > a {
+        padding: 0.2rem 0.5rem;
+    }
+
+    .panel-title {
+        font-size: 1.3rem;
+        padding-bottom: 1rem;
+    }
+
+    table {
+        font-size: 0.8rem !important;
+        width: 100% !important;
+    }
+
+    .main > .main-left > .nav > li,
+    .main > .main-left > .nav > li a,
+    .main > .main-left > .nav > .slide > .menu {
+        font-size: 1.1rem;
+    }
+
+    .main > .main-left > .nav > .slide > .slide-menu > li > a {
+        font-size: 0.9rem;
+    }
+}
+
+@media screen and (max-width: 992px) {
+    .main-left {
+        width: 0;
+        position: fixed;
+        z-index: 100;
+    }
+
+    .main-right {
+        width: 100%;
+    }
+
+    .showSide {
+        padding: 0.1rem;
+        margin-right: 0.5rem;
+        display: inline-block;
+    }
+
+    .showSide:before {
+        content: "\e20e";
+        font-size: 1.7rem;
+    }
+
+    .node-main-login .showSide {
+        display: none !important;
+    }
+
+    .cbi-value-title {
+        width: 9rem;
+        padding-right: 1rem;
+    }
+
+    .node-network-diagnostics > .main .cbi-map fieldset > div * {
+        width: 100% !important;
+    }
+
+    .node-network-diagnostics > .main .cbi-map fieldset > div input[type="text"] {
+        margin: 3rem 0 0 0 !important;
+    }
+
+    .node-network-diagnostics > .main .cbi-map fieldset > div:nth-child(4) input[type="text"] {
+        margin: 0 !important;
+    }
+
+    .node-network-diagnostics > .main .cbi-map fieldset > div select,
+    .node-network-diagnostics > .main .cbi-map fieldset > div input[type="button"] {
+        margin: 1rem 0 0 0;
+    }
+
+    .node-network-diagnostics > .main .cbi-map fieldset > div {
+        width: 100% !important;
+    }
+
+    #diag-rc-output > pre {
+        font-size: 1.2rem;
+    }
+
+    .node-main-login > .main .cbi-value-title {
+        text-align: left;
+    }
+}
+
+@media screen and (max-width: 480px) {
+    fieldset {
+        padding: 1rem;
+        margin: 1rem 0 0 0;
+    }
+
+    .tabs {
+        margin: 0 -1rem;
+    }
+
+    #maincontent > .container {
+        margin: 0 1rem 1.5rem 1rem;
+    }
+
+    .main > .main-left > .nav > .slide > .menu {
+        font-size: 1.3rem;
+    }
+
+    .main > .main-left > .nav > .slide > .slide-menu > li > a {
+        font-size: 1.1rem;
+    }
+
+    .cbi-value-title {
+        width: 100%;
+        min-width: 0rem !important;
+        display: block;
+        margin-top: 1rem;
+        margin-bottom: 0.5rem;
+        text-align: left;
+    }
+
+    .cbi-value-field, .cbi-value-description {
+        width: 100%;
+    }
+
+    .cbi-value > .cbi-value-field {
+        display: inline-block;
+    }
+
+    .cbi-tabmenu > li, .tabs > li {
+        padding: 0.6rem 0rem;
+    }
+
+    .cbi-tabmenu > li > a, .tabs > li > a {
+        padding: 0.2rem 0.3rem;
+        font-size: 0.9rem;
+    }
+
+    .cbi-page-actions > div > input {
+        display: none;
+    }
+
+    .node-main-login > .main .container {
+        padding: 0.5rem 1rem 2rem 1rem;
+    }
+
+    .node-main-login > .main .cbi-value {
+        padding: 0;
+    }
+
+    .node-main-login > .main form > div:nth-last-child(1) {
+        margin-top: 2rem;
+    }
+
+    .node-main-login > .main .cbi-value-title {
+        width: 100% !important;
+        font-size: 1.2rem;
+    }
+
+    .node-main-login > .main fieldset {
+        margin: 0;
+        padding: 0.5rem;
+    }
+
+    h2 {
+        font-size: 2rem;
+    }
+
+    .tabs > li > a {
+        font-size: 0.9rem;
+    }
+
+    select,
+    input {
+        font-size: 0.9rem;
+    }
+
+    .mobile-hide {
+        display: none;
+    }
+
+    .panel-title {
+        font-size: 1.4rem;
+        padding-bottom: 1rem;
+    }
+
+    .node-system-packages > .main .cbi-value.cbi-value-last > div {
+        width: 100% !important;
+    }
+
+    .node-system-packages > .main .cbi-value .cbi-value-field input {
+        width: 100%;
+    }
+
+    .node-status-iptables > .main div > .cbi-map > form {
+        position: static !important;
+        margin: 0 0 2rem 0;
+        padding: 2rem;
+        border: 0;
+        font-weight: normal;
+        font-style: normal;
+        line-height: 1;
+        font-family: inherit;
+        min-width: inherit;
+        overflow-x: auto;
+        overflow-y: hidden;
+        border-radius: 0;
+        background-color: #FFF;
+        box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+        -webkit-overflow-scrolling: touch;
+    }
+
+    .node-status-iptables > .main div > .cbi-map > form input[type="submit"]{
+        width: 100% !important;
+        margin: 0;
+    }
+
+    .node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"]{
+        margin-top: 1rem;
+    }
+}
+
+@media screen and (min-width: 992px) {
+    .cbi-value input[type="password"],
+    .cbi-value input[type="text"] {
+        min-width: 20rem;
+    }
+
+    .cbi-value-field .cbi-input-select {
+        min-width: 20rem;
+    }
+}
+
+@media screen and (min-width: 1280px) {
+    .cbi-value input[type="password"],
+    .cbi-value input[type="text"] {
+        min-width: 22rem;
+    }
+
+    .cbi-value-field .cbi-input-select {
+        min-width: 22rem;
+    }
+}
+
+@media screen and (min-width: 1600px) {
+    .cbi-value input[type="password"],
+    .cbi-value input[type="text"] {
+        min-width: 25rem;
+    }
+
+    .cbi-value-field .cbi-input-select {
+        min-width: 25rem;
+    }
+}
\ No newline at end of file
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico b/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico
new file mode 100755 (executable)
index 0000000..b407d18
Binary files /dev/null and b/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico differ
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot
new file mode 100644 (file)
index 0000000..9e6ffc9
Binary files /dev/null and b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot differ
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg
new file mode 100644 (file)
index 0000000..d38d057
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe20a;" glyph-name="expand_less" d="M512 596.667l256-256-60-60-196 196-196-196-60 60z" />
+<glyph unicode="&#xe20b;" glyph-name="expand_more" d="M708 572.667l60-60-256-256-256 256 60 60 196-196z" />
+<glyph unicode="&#xe20e;" glyph-name="menu" d="M128 682.667h768v-86h-768v86zM128 384.667v84h768v-84h-768zM128 170.667v86h768v-86h-768z" />
+<glyph unicode="&#xe291;" glyph-name="favorite" d="M512 28.667l-62 56q-106 96-154 142t-107 114-81 123-22 113q0 98 67 166t167 68q116 0 192-90 76 90 192 90 100 0 167-68t67-166q0-78-52-162t-113-146-199-186z" />
+<glyph unicode="&#xe603;" glyph-name="spinner9" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96s96 42.98 96 96c0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96s-96-42.98-96-96c0-282.77 229.23-512 512-512z" />
+<glyph unicode="&#xf059;" glyph-name="question-circle" horiz-adv-x="878" d="M512 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143zM658.286 548.571q0 50.286-31.714 93.143t-79.143 66.286-97.143 23.429q-138.857 0-212-121.714-8.571-13.714 4.571-24l75.429-57.143q4-3.429 10.857-3.429 9.143 0 14.286 6.857 30.286 38.857 49.143 52.571 19.429 13.714 49.143 13.714 27.429 0 48.857-14.857t21.429-33.714q0-21.714-11.429-34.857t-38.857-25.714q-36-16-66-49.429t-30-71.714v-20.571q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143q0 10.857 12.286 28.286t31.143 28.286q18.286 10.286 28 16.286t26.286 20 25.429 27.429 16 34.571 7.143 46.286zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf
new file mode 100644 (file)
index 0000000..8466932
Binary files /dev/null and b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf differ
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff
new file mode 100644 (file)
index 0000000..00cf84e
Binary files /dev/null and b/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff differ
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js b/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
new file mode 100755 (executable)
index 0000000..f364443
--- /dev/null
@@ -0,0 +1,6 @@
+/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
+return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/js/script.js b/themes/luci-theme-material/htdocs/luci-static/material/js/script.js
new file mode 100755 (executable)
index 0000000..03e5739
--- /dev/null
@@ -0,0 +1,228 @@
+/**
+ *  Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+ *
+ *  luci-theme-material
+ *      Copyright 2015 Lutty Yang <lutty@wcan.in>
+ *
+ *  Have a bug? Please create an issue here on GitHub!
+ *      https://github.com/LuttyYang/luci-theme-material/issues
+ *
+ *  luci-theme-bootstrap:
+ *      Copyright 2008 Steven Barth <steven@midlink.org>
+ *      Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ *      Copyright 2012 David Menting <david@nut-bolt.nl>
+ *
+ *  MUI:
+ *      https://github.com/muicss/mui
+ *
+ *  Licensed to the public under the Apache License 2.0
+ */
+(function ($) {
+    $(".main > .loading").fadeOut();
+
+    /**
+     * trim text, Remove spaces, wrap
+     * @param text
+     * @returns {string}
+     */
+    function trimText(text) {
+        return text.replace(/[ \t\n\r]+/g, " ");
+    }
+
+
+    var lastNode = undefined;
+    var mainNodeName = undefined;
+
+    var nodeUrl = "";
+    (function(node){
+        if (node[0] == "admin"){
+            luciLocation = [node[1], node[2]];
+        }else{
+            luciLocation = node;
+        }
+
+        for(var i in luciLocation){
+            nodeUrl += luciLocation[i];
+            if (i != luciLocation.length - 1){
+                nodeUrl += "/";
+            }
+        }
+    })(luciLocation);
+
+    /**
+     * get the current node by Burl (primary)
+     * @returns {boolean} success?
+     */
+    function getCurrentNodeByUrl() {
+        var ret = false;
+        if (!$('body').hasClass('logged-in')) {
+            luciLocation = ["Main", "Login"];
+            return true;
+        }
+
+        $(".main > .main-left > .nav > .slide > .menu").each(function () {
+            var ulNode = $(this);
+            ulNode.next().find("a").each(function () {
+                var that = $(this);
+                var href = that.attr("href");
+
+                if (href.indexOf(nodeUrl) != -1) {
+                    ulNode.click();
+                    ulNode.next(".slide-menu").stop(true, true);
+                    lastNode = that.parent();
+                    lastNode.addClass("active");
+                    ret = true;
+                    return true;
+                }
+            });
+        });
+        return ret;
+    }
+
+    /**
+     * menu click
+     */
+    $(".main > .main-left > .nav > .slide > .menu").click(function () {
+        var ul = $(this).next(".slide-menu");
+        var menu = $(this);
+        if (!ul.is(":visible")) {
+            menu.addClass("active");
+            ul.addClass("active");
+            ul.stop(true).slideDown("fast");
+        } else {
+            ul.stop(true).slideUp("fast", function () {
+                menu.removeClass("active");
+                ul.removeClass("active");
+            });
+        }
+    });
+
+    /**
+     * hook menu click and add the hash
+     */
+    $(".main > .main-left > .nav > .slide > .slide-menu > li > a").click(function () {
+        if (lastNode != undefined) lastNode.removeClass("active");
+        $(this).parent().addClass("active");
+        $(".main > .loading").fadeIn("fast");
+        return true;
+    });
+
+    /**
+     * fix menu click
+     */
+    $(".main > .main-left > .nav > .slide > .slide-menu > li").click(function () {
+        if (lastNode != undefined) lastNode.removeClass("active");
+        $(this).addClass("active");
+        $(".main > .loading").fadeIn("fast");
+        window.location = $($(this).find("a")[0]).attr("href");
+        return;
+    });
+
+    /**
+     * get current node and open it
+     */
+    if (getCurrentNodeByUrl()) {
+        mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1];
+        mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase();
+        $("body").addClass(mainNodeName);
+    }
+    $(".cbi-button-up").val("");
+    $(".cbi-button-down").val("");
+
+
+    /**
+     * hook other "A Label" and add hash to it.
+     */
+    $("#maincontent > .container").find("a").each(function () {
+        var that = $(this);
+        var onclick = that.attr("onclick");
+        if (onclick == undefined || onclick == "") {
+            that.click(function () {
+                var href = that.attr("href");
+                if (href.indexOf("#") == -1) {
+                    $(".main > .loading").fadeIn("fast");
+                    return true;
+                }
+            });
+        }
+    });
+
+    /**
+     * Sidebar expand
+     */
+    var showSide = false;
+    $(".showSide").click(function () {
+        if (showSide) {
+            $(".darkMask").stop(true).fadeOut("fast");
+            $(".main-left").stop(true).animate({
+                width: "0"
+            }, "fast");
+            $(".main-right").css("overflow-y", "auto");
+            showSide = false;
+        } else {
+            $(".darkMask").stop(true).fadeIn("fast");
+            $(".main-left").stop(true).animate({
+                width: "15rem"
+            }, "fast");
+            $(".main-right").css("overflow-y", "hidden");
+            showSide = true;
+        }
+    });
+
+
+    $(".darkMask").click(function () {
+        if (showSide) {
+            showSide = false;
+            $(".darkMask").stop(true).fadeOut("fast");
+            $(".main-left").stop(true).animate({
+                width: "0"
+            }, "fast");
+            $(".main-right").css("overflow-y", "auto");
+        }
+    });
+
+    $(window).resize(function () {
+        if ($(window).width() > 921) {
+            $(".main-left").css("width", "");
+            $(".darkMask").stop(true);
+            $(".darkMask").css("display", "none");
+            showSide = false;
+        }
+    });
+
+    /**
+     * fix legend position
+     */
+    $("legend").each(function () {
+        var that = $(this);
+        that.after("<span class='panel-title'>" + that.text() + "</span>");
+    });
+
+
+    $(".main-right").focus();
+    $(".main-right").blur();
+    $("input").attr("size", "0");
+
+    if (mainNodeName != undefined) {
+        console.log(mainNodeName);
+        switch (mainNodeName) {
+            case "node-status-system_log":
+            case "node-status-kernel_log":
+                $("#syslog").focus(function () {
+                    $("#syslog").blur();
+                    $(".main-right").focus();
+                    $(".main-right").blur();
+                });
+                break;
+            case "node-status-firewall":
+                var button = $(".node-status-firewall > .main fieldset li > a");
+                button.addClass("cbi-button cbi-button-reset a-to-btn");
+                break;
+            case "node-system-reboot":
+                var button = $(".node-system-reboot > .main > .main-right p > a");
+                button.addClass("cbi-button cbi-input-reset a-to-btn");
+                break;
+        }
+    }
+
+})(jQuery);
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/logo.png b/themes/luci-theme-material/htdocs/luci-static/material/logo.png
new file mode 100755 (executable)
index 0000000..459148c
Binary files /dev/null and b/themes/luci-theme-material/htdocs/luci-static/material/logo.png differ
diff --git a/themes/luci-theme-material/luasrc/view/themes/material/footer.htm b/themes/luci-theme-material/luasrc/view/themes/material/footer.htm
new file mode 100755 (executable)
index 0000000..edf85dc
--- /dev/null
@@ -0,0 +1,51 @@
+<%#
+    Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+    luci-theme-material
+        Copyright 2015 Lutty Yang <lutty@wcan.in>
+
+    Have a bug? Please create an issue here on GitHub!
+        https://github.com/LuttyYang/luci-theme-material/issues
+
+    luci-theme-bootstrap:
+    Copyright 2008 Steven Barth <steven@midlink.org>
+    Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+    Copyright 2012 David Menting <david@nut-bolt.nl>
+
+    MUI:
+    https://github.com/muicss/mui
+
+    Licensed to the public under the Apache License 2.0
+-%>
+
+<%
+       local ver = require "luci.version"
+       local disp = require "luci.dispatcher"
+       local request  = disp.context.path
+       local category = request[1]
+       local tree = disp.node()
+       local categories = disp.node_childs(tree)
+%>
+                </div>
+                <footer class="mobile-hide">
+                    <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> /
+                    <a href="https://openwrt.org/"><%= ver.distversion %></a>
+                    <% if #categories > 1 then %>
+                    <ul class="breadcrumb pull-right" id="modemenu">
+                        <% for i, r in ipairs(categories) do %>
+                        <li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li>
+                        <% end %>
+                    </ul>
+                    <% end %>
+                </footer>
+            </div>
+        </div>
+
+    <script>
+        // thanks for Jo-Philipp Wich <jow@openwrt.org>
+        var luciLocation = <%= luci.http.write_json(luci.dispatcher.context.path) %>;
+    </script>
+    <script src="<%=media%>/js/jquery.min.js"></script>
+    <script src="<%=media%>/js/script.js"></script>
+</body>
+</html>
diff --git a/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/themes/luci-theme-material/luasrc/view/themes/material/header.htm
new file mode 100755 (executable)
index 0000000..46e008d
--- /dev/null
@@ -0,0 +1,232 @@
+<%#
+       Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+       luci-theme-material
+       Copyright 2015 Lutty Yang <lutty@wcan.in>
+
+       Have a bug? Please create an issue here on GitHub!
+       https://github.com/LuttyYang/luci-theme-material/issues
+
+       luci-theme-bootstrap:
+       Copyright 2008 Steven Barth <steven@midlink.org>
+       Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+       Copyright 2012 David Menting <david@nut-bolt.nl>
+
+       MUI:
+       https://github.com/muicss/mui
+
+       Licensed to the public under the Apache License 2.0
+-%>
+
+<%
+       local ver = require "luci.version"
+       local sys  = require "luci.sys"
+       local util = require "luci.util"
+       local http = require "luci.http"
+       local disp = require "luci.dispatcher"
+
+       local boardinfo = util.ubus("system", "board")
+
+       local request  = disp.context.path
+       local request2 = disp.context.request
+
+       local category = request[1]
+       local cattree  = category and disp.node(category)
+
+       local leaf = request2[#request2]
+
+       local tree = disp.node()
+       local node = disp.context.dispatched
+
+       local categories = disp.node_childs(tree)
+
+       local c = tree
+       local i, r
+
+       -- tag all nodes leading to this page
+       for i, r in ipairs(request) do
+               if c.nodes and c.nodes[r] then
+                       c = c.nodes[r]
+                       c._menu_selected = true
+               end
+       end
+    
+    -- send as HTML5
+       http.prepare_content("text/html")
+
+       local function nodeurl(prefix, name, query)
+               local url = controller .. prefix .. name .. "/"
+               if query then
+                       url = url .. http.build_querystring(query)
+               end
+               return pcdata(url)
+       end
+
+       local function subtree(prefix, node, level)
+               if not level then
+                       level = 1
+               end
+
+               local childs = disp.node_childs(node)
+               if #childs > 0 then
+        
+            if level > 2 then
+%>
+       <ul class="tabs">
+               <%  
+            end
+
+                       local selected_node
+                       local selected_name
+                       local i, v
+
+                       for i, v in ipairs(childs) do
+                               local nnode = node.nodes[v]
+                               if nnode._menu_selected then
+                                       selected_node = nnode
+                                       selected_name = v
+                               end
+                if level > 2 then
+               %>
+                       <li class="tabmenu-item-<%=v%><%- if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
+                           <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
+                       </li>
+               <%      end
+                       end
+            
+            if level > 2 then
+               %>
+       </ul>
+<%          end
+
+                       if selected_node then
+                               subtree(prefix .. selected_name .. "/", selected_node, level + 1)
+                       end
+               end
+       end
+-%>
+<!DOCTYPE html>
+<html lang="<%=luci.i18n.context.lang%>">
+<head>
+    <meta charset="utf-8">
+    <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
+    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
+    <meta name="format-detection" content="telephone=no, email=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="mobile-web-app-capable" content="yes">
+    <meta name="x5-fullscreen" content="true">
+    <meta name="full-screen" content="yes">
+    <meta name="x5-page-mode" content="app">
+    <meta name="browsermode" content="application">
+    <meta name="theme-color" content="#0099CC">
+    <meta name="msapplication-tap-highlight" content="no">
+    <meta name="msapplication-TileColor" content="#0099CC">
+    <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
+    <link rel="stylesheet" href="<%=media%>/css/style.css">
+    <link rel="shortcut icon" href="<%=media%>/favicon.ico">
+    <% if node and node.css then %>
+        <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
+    <% end -%>
+    <% if css then %>
+        <style title="text/css">
+            <%-= css %>
+        </style>
+    <% end -%>
+    <script src="<%=resource%>/xhr.js"></script>
+</head>
+
+<body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
+
+<header>
+       <div class="container">
+               <span class="showSide"></span>
+               <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
+               <div class="pull-right">
+               <%
+               -- calculate the number of unsaved changes
+               if tree.nodes[category] and tree.nodes[category].ucidata then
+                       local ucichanges = 0
+                       for i, j in pairs(require("luci.model.uci").cursor():changes()) do
+                               for k, l in pairs(j) do
+                                       for m, n in pairs(l) do
+                                               ucichanges = ucichanges + 1;
+                                       end
+                               end
+                       end
+                       %>
+                       <% if ucichanges > 0 then %>
+                       <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><span class="mobile-hide"><%:Unsaved Changes%>: </span><%=ucichanges%></a>
+                       <% end %>
+                       <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
+                               <span class="label success" id="xhr_poll_status_on"><span class="mobile-hide"><%:Auto Refresh%> </span><%:on%></span>
+                               <span class="label" id="xhr_poll_status_off" style="display:none"><span class="mobile-hide"><%:Auto Refresh%> </span><%:off%></span>
+                       </span>
+               <% end %>
+               </div>
+       </div>
+</header>
+
+ <div class="main">
+        <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
+        <div class="main-left">
+                <ul class="nav">
+                        <%-
+                        local function submenu(prefix, node)
+                        local childs = disp.node_childs(node)
+                        if #childs > 0 then
+                        %>
+                        <ul class="slide-menu">
+                                <%-
+                                for i, r in ipairs(childs) do
+                                local nnode = node.nodes[r]
+                                local href  = controller .. prefix .. r ..
+                                (nnode.query and http.build_querystring(nnode.query) or "")
+                                %>
+                                <li><a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></li>
+                                <%-
+                                end
+                                %>
+                        </ul>
+                        <%-
+                        end
+                        end
+
+                        childs = disp.node_childs(cattree)
+
+                        if #childs > 0 then
+                        for i, r in ipairs(childs) do
+                        local nnode = cattree.nodes[r]
+                        local href  = controller .. "/" .. category .. "/" .. r ..
+                        (nnode.query and http.build_querystring(k.query) or "")
+                        local grandchildren = disp.node_childs(nnode)
+
+                        if #grandchildren > 0 then
+                        %>
+                        <li class="slide">
+                                <a class="menu" data-title="<%=pcdata(striptags(nnode.title))%>" href="#"><%=pcdata(striptags(translate(nnode.title)))%></a>
+                                <%- submenu("/" .. category .. "/" .. r .. "/", nnode) %>
+                        </li>
+                        <%          else %>
+                        <li>
+                                <a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a>
+                        </li>
+                        <%
+                        end
+                        end
+                        end
+                        %>
+                </ul>
+        </div>
+        <div class="main-right">
+                <div class="darkMask"></div>
+                <div id="maincontent">
+                        <div class="container">
+                                <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
+                                        <div class="alert-message warning">
+                                                <h4><%:No password set!%></h4>
+                                                <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
+                                                <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+                                        </div>
+                                <%- end -%>
+                                <% if category then subtree("/" .. category .. "/", cattree) end %>
+
diff --git a/themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material b/themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material
new file mode 100755 (executable)
index 0000000..b013378
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+uci batch <<-EOF
+       set luci.themes.Material=/luci-static/material
+       set luci.main.mediaurlbase=/luci-static/material
+       commit luci
+EOF
+exit 0