diff --git a/include/class.role.php b/include/class.role.php
index 36ea3f9a5a74eac80e077ef46221b6e300f8c9b3..1a9aec2e54d8acf09d506bf331671e97ff0d5103 100644
--- a/include/class.role.php
+++ b/include/class.role.php
@@ -89,6 +89,15 @@ class Role extends RoleModel {
         return $this->getPermission()->getInfo();
     }
 
+    function getTranslateTag($subtag) {
+        return _H(sprintf('role.%s.%s', $subtag, $this->getId()));
+    }
+    function getLocal($subtag) {
+        $tag = $this->getTranslateTag($subtag);
+        $T = CustomDataTranslation::translate($tag);
+        return $T != $tag ? $T : $this->ht[$subtag];
+    }
+
     function to_json() {
 
         $info = array(
@@ -191,20 +200,19 @@ class Role extends RoleModel {
         return $role;
     }
 
-    static function getRoles($criteria=null) {
+    static function getRoles($criteria=null, $localize=true) {
         static $roles = null;
 
         if (!isset($roles) || $criteria) {
 
             $filters = array();
             if (isset($criteria['enabled'])) {
-                if ($criteria['enabled'])
-                    $filters += array(
-                            'flags__hasbit' => self::FLAG_ENABLED);
-                else
-                    $filters [] = Q::not(array(
-                                'flags__hasbit' => self::FLAG_ENABLED));
+                $q = new Q(array('flags__hasbit' => self::FLAG_ENABLED));
+                if (!$criteria['enabled'])
+                    $q->negate();
+                $filters[] = $q;
             }
+
             $query = self::objects()
                 ->order_by('name')
                 ->values_flat('id', 'name');
@@ -212,13 +220,20 @@ class Role extends RoleModel {
             if ($filters)
                 $query->filter($filters);
 
+            $localize_this = function($id, $default) use ($localize) {
+                if (!$localize)
+                    return $default;
+                $tag = _H("role.name.{$id}");
+                $T = CustomDataTranslation::translate($tag);
+                return $T != $tag ? $T : $default;
+            };
+
             $names = array();
             foreach ($query as $row)
-                $names[$row[0]] = $row[1];
-
-            // TODO: Localize
+                $names[$row[0]] = $localize_this($row[0], $row[1]);
 
-            if ($criteria) return $names;
+            if ($criteria || !$localize)
+                return $names;
 
             $roles = $names;
         }
diff --git a/include/class.topic.php b/include/class.topic.php
index 375b6f2d165e7ed6998849ab34f149888cd43634..5adc575635e0fc40f214778ad4da2d2622948177 100644
--- a/include/class.topic.php
+++ b/include/class.topic.php
@@ -296,15 +296,6 @@ class Topic extends VerySimpleModel {
                 return $T != $tag ? $T : $default;
             };
 
-            $localize_this = function($id, $default) use ($localize) {
-                if (!$localize)
-                    return $default;
-
-                $tag = _H("topic.name.{$id}");
-                $T = CustomDataTranslation::translate($tag);
-                return $T != $tag ? $T : $default;
-            };
-
             // Resolve parent names
             foreach ($topics as $id=>$info) {
                 $name = $localize_this($id, $info['topic']);
diff --git a/include/staff/role.inc.php b/include/staff/role.inc.php
index 49e1fff6a49fe46fc5d8e9dbe51c1e207db6711d..e36b87073bd0132507967d1b11a822f931ac12d4 100644
--- a/include/staff/role.inc.php
+++ b/include/staff/role.inc.php
@@ -6,6 +6,7 @@ if ($role) {
     $action = 'update';
     $submit_text = __('Save Changes');
     $info = $role->getInfo();
+    $trans['name'] = $role->getTranslateTag('name');
     $newcount=2;
 } else {
     $title = __('Add New Role');
@@ -48,7 +49,7 @@ $info = Format::htmlchars(($errors && $_POST) ? array_merge($info, $_POST) : $in
             <td width="180" class="required"><?php echo __('Name'); ?>:</td>
             <td>
                 <input size="50" type="text" name="name" value="<?php echo
-                $info['name']; ?>"/>
+                $info['name']; ?>" data-translate-tag="<?php echo $trans['name']; ?>"/>
                 <span class="error">*&nbsp;<?php echo $errors['name']; ?></span>
             </td>
         </tr>
diff --git a/include/staff/roles.inc.php b/include/staff/roles.inc.php
index 6ce76f7dc16702c24fc12e69710fc2d4cc9ed1d9..49ba6d87caa7d4e234e4359e720536b54f05fa69 100644
--- a/include/staff/roles.inc.php
+++ b/include/staff/roles.inc.php
@@ -51,7 +51,7 @@ $showing=$pageNav->showing().' '._N('role', 'roles', $count);
                 ?>
             </td>
             <td><a href="?id=<?php echo $id; ?>"><?php echo
-            $role->getName(); ?></a></td>
+            $role->getLocal('name'); ?></a></td>
             <td>&nbsp;<?php echo $role->isEnabled() ? __('Active') :
             '<b>'.__('Disabled').'</b>'; ?></td>
             <td><?php echo Format::date($role->getCreateDate()); ?></td>