summaryrefslogtreecommitdiff
path: root/applications
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2008-12-23 21:39:38 +0000
committerJo-Philipp Wich <jow@openwrt.org>2008-12-23 21:39:38 +0000
commit4081526ba7d0594c3ef120df5ee223c4eb55fb18 (patch)
treeee8bdd2d1dff60812b1d7ef5a4172700e3aaa2d1 /applications
parent8b1ddef6a45623db5111eebc6ada8c7def2ac2f9 (diff)
luci-0.8: merge complete trunk
Diffstat (limited to 'applications')
-rw-r--r--applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua2
-rw-r--r--applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua183
-rw-r--r--applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua35
-rw-r--r--applications/luci-olsr/luasrc/controller/olsr.lua9
-rw-r--r--applications/luci-polipo/luasrc/i18n/polipo.en.xml49
-rw-r--r--applications/luci-qos/luasrc/i18n/qos.fr.lua17
-rw-r--r--applications/luci-qos/luasrc/i18n/qos.fr.xml23
-rw-r--r--applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.lua34
-rw-r--r--applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.xml40
-rw-r--r--applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.lua5
-rw-r--r--applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.xml11
11 files changed, 323 insertions, 85 deletions
diff --git a/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua
index 9e7c0decaf..9a9f883ef7 100644
--- a/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua
+++ b/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua
@@ -17,5 +17,5 @@ $Id$
module "luci.controller.ffwizard"
function index()
- entry({"admin", "index", "ffwizard"}, form("ffwizard"), "Freifunkassistent", 50)
+ entry({"admin", "freifunk", "ffwizard"}, form("ffwizard"), "Freifunkassistent", 50)
end \ No newline at end of file
diff --git a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua
index 5245a92f15..87bbe4d1f2 100644
--- a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua
+++ b/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua
@@ -17,6 +17,7 @@ $Id$
local uci = require "luci.model.uci".cursor()
local tools = require "luci.tools.ffwizard"
+local util = require "luci.util"
-------------------- View --------------------
@@ -33,11 +34,13 @@ uci:foreach("wireless", "wifi-device",
main = f:field(Flag, "wifi", "Freifunkzugang einrichten")
-net = f:field(Value, "net", "Freifunknetz")
+net = f:field(Value, "net", "Freifunknetz", "1. Teil der IP-Adresse")
net.rmempty = true
net:depends("wifi", "1")
-net:value("104.61", "Leipzig (104.61)")
-net:value("104.62", "Halle (104.62)")
+uci:foreach("freifunk", "community", function(s)
+ net:value(s[".name"], "%s (%s)" % {s.name, s.prefix})
+end)
+
function net.cfgvalue(self, section)
return uci:get("freifunk", "wizard", "net")
end
@@ -47,12 +50,9 @@ function net.write(self, section, value)
end
-subnet = f:field(ListValue, "subnet", "Subnetz (Projekt)")
+subnet = f:field(Value, "subnet", "Subnetz (Projekt)", "2. Teil der IP-Adresse")
subnet.rmempty = true
subnet:depends("wifi", "1")
-for i=0, 255 do
- subnet:value(i)
-end
function subnet.cfgvalue(self, section)
return uci:get("freifunk", "wizard", "subnet")
end
@@ -61,7 +61,7 @@ function subnet.write(self, section, value)
uci:save("freifunk")
end
-node = f:field(Value, "node", "Knoten")
+node = f:field(Value, "node", "Knoten", "3. Teil der IP-Adresse")
node.rmempty = true
node:depends("wifi", "1")
for i=1, 51 do
@@ -77,14 +77,14 @@ end
client = f:field(Flag, "client", "WLAN-DHCP anbieten")
client:depends("wifi", "1")
+client.rmempty = true
olsr = f:field(Flag, "olsr", "OLSR einrichten")
+olsr.rmempty = true
-share = f:field(ListValue, "sharenet", "Eigenen Internetzugang freigeben")
-share:value("maybe", "-- keine Aktion --")
-share:value("yes", "einschalten")
-share:value("no", "ausschalten")
+share = f:field(Flag, "sharenet", "Eigenen Internetzugang freigeben")
+share.rmempty = true
@@ -114,17 +114,22 @@ function main.write(self, section, value)
if value == "0" then
return
end
-
+
local device = dev:formvalue(section)
+ local community, external
-- Collect IP-Address
local inet = net:formvalue(section)
local isubnet = subnet:formvalue(section)
local inode = node:formvalue(section)
-
+
-- Invalidate fields
if not inet then
net.tag_missing[section] = true
+ else
+ community = inet
+ external = uci:get("freifunk", community, "external") or ""
+ inet = uci:get("freifunk", community, "prefix") or inet
end
if not isubnet then
subnet.tag_missing[section] = true
@@ -132,57 +137,70 @@ function main.write(self, section, value)
if not inode then
node.tag_missing[section] = true
end
-
+
if not inet or not isubnet or not inode then
return
end
-
+
local ip = "%s.%s.%s" % {inet, isubnet, inode}
-
-
+
+
-- Cleanup
- luci.util.perror("1")
tools.wifi_delete_ifaces(device)
- luci.util.perror("2")
tools.network_remove_interface(device)
- luci.util.perror("3")
tools.firewall_zone_remove_interface("freifunk", device)
-
-
+
+ -- Tune community settings
+ if community and uci:get("freifunk", community) then
+ uci:tset("freifunk", "community", uci:get_all("freifunk", community))
+ end
+
-- Tune wifi device
- local devconfig = _strip_internals(uci:get_all("freifunk", "wifi_device"))
+ local devconfig = uci:get_all("freifunk", "wifi_device")
+ util.update(devconfig, uci:get_all(external, "wifi_device") or {})
uci:tset("wireless", device, devconfig)
-
+
-- Create wifi iface
- local ifconfig = _strip_internals(uci:get_all("freifunk", "wifi_iface"))
+ local ifconfig = uci:get_all("freifunk", "wifi_iface")
+ util.update(ifconfig, uci:get_all(external, "wifi_iface") or {})
ifconfig.device = device
+ ifconfig.network = device
+ ifconfig.ssid = uci:get("freifunk", community, "ssid")
uci:section("wireless", "wifi-iface", nil, ifconfig)
-
+
-- Save wifi
- uci:save("wireless")
-
+ uci:save("wireless")
+
-- Create firewall zone and add default rules (first time)
local newzone = tools.firewall_create_zone("freifunk", "DROP", "ACCEPT", "DROP", true)
if newzone then
uci:foreach("freifunk", "fw_forwarding", function(section)
- uci:section("firewall", "forwarding", nil, _strip_internals(section))
+ uci:section("firewall", "forwarding", nil, section)
+ end)
+ uci:foreach(external, "fw_forwarding", function(section)
+ uci:section("firewall", "forwarding", nil, section)
end)
-
+
uci:foreach("freifunk", "fw_rule", function(section)
- uci:section("firewall", "rule", nil, _strip_internals(section))
+ uci:section("firewall", "rule", nil, section)
+ end)
+ uci:foreach(external, "fw_rule", function(section)
+ uci:section("firewall", "rule", nil, section)
end)
-
+
uci:save("firewall")
end
-
-
+
+
-- Crate network interface
- local netconfig = _strip_internals(uci:get_all("freifunk", "interface"))
+ local netconfig = uci:get_all("freifunk", "interface")
+ util.update(netconfig, uci:get_all(external, "interface") or {})
+ netconfig.proto = "static"
netconfig.ipaddr = ip
uci:section("network", "interface", device, netconfig)
-
+
uci:save("network")
-
+
tools.firewall_zone_add_interface("freifunk", device)
end
@@ -191,28 +209,30 @@ function olsr.write(self, section, value)
if value == "0" then
return
end
-
+
+
local device = dev:formvalue(section)
-
+
+ local community = net:formvalue(section)
+ local external = community and uci:get("freifunk", community, "external") or ""
+
-- Delete old interface
- uci:delete_all("freifunk", "Interface", {Interface=device})
-
+ uci:delete_all("olsrd", "Interface", {interface=device})
+
-- Write new interface
- local olsrbase = _strip_internals(uci:get_all("freifunk", "olsr_interface"))
- olsrbase.Interface = device
- uci:section("olsr", "Interface", nil, olsrbase)
- uci:save("olsr")
+ local olsrbase = uci:get_all("freifunk", "olsr_interface")
+ util.update(olsrbase, uci:get_all(external, "olsr_interface") or {})
+ olsrbase.interface = device
+ olsrbase.ignore = "0"
+ uci:section("olsrd", "Interface", nil, olsrbase)
+ uci:save("olsrd")
end
function share.write(self, section, value)
- if value == "maybe" then
- return
- end
-
uci:delete_all("firewall", "forwarding", {src="freifunk", dest="wan"})
-
- if value == "yes" then
+
+ if value == "1" then
uci:section("firewall", "forwarding", nil, {src="freifunk", dest="wan"})
end
uci:save("firewall")
@@ -223,50 +243,81 @@ function client.write(self, section, value)
if value == "0" then
return
end
-
+
local device = dev:formvalue(section)
-- Collect IP-Address
local inet = net:formvalue(section)
local isubnet = subnet:formvalue(section)
local inode = node:formvalue(section)
-
+
if not inet or not isubnet or not inode then
return
end
-
- local dhcpbeg = 48 + tonumber(inode) * 4
+ local community = inet
+ local external = community and uci:get("freifunk", community, "external") or ""
+ inet = uci:get("freifunk", community, "prefix") or inet
+
+ local dhcpbeg = 48 + tonumber(inode) * 4
local dclient = "%s.%s.%s" % {inet:gsub("^[0-9]+", "10"), isubnet, dhcpbeg}
local limit = dhcpbeg < 252 and 3 or 2
-
+
-- Delete old alias
uci:delete("network", device .. "dhcp")
-
+
-- Create alias
- local aliasbase = _strip_internals(uci:get_all("freifunk", "alias"))
+ local aliasbase = uci:get_all("freifunk", "alias")
+ util.update(aliasbase, uci:get_all(external, "alias") or {})
aliasbase.interface = device
aliasbase.ipaddr = dclient
aliasbase.proto = "static"
uci:section("network", "alias", device .. "dhcp", aliasbase)
uci:save("network")
-
-
+
+
-- Create dhcp
- local dhcpbase = _strip_internals(uci:get_all("freifunk", "dhcp"))
+ local dhcpbase = uci:get_all("freifunk", "dhcp")
+ util.update(dhcpbase, uci:get_all(external, "dhcp") or {})
dhcpbase.interface = device .. "dhcp"
dhcpbase.start = dhcpbeg
dhcpbase.limit = limit
uci:section("dhcp", "dhcp", device .. "dhcp", dhcpbase)
uci:save("dhcp")
-
-
+
+ uci:delete_all("firewall", "rule", {
+ src="freifunk",
+ proto="udp",
+ src_port="68",
+ dest_port="67"
+ })
+ uci:section("firewall", "rule", nil, {
+ src="freifunk",
+ proto="udp",
+ src_port="68",
+ dest_port="67",
+ target="ACCEPT"
+ })
+ uci:delete_all("firewall", "rule", {
+ src="freifunk",
+ proto="tcp",
+ dest_port="8082",
+ })
+ uci:section("firewall", "rule", nil, {
+ src="freifunk",
+ proto="tcp",
+ dest_port="8082",
+ target="ACCEPT"
+ })
+
+
+
-- Delete old splash
uci:delete_all("luci_splash", "iface", {net=device, zone="freifunk"})
-
+
-- Register splash
uci:section("luci_splash", "iface", nil, {net=device, zone="freifunk"})
uci:save("luci_splash")
end
-return f \ No newline at end of file
+return f
diff --git a/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua
index bb7cbb8345..217cd44bb8 100644
--- a/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua
+++ b/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua
@@ -32,35 +32,35 @@ end
-- Deletes a network interface and all occurences of it in firewall zones and dhcp
function network_remove_interface(iface)
local cursor = uci.cursor()
-
+
if not cursor:delete("network", iface) then
return false
end
local aliases = {iface}
- cursor:foreach("network", "alias",
+ cursor:foreach("network", "alias",
function(section)
if section.interface == iface then
table.insert(aliases, section[".name"])
end
end)
-
+
-- Delete Aliases and Routes
cursor:delete_all("network", "route", {interface=iface})
cursor:delete_all("network", "alias", {interface=iface})
-
+
-- Delete DHCP sections
cursor:delete_all("dhcp", "dhcp",
function(section)
return util.contains(aliases, section.interface)
end)
-
+
-- Remove OLSR sections
- cursor:delete_all("olsr", "Interface", {Interface=iface})
-
+ cursor:delete_all("olsrd", "Interface", {Interface=iface})
+
-- Remove Splash sections
cursor:delete_all("luci-splash", "iface", {network=iface})
-
+
cursor:save("network")
cursor:save("olsr")
cursor:save("dhcp")
@@ -88,7 +88,8 @@ function firewall_zone_add_interface(name, interface)
local cursor = uci.cursor()
local zone = firewall_find_zone(name)
local net = cursor:get("firewall", zone, "network")
- cursor:set("firewall", zone, "network", (net or name .. " ") .. interface)
+ local old = net or (cursor:get("network", name) and name)
+ cursor:set("firewall", zone, "network", (old and old .. " " or "") .. interface)
cursor:save("firewall")
end
@@ -114,14 +115,14 @@ end
-- Finds the firewall zone with given name
function firewall_find_zone(name)
local find
-
- uci.cursor():foreach("firewall", "zone",
+
+ uci.cursor():foreach("firewall", "zone",
function (section)
if section.name == name then
find = section[".name"]
end
end)
-
+
return find
end
@@ -134,15 +135,15 @@ function remove_list_entry(value, entry)
if type(value) == "nil" then
return nil
end
-
+
local result = type(value) == "table" and value or util.split(value, " ")
local key = util.contains(result, entry)
-
+
while key do
table.remove(result, key)
key = util.contains(result, entry)
end
-
+
result = type(value) == "table" and result or table.concat(result, " ")
- return result ~= value and result
-end \ No newline at end of file
+ return result ~= value and result
+end
diff --git a/applications/luci-olsr/luasrc/controller/olsr.lua b/applications/luci-olsr/luasrc/controller/olsr.lua
index 97e5061b9b..766107ee9a 100644
--- a/applications/luci-olsr/luasrc/controller/olsr.lua
+++ b/applications/luci-olsr/luasrc/controller/olsr.lua
@@ -182,7 +182,14 @@ function fetch_txtinfo(otable)
local rawdata = luci.sys.httpget("http://127.0.0.1:2006/"..otable)
if #rawdata == 0 then
- return nil
+ if luci.fs.access("/proc/net/ipv6_route", "r") then
+ rawdata = luci.sys.httpget("http://[::1]:2006/"..otable)
+ if #rawdata == 0 then
+ return nil
+ end
+ else
+ return nil
+ end
end
local data = {}
diff --git a/applications/luci-polipo/luasrc/i18n/polipo.en.xml b/applications/luci-polipo/luasrc/i18n/polipo.en.xml
new file mode 100644
index 0000000000..b4e8df8998
--- /dev/null
+++ b/applications/luci-polipo/luasrc/i18n/polipo.en.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<i18n:msgs xmlns:i18n="http://luci.freifunk-halle.net/2008/i18n#" xmlns="http://www.w3.org/1999/xhtml">
+
+<i18n:msg xml:id="polipo">Polipo</i18n:msg>
+<i18n:msg xml:id="polipo_cache">On-Disk Cache</i18n:msg>
+<i18n:msg xml:id="polipo_cache_cacheisshared">Shared cache</i18n:msg>
+<i18n:msg xml:id="polipo_cache_cacheisshared_desc">Enable if cache (proxy) is shared by multiple users.</i18n:msg>
+<i18n:msg xml:id="polipo_cache_desc">To enable polipo on-disk cache cleaning (highly recommended), you should add a cron job in Scheduled Tasks services that will execute /usr/sbin/polipo_purge script. For example to perform disk cache cleanup every day at 6:00 in the morning you should add the following line in Scheduled Tasks "0 6 * * * /usr/sbin/polipo_purge" (without quotes).</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcacheroot">Disk cache location</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcacheroot_desc">Location where polipo will cache files permanently. Use of external storage devices is recommended, because the cache can grow considerably. Leave it empty to disable on-disk cache.</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcachetruncatesize">Truncate cache files size (in bytes)</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcachetruncatesize_desc">Size to which cached files should be truncated. (default value: 1048576)</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcachetruncatetime">Truncate cache files time</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcachetruncatetime_desc">Time after which cached files will be truncated. (default value: 4d12h)</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcacheunlinktime">Delete cache files time</i18n:msg>
+<i18n:msg xml:id="polipo_cache_diskcacheunlinktime_desc">Time after which cached files will be deleted. (default value: 32d)</i18n:msg>
+<i18n:msg xml:id="polipo_desc">Polipo is a small and fast caching web proxy.</i18n:msg>
+<i18n:msg xml:id="polipo_general">General</i18n:msg>
+<i18n:msg xml:id="polipo_general_allowedclients">Allowed clients</i18n:msg>
+<i18n:msg xml:id="polipo_general_allowedclients_desc">When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients that are allowed to connect. The format is IP address or network address (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6)).</i18n:msg>
+<i18n:msg xml:id="polipo_general_chunkhighmark">In RAM cache size (in bytes)</i18n:msg>
+<i18n:msg xml:id="polipo_general_chunkhighmark_desc">How much RAM should Polipo use for its cache.</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsnameserver">DNS server address</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsnameserver_desc">Set the DNS server address to use, if you want Polipo to use different DNS server than the host system.</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsqueryipv6">Query DNS for IPv6</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsqueryipv6_desc">false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily = Query both, prefer IPv6; true = Query only IPv6</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsusegethostbyname">Query DNS by hostname</i18n:msg>
+<i18n:msg xml:id="polipo_general_dnsusegethostbyname_desc">false = Never use system DNS resolver; reluctantly = Query DNS directly, if DNS server is unavailable fail to system DNS resolver; happily = Query DNS directly, if host could not be found fallback to system DNS resolver; true = Always use system DNS resolver</i18n:msg>
+<i18n:msg xml:id="polipo_general_logfacility">Syslog facility</i18n:msg>
+<i18n:msg xml:id="polipo_general_logfile">Log file location</i18n:msg>
+<i18n:msg xml:id="polipo_general_logfile_desc">Use of external storage device is recommended, because the log file is written frequently and can grow considerably.</i18n:msg>
+<i18n:msg xml:id="polipo_general_logsyslog">Log to syslog</i18n:msg>
+<i18n:msg xml:id="polipo_general_parentauthcredentials">Parent proxy authentication</i18n:msg>
+<i18n:msg xml:id="polipo_general_parentauthcredentials_desc">Basic HTTP authentication supported. Provide username and password in username:password format.</i18n:msg>
+<i18n:msg xml:id="polipo_general_parentproxy">Parent proxy address</i18n:msg>
+<i18n:msg xml:id="polipo_general_parentproxy_desc">Parent proxy address (in host:port format), to which Polipo will forward the requests.</i18n:msg>
+<i18n:msg xml:id="polipo_general_proxyaddress">Listen address</i18n:msg>
+<i18n:msg xml:id="polipo_general_proxyaddress_desc">The interface on which Polipo will listen. To listen on all interfaces use 0.0.0.0 or :: (IPv6).</i18n:msg>
+<i18n:msg xml:id="polipo_general_proxyport">Listen port</i18n:msg>
+<i18n:msg xml:id="polipo_general_proxyport_desc">Port on which Polipo will listen. (default value: 8123)</i18n:msg>
+<i18n:msg xml:id="polipo_pmm">Poor Man's Multiplexing</i18n:msg>
+<i18n:msg xml:id="polipo_pmm_desc">Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by requesting an instance in multiple segments. It tries to lower the latency caused by the weakness of HTTP protocol. NOTE: some sites may not work with PMM enabled.</i18n:msg>
+<i18n:msg xml:id="polipo_pmm_pmmfirstsize">First PMM segment size (in bytes)</i18n:msg>
+<i18n:msg xml:id="polipo_pmm_pmmfirstsize_desc">Size of the first PMM segment. If not defined, it defaults to twice the PMM segment size.</i18n:msg>
+<i18n:msg xml:id="polipo_pmm_pmmsize">PMM segments size (in bytes)</i18n:msg>
+<i18n:msg xml:id="polipo_pmm_pmmsize_desc">To enable PMM, PMM segment size must be set to some positive value.</i18n:msg>
+
+</i18n:msgs>
diff --git a/applications/luci-qos/luasrc/i18n/qos.fr.lua b/applications/luci-qos/luasrc/i18n/qos.fr.lua
new file mode 100644
index 0000000000..73c54dccfb
--- /dev/null
+++ b/applications/luci-qos/luasrc/i18n/qos.fr.lua
@@ -0,0 +1,17 @@
+qos = 'Qualité de service'
+qos_bulk = 'lent'
+qos_classify = 'Priorité'
+qos_classify_dsthost = 'Adresse de destination'
+qos_classify_dsthost_dest = 'Réseau de destination / Hôte de destination'
+qos_classify_portrange = 'ports'
+qos_classify_srchost = 'Adresse source'
+qos_classify_srchost_dest = 'Réseau source / Hôte source'
+qos_classify_target = 'Priorité'
+qos_desc = 'Avec la QOS, vous pouvez donner des priorités au trafic de votre réseau en fonction des adresses, des ports ou des services présents.'
+qos_express = 'express'
+qos_interface_classgroup = 'Classification'
+qos_interface_download = 'Liaison descendante'
+qos_interface_overhead = 'calcul de la surcharge'
+qos_interface_upload = 'Liaison montante'
+qos_normal = 'normal'
+qos_priority = 'prioritaire'
diff --git a/applications/luci-qos/luasrc/i18n/qos.fr.xml b/applications/luci-qos/luasrc/i18n/qos.fr.xml
new file mode 100644
index 0000000000..b2703a08ef
--- /dev/null
+++ b/applications/luci-qos/luasrc/i18n/qos.fr.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<i18n:msgs xmlns:i18n="http://luci.freifunk-halle.net/2008/i18n#" xmlns="http://www.w3.org/1999/xhtml">
+
+<i18n:msg xml:id="qos">Qualité de service</i18n:msg>
+<i18n:msg xml:id="qos_bulk">lent</i18n:msg>
+<i18n:msg xml:id="qos_classify">Priorité</i18n:msg>
+<i18n:msg xml:id="qos_classify_dsthost">Adresse de destination</i18n:msg>
+<i18n:msg xml:id="qos_classify_dsthost_dest">Réseau de destination / Hôte de destination</i18n:msg>
+<i18n:msg xml:id="qos_classify_portrange">ports</i18n:msg>
+<i18n:msg xml:id="qos_classify_srchost">Adresse source</i18n:msg>
+<i18n:msg xml:id="qos_classify_srchost_dest">Réseau source / Hôte source</i18n:msg>
+<i18n:msg xml:id="qos_classify_target">Priorité</i18n:msg>
+<i18n:msg xml:id="qos_desc">Avec la QOS, vous pouvez donner des priorités au trafic de votre réseau en fonction des adresses, des ports ou des services présents.</i18n:msg>
+<i18n:msg xml:id="qos_express">express</i18n:msg>
+<i18n:msg xml:id="qos_interface_classgroup">Classification</i18n:msg>
+<i18n:msg xml:id="qos_interface_download">Liaison descendante</i18n:msg>
+<i18n:msg xml:id="qos_interface_overhead">calcul de la surcharge</i18n:msg>
+<i18n:msg xml:id="qos_interface_upload">Liaison montante</i18n:msg>
+<i18n:msg xml:id="qos_normal">normal</i18n:msg>
+<i18n:msg xml:id="qos_priority">prioritaire</i18n:msg>
+
+</i18n:msgs>
diff --git a/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.lua b/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.lua
new file mode 100644
index 0000000000..af7a134bc6
--- /dev/null
+++ b/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.lua
@@ -0,0 +1,34 @@
+tinyproxy = 'Tinyproxy'
+tinyproxy_desc = 'Tinyproxy is a small and fast non-caching HTTP(S)-Proxy'
+tinyproxy_tinyproxy_allow = 'Allow access from'
+tinyproxy_tinyproxy_anonymous = 'Allowed headers for anonymous proxy'
+tinyproxy_tinyproxy_bind = 'Lier le trafic sortant à l&#39;adresse ip'
+tinyproxy_tinyproxy_connectport = 'Ports allowed for CONNECT method'
+tinyproxy_tinyproxy_connectport_desc = '0 = disabled, empty = all'
+tinyproxy_tinyproxy_defaulterrorfile = 'Fichier d&#39;erreur'
+tinyproxy_tinyproxy_filter = 'Liste de filtres'
+tinyproxy_tinyproxy_filtercasesensitive = 'Case sensitive filters'
+tinyproxy_tinyproxy_filterdefaultdeny = 'Filter list is a whitelist'
+tinyproxy_tinyproxy_filterextended = 'Extended regular expression filters'
+tinyproxy_tinyproxy_filterurls = 'Filter URLs instead of domains'
+tinyproxy_tinyproxy_group = 'Groupe'
+tinyproxy_tinyproxy_listen = 'Listen on address'
+tinyproxy_tinyproxy_logfile = 'Chemin du fichier de log'
+tinyproxy_tinyproxy_loglevel = 'Niveau de log'
+tinyproxy_tinyproxy_maxclients = 'Nombre maximum de clients'
+tinyproxy_tinyproxy_maxrequestsperchild = 'Maximum de connexion par processus'
+tinyproxy_tinyproxy_maxspareservers = 'Nombre Maximum de processus serveur'
+tinyproxy_tinyproxy_minspareservers = 'Nombre Minimum de processus serveur'
+tinyproxy_tinyproxy_startservers = 'Nombre de processus serveur lancés au demarrage'
+tinyproxy_tinyproxy_statfile = 'Fichier de statistiques'
+tinyproxy_tinyproxy_syslog = 'Écrire dans le journal système (Syslog)'
+tinyproxy_tinyproxy_timeout = 'Délai de connexion'
+tinyproxy_tinyproxy_user = 'Utilisateur'
+tinyproxy_tinyproxy_viaproxyname = 'Valeur de l&#39;entête &quot;VIA&quot; utilisée comme nom d&#39;hôte'
+tinyproxy_tinyproxy_xtinyproxy = 'Inclure l&#39;ip du client'
+tinyproxy_type_proxy = 'Via proxy'
+tinyproxy_type_reject = 'Refuser l&#39;accès'
+tinyproxy_upstream = 'Upstream Control'
+tinyproxy_upstream_target = 'Hôte de destination'
+tinyproxy_upstream_type = 'Type'
+tinyproxy_upstream_via = 'Proxy'
diff --git a/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.xml b/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.xml
new file mode 100644
index 0000000000..77470ecca3
--- /dev/null
+++ b/applications/luci-tinyproxy/luasrc/i18n/tinyproxy.fr.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<i18n:msgs xmlns:i18n="http://luci.freifunk-halle.net/2008/i18n#" xmlns="http://www.w3.org/1999/xhtml">
+
+<i18n:msg xml:id="tinyproxy">Tinyproxy</i18n:msg>
+<i18n:msg xml:id="tinyproxy_desc">Tinyproxy is a small and fast non-caching HTTP(S)-Proxy</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_allow">Allow access from</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_anonymous">Allowed headers for anonymous proxy</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_bind">Lier le trafic sortant à l'adresse ip</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_connectport">Ports allowed for CONNECT method</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_connectport_desc">0 = disabled, empty = all</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_defaulterrorfile">Fichier d'erreur</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_filter">Liste de filtres</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_filtercasesensitive">Case sensitive filters</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_filterdefaultdeny">Filter list is a whitelist</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_filterextended">Extended regular expression filters</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_filterurls">Filter URLs instead of domains</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_group">Groupe</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_listen">Listen on address</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_logfile">Chemin du fichier de log</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_loglevel">Niveau de log</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_maxclients">Nombre maximum de clients</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_maxrequestsperchild">Maximum de connexion par processus</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_maxspareservers">Nombre Maximum de processus serveur</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_minspareservers">Nombre Minimum de processus serveur</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_startservers">Nombre de processus serveur lancés au demarrage</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_statfile">Fichier de statistiques</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_syslog">Écrire dans le journal système (Syslog)</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_timeout">Délai de connexion</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_user">Utilisateur</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_viaproxyname">Valeur de l'entête "VIA" utilisée comme nom d'hôte</i18n:msg>
+<i18n:msg xml:id="tinyproxy_tinyproxy_xtinyproxy">Inclure l'ip du client</i18n:msg>
+<i18n:msg xml:id="tinyproxy_type_proxy">Via proxy</i18n:msg>
+<i18n:msg xml:id="tinyproxy_type_reject">Refuser l'accès</i18n:msg>
+<i18n:msg xml:id="tinyproxy_upstream">Upstream Control</i18n:msg>
+<i18n:msg xml:id="tinyproxy_upstream_target">Hôte de destination</i18n:msg>
+<i18n:msg xml:id="tinyproxy_upstream_type">Type</i18n:msg>
+<i18n:msg xml:id="tinyproxy_upstream_via">Proxy</i18n:msg>
+
+</i18n:msgs>
diff --git a/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.lua b/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.lua
new file mode 100644
index 0000000000..97523af41a
--- /dev/null
+++ b/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.lua
@@ -0,0 +1,5 @@
+framespersecond = 'Images par seconde'
+resolution = 'Résolution'
+settings = 'Paramètres'
+uvc_streamer = 'Webcam streaming'
+uvc_streamer_desc = 'Configurez le pilote linux UVC-webcam pour votre webcam. Pointez votre navigateur par exemple sur<a href="http://%s:%i/">http://%s:%i/</a>'
diff --git a/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.xml b/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.xml
new file mode 100644
index 0000000000..ab3ecf333c
--- /dev/null
+++ b/applications/luci-uvc_streamer/luasrc/i18n/uvc_streamer.fr.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<i18n:msgs xmlns:i18n="http://luci.freifunk-halle.net/2008/i18n#" xmlns="http://www.w3.org/1999/xhtml">
+
+<i18n:msg xml:id="framespersecond">Images par seconde</i18n:msg>
+<i18n:msg xml:id="resolution">Résolution</i18n:msg>
+<i18n:msg xml:id="settings">Paramètres</i18n:msg>
+<i18n:msg xml:id="uvc_streamer">Webcam streaming</i18n:msg>
+<i18n:msg xml:id="uvc_streamer_desc">Configurez le pilote linux UVC-webcam pour votre webcam. Pointez votre navigateur par exemple sur<a href="http://%s:%i/">http://%s:%i/</a></i18n:msg>
+
+</i18n:msgs>