diff --git a/include/ajax.i18n.php b/include/ajax.i18n.php
index fdb5196d11109bf366b4575c86ba0fc012b99440..38793902e4405e5451c27da173a808f0bda69532 100644
--- a/include/ajax.i18n.php
+++ b/include/ajax.i18n.php
@@ -105,7 +105,12 @@ class i18nAjaxAPI extends AjaxController {
 
         $langs = array();
         foreach ($cfg->getSecondaryLanguages() as $l) {
-            $langs[$l] = Internationalization::getLanguageDescription($l);
+            $info = Internationalization::getLanguageInfo($l);
+            $langs[$l] = array(
+                'name' => Internationalization::getLanguageDescription($l),
+                'flag' => strtolower($info['flag']),
+                'direction' => $info['direction'] ?: 'ltr',
+            );
         }
         $json = JsonDataEncoder::encode($langs);
         Http::cacheable(md5($json), $cfg->lastModified());
diff --git a/scp/css/translatable.css b/scp/css/translatable.css
index 09054447553e6ed867e4d1fe60a4a4e99e9bd369..712a0cdbf2c838489a95fc5fc1782cb422e4044b 100644
--- a/scp/css/translatable.css
+++ b/scp/css/translatable.css
@@ -1,23 +1,57 @@
 
 div.add-translation {
-  margin-top: 5px;
   padding: 5px;
   border-top: 1px solid rgba(0, 0, 0, 0.3);
+  background-color:#eee;
+  border-radius:0 0 5px 5px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.08);
+}
+div.add-translation button {
+  margin-left: 5px;
 }
 
 div.translations {
   min-height: 20px;
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  float: left;
+  display: none;
+  min-width: 160px;
+  padding: 4px 0 0;
+  margin: 0;
+  list-style: none;
+  background-color: #ffffff;
+  border-color: #ccc;
+  border-color: rgba(0, 0, 0, 0.2);
+  border-style: solid;
+  border-width: 1px;
+  -webkit-border-radius: 0 0 5px 5px;
+  -moz-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
 }
 div.translations .close {
   position:absolute;
   right:3px;
   top:3px;
+  cursor: pointer;
 }
 ul.translations {
   padding-left: 0;
   min-width: 300px;
   max-height: 150px;
   overflow-y: auto;
+  padding: 5px 8px 8px;
+  margin: 0;
 }
 ul.translations li {
   list-style: none;
@@ -29,33 +63,55 @@ ul.translations li + li {
   margin-top: 10px;
 }
 ul.translations li label.language {
-  color: #888;
+  color: black;
+  font-weight: 400;
+  letter-spacing: 0;
+}
+ul.translations li label.language .flag {
+  margin-right: 6px;
 }
 ul.translations li input {
   width: 100%;
   box-sizing: border-box;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.08);
+  padding: 2px 4px;
+  border-radius: 3px;
+  border: 1px solid #bbb;
+  font-size: 12px;
+  font-weight: 300;
+  margin-top: 4px;
 }
 .language-commit {
   text-align: right;
   padding: 5px 10px;
   background-color: cyan;
+  background: repeating-linear-gradient(
+    45deg,
+    rgba(255, 255, 255, 0.05),
+    rgba(255, 255, 255, 0.05) 10px,
+    rgba(255, 255, 255, 0.3) 10px,
+    rgba(255, 255, 255, 0.3) 20px
+  ), #E65524;
 }
 
 
 div.translatable {
-  -webkit-appearance: textfield;
+  border: 1px solid #bbb;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
   display: inline-block;
   white-space: nowrap;
   border-top-left-radius: 4px;
   border-bottom-left-radius: 4px;
   border-right: none;
-  padding: 3px 5px;
+  padding: 0 5px 2px;
   margin-left: 2px;
   width: inherit;
   background-color: white;
 }
 div.translatable.textarea {
-  -webkit-appearance: textarea;
+  border: 1px solid #bbb;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+  border-radius: 4px;
 }
 div.translatable.focus {
   outline-offset: -2px;
@@ -86,10 +142,12 @@ input.translatable:focus {
 
 button.translatable {
   margin: 0;
-  padding: 3px 4px;
-  border: 1px outset #999;
-  background-color: #ccc;
-  border-radius: 0 4px 4px 0;
+  padding: 4px 5px;
+  background-color: #444;
+  background:linear-gradient(0deg, #444 0, #888 100%);
+  color: white;
+  border: none;
+  border-radius: 0 2px 2px 0;
   cursor: pointer;
 }
 
@@ -99,6 +157,7 @@ div.translatable.textarea + button.translatable {
   right: 4px;
   border: none;
   background-color: transparent;
+  background: transparent;
   color: #aaa;
   color: rgba(0, 0, 0, 0.5);
   padding-top: 0;
diff --git a/scp/js/jquery.translatable.js b/scp/js/jquery.translatable.js
index 7e06f3fdf4f223b0c9054a565252aba7b0d8cf66..b937bac7d562e8a056480ed932cc1ece4bbb0fac 100644
--- a/scp/js/jquery.translatable.js
+++ b/scp/js/jquery.translatable.js
@@ -77,7 +77,7 @@
         );
       this.fetch('ajax.php/i18n/langs').then(function(langs) {
         $.each(langs, function(k, v) {
-          self.$select.append($('<option>').val(k).text(v));
+          self.$select.append($('<option>').val(k).text(v.name));
         });
       });
     },
@@ -106,14 +106,19 @@
     },
 
     add: function(lang, text) {
+      var info = this.langs[lang];
       this.$translations.append(
         $('<li>')
-        .append($('<label class="language">').text(this.langs[lang])
+        .append($('<label class="language">')
+          .text(info.name)
+          .prepend($('<span>').addClass('flag flag-'+info.flag))
           .append($('<input type="text" data-lang="'+lang+'">')
-            .on('change', $.proxy(this.showCommit, this))
+            .attr('dir', info.direction || 'ltr')
+            .on('change blur keydown', $.proxy(this.showCommit, this))
             .val(text)
           )
         )
+        .effect('highlight')
       );
       $('option[value='+lang+']', this.$select).remove();
       if (!$('option', this.$select).length)
@@ -122,14 +127,19 @@
     },
 
     showCommit: function(e) {
-      if (this.$commit)
-          return this.$commit.show();
-
+      if (this.$commit) {
+          this.$commit.find('button').empty().text(' Save')
+              .prepend($('<i>').addClass('fa icon-save'));
+          return !this.$commit.is(':visible')
+              ? this.$commit.slideDown() : true;
+      }
       return this.$commit = $('<div class="language-commit"></div>')
+        .hide()
         .insertAfter(this.$translations)
         .append($('<button type="button" class="commit"><i class="fa fa-save icon-save"></i> Save</button>')
           .on('click', $.proxy(this.commit, this))
-        );
+        )
+        .slideDown();
     },
 
     commit: function(e) {
@@ -137,11 +147,14 @@
       $('input[type=text]', this.$translations).each(function() {
         changes[$(this).data('lang')] = $(this).val();
       });
+      this.$commit.prop('disabled', true);
+      this.$commit.find('button').empty().text(' Saving')
+          .prepend($('<i>').addClass('fa icon-spin icon-spinner'));
       $.ajax('ajax.php/i18n/translate/' + this.$element.data('translateTag'), {
         type: 'post',
         data: changes,
         success: function() {
-          self.$commit.hide();
+          self.$commit.slideUp();
         }
       });
     },
@@ -201,7 +214,7 @@
   };
 
   $.fn.translatable.defaults = {
-    menu: '<div class="translations dropdown-menu"></div>',
+    menu: '<div class="translations"></div>',
     button: '<button class="translatable"><i class="fa fa-globe icon-globe"></i></button>'
   };