diff --git a/docs/releases/v2015.1.rst b/docs/releases/v2015.1.rst
index 17a3c80a9da0706257be60bde4b719296467b80a..83a57666bb36056936615bf63365f5276f1cbf8e 100644
--- a/docs/releases/v2015.1.rst
+++ b/docs/releases/v2015.1.rst
@@ -39,6 +39,19 @@ Site changes
           }
       }
 
+  - ``roles``: The display strings for the node roles aren't configured in the ``site.conf`` anymore, but
+    in the site i18n files. The ``site.conf`` section becomes::
+
+      roles = {
+          default = 'foo',
+          list = {
+              'foo',
+              'bar',
+          }
+      }
+
+    The display string use i18n message IDs like ``gluon-luci-node-role:role:foo`` and ``gluon-luci-node-role:role:bar``.
+
 
 * ``site.mk``
 
diff --git a/docs/site-example/site.conf b/docs/site-example/site.conf
index e2c03434187fdb1d346098a7b4169ea7678f7116..a25857a95c01ccbfbfcf4f3b55cda1ae3b28b91e 100644
--- a/docs/site-example/site.conf
+++ b/docs/site-example/site.conf
@@ -154,13 +154,13 @@
   },
 
   -- Node roles
-  -- roles {
+  -- roles = {
   --   default = 'node',
   --   list = {
-  --     node = 'Normal Node',
-  --     test = 'Test Node',
-  --     backbone = 'Backbone Node',
-  --     service = 'Service Node',
+  --     'node',
+  --     'test',
+  --     'backbone',
+  --     'service',
   --   },
   -- },
 
diff --git a/docs/user/site.rst b/docs/user/site.rst
index f555bb7d8d3614378f7135fdfb49c15bc2998991..65c9022f2ad6873780cc3e9afec9b8017cf2a139 100644
--- a/docs/user/site.rst
+++ b/docs/user/site.rst
@@ -150,15 +150,19 @@ roles : optional
     ``default`` takes the default role which is set initially. This value should be
     part of ``list``. If you want node owners to change the role via config mode add
     the package ``gluon-luci-node-role`` to ``site.mk``.
+
+    The strings to display in the LuCI interface can be configured per language in the
+    ``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like
+    ``gluon-luci-node-role:role:node`` and ``gluon-luci-node-role:role:backbone``.
     ::
 
       roles = {
         default = 'node',
         list = {
-          node = 'Normal Node',
-          test = 'Test Node',
-          backbone = 'Backbone Node',
-          service = 'Service Node',
+          'node',
+          'test',
+          'backbone',
+          'service',
         },
       },
 
diff --git a/package/gluon-luci-node-role/check_site.lua b/package/gluon-luci-node-role/check_site.lua
index cd3ca9378a7c30e6806460e7e714601502d3ed87..ab01eeb536c1549f35493afc4dc2bd948e49c614 100644
--- a/package/gluon-luci-node-role/check_site.lua
+++ b/package/gluon-luci-node-role/check_site.lua
@@ -1,8 +1,2 @@
-local function check_role(k, _)
-   local role = string.format('roles.list[%q]', k)
-
-   need_string(role)
-end
-
-need_string('roles.default')
-need_table('roles.list', check_role)
+need_string 'roles.default'
+need_string_array 'roles.list'
diff --git a/package/gluon-luci-node-role/files/usr/lib/lua/luci/model/cbi/admin/noderole.lua b/package/gluon-luci-node-role/files/usr/lib/lua/luci/model/cbi/admin/noderole.lua
index d2ab51a72fd0a5585534bc27ebf9d0d433e22489..e7832ad991dee3975f122a150a7e887b28aac2a4 100644
--- a/package/gluon-luci-node-role/files/usr/lib/lua/luci/model/cbi/admin/noderole.lua
+++ b/package/gluon-luci-node-role/files/usr/lib/lua/luci/model/cbi/admin/noderole.lua
@@ -18,8 +18,8 @@ s = f:section(SimpleSection, nil, i18n.translate(
 o = s:option(ListValue, "role", i18n.translate("Role"))
 o.default = role
 o.rmempty = false
-for role, prettyname in pairs(site.roles.list) do
-  o:value(role, prettyname)
+for _, role in ipairs(site.roles.list) do
+  o:value(role, i18n.translate('gluon-luci-node-role:role:' .. role))
 end
 
 function f.handle(self, state, data)
diff --git a/package/gluon-node-info/check_site.lua b/package/gluon-node-info/check_site.lua
index d8d46408f0cf87f849d8a735211d0db85e4f1cf6..7e50edfcd60039c0530e856c37a6e0d59691fd20 100644
--- a/package/gluon-node-info/check_site.lua
+++ b/package/gluon-node-info/check_site.lua
@@ -1,8 +1 @@
-local function check_role(k, _)
-   local role = string.format('roles.list[%q]', k)
-
-   need_string(role)
-end
-
 need_string('roles.default', false)
-need_table('roles.list', check_role, false)