From 94a2dce1041ca235236b7f1ec2b6ce08536b3cd4 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Fri, 18 May 2012 16:24:00 +0200 Subject: [PATCH] Improved translations. --- app/assets/javascripts/app/index.js.coffee | 83 +++++++++++----- .../app/models/translation.js.coffee | 3 + app/controllers/translations_controller.rb | 64 +++++++++++++ app/models/translation.rb | 8 ++ .../20120101000100_create_translation.rb | 17 ++++ db/seeds.rb | 94 +++++++++++++++++++ 6 files changed, 245 insertions(+), 24 deletions(-) create mode 100644 app/assets/javascripts/app/models/translation.js.coffee create mode 100644 app/controllers/translations_controller.rb create mode 100644 app/models/translation.rb create mode 100644 db/migrate/20120101000100_create_translation.rb diff --git a/app/assets/javascripts/app/index.js.coffee b/app/assets/javascripts/app/index.js.coffee index c917ef218..d318b1044 100644 --- a/app/assets/javascripts/app/index.js.coffee +++ b/app/assets/javascripts/app/index.js.coffee @@ -147,18 +147,73 @@ class App.i18n extends App.Ajax # @include App.Ajax constructor: -> - @set('de') + @locale = 'de' + @set( @locale ) window.T = @translate_content window.Ti = @translate_inline - + +# $('.translation [contenteditable]') + $('body') + .delegate '.translation', 'focus', (e) => + $this = $(e.target) + $this.data 'before', $this.html() +# console.log('11111current', $this.html()) + return $this +# .delegate '.translation', 'blur keyup paste', (e) => + .delegate '.translation', 'blur', (e) => + $this = $(e.target) + source = $this.attr('data-text') + + # get new translation + translation_new = $this.html() + translation_new = ('' + translation_new) + .replace(/<.+?>/g, '') + + # set new translation + $this.html(translation_new) + + # update translation + return if $this.data('before') is translation_new + console.log 'Translation Update', translation_new, $this.data 'before' + $this.data 'before', translation_new + + # update runtime translation map + @map[ source ] = translation_new + + # replace rest in page + $(".translation[data-text='#{source}']").html( translation_new ) + + # update permanent translation map + translation = App.Translation.findByAttribute( 'source', source ) + if translation + translation.updateAttribute( 'target', translation_new ) + else + translation = new App.Translation + translation.load( + locale: @locale, + source: source, + target: translation_new, + ) + translation.save() + + return $this + set: (locale) => @map = {} @ajax( type: 'GET', - url: '/' + locale + '.json', + url: '/translations/lang/' + locale, async: false, success: (data, status, xhr) => - @map = data + + # load translation collection + for object in data + + @map[ object[1] ] = object[2] + + # load in collection if needed + App.Translation.refresh( { id: object[0], source: object[1], target: object[2], locale: @locale }, options: { clear: true } ) + error: (xhr, statusText, error) => console.log 'error', error, statusText, xhr.statusCode ) @@ -231,26 +286,6 @@ class App.Run extends Spine.Controller window.Session['UISeletion'] = @getSelected() + '' ) -# $('.translation [contenteditable]') - $('.translation') - .live 'focus', -> - $this = $(this) - $this.data 'before', $this.html() - console.log('11111before', $this.html()) - return $this - .live 'blur keyup paste', -> -# .live 'blur', -> - $this = $(this) - if $this.data('before') isnt $this.html() - $this.data 'before', $this.html() - $this.trigger('change') - console.log('111changed', $this.html(), $this.attr('data-text') ) - a = $this.html() - a = ('' + a) - .replace(/<.+?>/g, '') - $this.html(a) - return $this - # @ws = new WebSocket("ws://localhost:3001/"); # Set event handlers. diff --git a/app/assets/javascripts/app/models/translation.js.coffee b/app/assets/javascripts/app/models/translation.js.coffee new file mode 100644 index 000000000..293513495 --- /dev/null +++ b/app/assets/javascripts/app/models/translation.js.coffee @@ -0,0 +1,3 @@ +class App.Translation extends App.Model + @configure 'Translation', 'source', 'target', 'locale' + @extend Spine.Model.Ajax \ No newline at end of file diff --git a/app/controllers/translations_controller.rb b/app/controllers/translations_controller.rb new file mode 100644 index 000000000..2e6f415d0 --- /dev/null +++ b/app/controllers/translations_controller.rb @@ -0,0 +1,64 @@ +class TranslationsController < ApplicationController + before_filter :authentication_check, :except => [:load] + + # GET /translations/:lang + def load + translations = Translation.where( :locale => params[:locale] ) + + list = [] + translations.each { |item| + data = [ + item.id, + item.source, + item.target, + ] + list.push data + } + + render :json => list + end + + # GET /translations + def index + @translations = Translation.all + + render :json => @translations + end + + # GET /translations/1 + def show + @translation = Translation.find(params[:id]) + + render :json => @translation + end + + # POST /translations + def create + @translation = Translation.new(params[:translation]) + + if @translation.save + render :json => @translation, :status => :created + else + render :json => @translation.errors, :status => :unprocessable_entity + end + end + + # PUT /translations/1 + def update + @translation = Translation.find(params[:id]) + + if @translation.update_attributes(params[:translation]) + render :json => @translation, :status => :ok + else + render :json => @translation.errors, :status => :unprocessable_entity + end + end + + # DELETE /translations/1 + def destroy + @translation = Translation.find(params[:id]) + @translation.destroy + + head :ok + end +end diff --git a/app/models/translation.rb b/app/models/translation.rb new file mode 100644 index 000000000..432a62f1f --- /dev/null +++ b/app/models/translation.rb @@ -0,0 +1,8 @@ +class Translation < ApplicationModel + before_create :set_initial + + private + def set_initial + self.target_initial = self.target + end +end diff --git a/db/migrate/20120101000100_create_translation.rb b/db/migrate/20120101000100_create_translation.rb new file mode 100644 index 000000000..d6af029e9 --- /dev/null +++ b/db/migrate/20120101000100_create_translation.rb @@ -0,0 +1,17 @@ +class CreateTranslation < ActiveRecord::Migration + def up + create_table :translations do |t| + t.column :locale, :string, :limit => 10, :null => false + t.column :source, :string, :limit => 255, :null => false + t.column :target, :string, :limit => 255, :null => false + t.column :target_initial, :string, :limit => 255, :null => false + t.timestamps + end + add_index :translations, [:source] + add_index :translations, [:locale] + end + + def down + drop_table :translations + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 1bf2b1cfb..926242ea4 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1478,3 +1478,97 @@ Network::Item::Comment.create( :body => 'Some comment....', :created_by_id => User.where(:login => '-').first.id ) + +Translation.create( :locale => 'de', :source => "New", :target => "Neu" ) +Translation.create( :locale => 'de', :source => "Create", :target => "Erstellen" ) +Translation.create( :locale => 'de', :source => "Cancel", :target => "Abbrechen" ) +Translation.create( :locale => 'de', :source => "Submit", :target => "Übermitteln" ) +Translation.create( :locale => 'de', :source => "Sign out", :target => "Abmelden" ) +Translation.create( :locale => 'de', :source => "Profile", :target => "Profil" ) +Translation.create( :locale => 'de', :source => "Settings", :target => "Einstellungen" ) +Translation.create( :locale => 'de', :source => "Overviews", :target => "Übersichten" ) +Translation.create( :locale => 'de', :source => "Manage", :target => "Verwalten" ) +Translation.create( :locale => 'de', :source => "Users", :target => "Benutzer" ) +Translation.create( :locale => 'de', :source => "Groups", :target => "Gruppen" ) +Translation.create( :locale => 'de', :source => "Group", :target => "Gruppe" ) +Translation.create( :locale => 'de', :source => "Organizations", :target => "Organisationen" ) +Translation.create( :locale => 'de', :source => "Organization", :target => "Organisation" ) +Translation.create( :locale => 'de', :source => "Recent Viewed", :target => "Zuletzt angesehen" ) +Translation.create( :locale => 'de', :source => "Security", :target => "Sicherheit" ) +Translation.create( :locale => 'de', :source => "From", :target => "Von" ) +Translation.create( :locale => 'de', :source => "Title", :target => "Titel" ) +Translation.create( :locale => 'de', :source => "Customer", :target => "Kunde" ) +Translation.create( :locale => 'de', :source => "State", :target => "Status" ) +Translation.create( :locale => 'de', :source => "Created", :target => "Erstellt" ) +Translation.create( :locale => 'de', :source => "Attributes", :target => "Attribute" ) +Translation.create( :locale => 'de', :source => "Direction", :target => "Richtung" ) +Translation.create( :locale => 'de', :source => "Owner", :target => "Besitzer" ) +Translation.create( :locale => 'de', :source => "Subject", :target => "Betreff" ) +Translation.create( :locale => 'de', :source => "Priority", :target => "Priorität" ) +Translation.create( :locale => 'de', :source => "Select the customer of the Ticket or create one.", :target => "Wähle den Kunden eine Tickets oder erstell einen neuen." ) +Translation.create( :locale => 'de', :source => "New Ticket", :target => "Neues Ticket" ) +Translation.create( :locale => 'de', :source => "Firstname", :target => "Vorname" ) +Translation.create( :locale => 'de', :source => "Lastname", :target => "Nachname" ) +Translation.create( :locale => 'de', :source => "Phone", :target => "Telefon" ) +Translation.create( :locale => 'de', :source => "Street", :target => "Straße" ) +Translation.create( :locale => 'de', :source => "Zip", :target => "PLZ" ) +Translation.create( :locale => 'de', :source => "City", :target => "Stadt" ) +Translation.create( :locale => 'de', :source => "Note", :target => "Notiz" ) +Translation.create( :locale => 'de', :source => "note", :target => "Notiz" ) +Translation.create( :locale => 'de', :source => "New User", :target => "Neuer Benutzer" ) +Translation.create( :locale => 'de', :source => "new", :target => "neu" ) +Translation.create( :locale => 'de', :source => "closed", :target => "geschlossen" ) +Translation.create( :locale => 'de', :source => "open", :target => "offen" ) +Translation.create( :locale => 'de', :source => "pending", :target => "warten" ) +Translation.create( :locale => 'de', :source => "Activity Stream", :target => "Aktivitäts-Stream" ) +Translation.create( :locale => 'de', :source => "updated", :target => "aktuallisierte" ) +Translation.create( :locale => 'de', :source => "My assigned Tickets", :target => "Meine zugewisenen Tickets" ) +Translation.create( :locale => 'de', :source => "Unassigned Tickets", :target => "Nicht zugewisene/freie Tickets" ) +Translation.create( :locale => 'de', :source => "All Tickets", :target => "Alle Tickets" ) +Translation.create( :locale => 'de', :source => "Escalated Tickets", :target => "Eskallierte Tickets" ) +Translation.create( :locale => 'de', :source => "My pending reached Tickets", :target => "Meine warten erreicht Tickets" ) +Translation.create( :locale => 'de', :source => "Password", :target => "Passwort" ) +Translation.create( :locale => 'de', :source => "Password (confirm)", :target => "Passwort (bestätigen)" ) +Translation.create( :locale => 'de', :source => "Roles", :target => "Rollen" ) +Translation.create( :locale => 'de', :source => "Active", :target => "Aktiv" ) +Translation.create( :locale => 'de', :source => "Edit", :target => "Bearbeiten" ) +Translation.create( :locale => 'de', :source => "Base", :target => "Basis" ) +Translation.create( :locale => 'de', :source => "Number", :target => "Nummer" ) +Translation.create( :locale => 'de', :source => "Sender Format", :target => "Absender Format" ) +Translation.create( :locale => 'de', :source => "Authentication", :target => "Authorisierung" ) +Translation.create( :locale => 'de', :source => "Product Name", :target => "Produkt Name" ) +Translation.create( :locale => 'de', :source => "To", :target => "An" ) +Translation.create( :locale => 'de', :source => "Customer", :target => "Kunde" ) +Translation.create( :locale => 'de', :source => "Linked Accounts", :target => "Verknüpfte Accounts" ) +Translation.create( :locale => 'de', :source => "Sign in with", :target => "Anmelden mit" ) +Translation.create( :locale => 'de', :source => "Username or email", :target => "Benutzer oder Email" ) +Translation.create( :locale => 'de', :source => "Remember me", :target => "An mich erinnern" ) +Translation.create( :locale => 'de', :source => "Forgot password?", :target => "Passwort vergessen?" ) +Translation.create( :locale => 'de', :source => "Sign in using", :target => "Anmelden über" ) +Translation.create( :locale => 'de', :source => "New to", :target => "Neu bei" ) +Translation.create( :locale => 'de', :source => "join today!", :target => "werde Teil!" ) +Translation.create( :locale => 'de', :source => "Sign up", :target => "Registrieren" ) +Translation.create( :locale => 'de', :source => "Sign in", :target => "Anmelden" ) +Translation.create( :locale => 'de', :source => "Create my account", :target => "Meinen Account erstellen" ) +Translation.create( :locale => 'de', :source => "Login successfully! Have a nice day!", :target => "Anmeldung erfolgreich!" ) +Translation.create( :locale => 'de', :source => "Last contact", :target => "Letzter Kontakt" ) +Translation.create( :locale => 'de', :source => "Last contact (Agent)", :target => "Letzter Kontakt (Agent)" ) +Translation.create( :locale => 'de', :source => "Last contact (Customer)", :target => "Letzter Kontakt (Kunde)" ) +Translation.create( :locale => 'de', :source => "Close time", :target => "Schließzeit" ) +Translation.create( :locale => 'de', :source => "First response", :target => "Erste Reaktion" ) +Translation.create( :locale => 'de', :source => "Ticket %s created!", :target => "Ticket %s erstellt!" ) +Translation.create( :locale => 'de', :source => "day", :target => "Tag" ) +Translation.create( :locale => 'de', :source => "days", :target => "Tage" ) +Translation.create( :locale => 'de', :source => "hour", :target => "Stunde" ) +Translation.create( :locale => 'de', :source => "hours", :target => "Stunden" ) +Translation.create( :locale => 'de', :source => "minute", :target => "Minute" ) +Translation.create( :locale => 'de', :source => "minutes", :target => "Minuten" ) +Translation.create( :locale => 'de', :source => "See more", :target => "mehr anzeigen" ) +Translation.create( :locale => 'de', :source => "Search", :target => "Suche" ) +Translation.create( :locale => 'de', :source => "Forgot your password?", :target => "Passwort vergessen?" ) +Translation.create( :locale => 'de', :source => "Templates", :target => "Vorlagen" ) +Translation.create( :locale => 'de', :source => "Delete", :target => "Löschen" ) +Translation.create( :locale => 'de', :source => "Apply", :target => "Übernehmen" ) +Translation.create( :locale => 'de', :source => "Save as Template", :target => "Als Template speichern" ) +Translation.create( :locale => 'de', :source => "Save", :target => "Speichern" ) +#Translation.create( :locale => 'de', :source => "", :target => "" )