translation_center 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/assets/javascripts/translation_center/application.js +15 -0
- data/app/assets/javascripts/translation_center/routes.js +1 -0
- data/app/assets/stylesheets/translation_center/application.css +5 -1
- data/app/controllers/translation_center/translation_keys_controller.rb +18 -2
- data/app/views/layouts/translation_center/application.html.haml +16 -1
- data/app/views/translation_center/translation_keys/show.html.haml +5 -1
- data/config/routes.rb +3 -0
- data/lib/translation_center/translation_helpers.rb +5 -3
- data/lib/translation_center/version.rb +1 -1
- data/test/dummy/config/locales/ar.yml +10 -0
- data/test/dummy/config/locales/de.yml +11 -1
- data/test/dummy/config/locales/en.yml +51 -12
- metadata +1 -1
|
@@ -39,4 +39,19 @@ $(document).ready(function(){
|
|
|
39
39
|
|
|
40
40
|
$('.dropdown-toggle').dropdown()
|
|
41
41
|
|
|
42
|
+
// search for key with that name and jump to it when clicked
|
|
43
|
+
$('#search_keys').typeahead({
|
|
44
|
+
// note that "value" is the default setting for the property option
|
|
45
|
+
source: function (query, process) {
|
|
46
|
+
return $.get(Routes['translation_center_search_translation_keys_path'] + '.json', { query: query }, function (data) {
|
|
47
|
+
return process(data);
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
updater: function(item) {
|
|
51
|
+
document.location = Routes['translation_center_search_translation_keys_path'] + '?search_key_name=' + item
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
|
|
42
57
|
});
|
|
@@ -3,6 +3,7 @@ Routes = {
|
|
|
3
3
|
translation_center_set_lang_to_path: translation_center_root + 'set_language_to/',
|
|
4
4
|
translation_center_set_lang_from_path: translation_center_root + 'set_language_from/',
|
|
5
5
|
translation_center_search_activity_path: translation_center_root + 'search_activity',
|
|
6
|
+
translation_center_search_translation_keys_path: translation_center_root + '/translation_keys/search',
|
|
6
7
|
translation_center_translation_key_path: function(id) { translation_center_root + 'translation_keys/' + id },
|
|
7
8
|
translation_center_category_more_keys_path: function(id) { return translation_center_root + 'categories/' + id + '/more_keys' },
|
|
8
9
|
translation_center_translation_accept_path: function(id) { return translation_center_root + 'translations/' + id + '/accept' },
|
|
@@ -23,10 +23,14 @@
|
|
|
23
23
|
.navbar span {
|
|
24
24
|
margin-left: 5px;
|
|
25
25
|
}
|
|
26
|
-
.navbar .brand,.navbar span, .navbar .nav > li > a {
|
|
26
|
+
.navbar .brand,.navbar span, .navbar .nav > li > a, .navbar a, .navbar .nav_text {
|
|
27
27
|
color: white !important;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
.navbar li.dropdown ul.dropdown-menu a.language_to {
|
|
31
|
+
color: black !important;
|
|
32
|
+
}
|
|
33
|
+
|
|
30
34
|
.navbar-inner {
|
|
31
35
|
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #009ED2), color-stop(100%, #008CBA)) !important;
|
|
32
36
|
}
|
|
@@ -2,7 +2,7 @@ require_dependency "translation_center/application_controller"
|
|
|
2
2
|
|
|
3
3
|
module TranslationCenter
|
|
4
4
|
class TranslationKeysController < ApplicationController
|
|
5
|
-
before_filter :get_translation_key
|
|
5
|
+
before_filter :get_translation_key, except: [ :search ]
|
|
6
6
|
before_filter :can_admin?, only: [ :destroy, :update ]
|
|
7
7
|
|
|
8
8
|
# POST /translation_keys/1/update_translation.js
|
|
@@ -73,13 +73,29 @@ module TranslationCenter
|
|
|
73
73
|
# DELETE /translation_keys/1
|
|
74
74
|
# DELETE /translation_keys/1.json
|
|
75
75
|
def destroy
|
|
76
|
-
@
|
|
76
|
+
@category = @translation_key.category
|
|
77
77
|
@translation_key_id = @translation_key.id
|
|
78
78
|
@key_status = @translation_key.status(session[:lang_to])
|
|
79
79
|
@translation_key.destroy
|
|
80
80
|
|
|
81
81
|
respond_to do |format|
|
|
82
82
|
format.js
|
|
83
|
+
format.html {redirect_to @category, notice: I18n.t('translation_center.translation_keys.destroyed_successfully')}
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# GET /translation_keys/search.json
|
|
88
|
+
def search
|
|
89
|
+
# if full name provided then get the key and redirect to it, otherwise return similar in json
|
|
90
|
+
if params[:search_key_name].present?
|
|
91
|
+
@translation_key = TranslationKey.find_by_name(params[:search_key_name])
|
|
92
|
+
else
|
|
93
|
+
@key_names = TranslationKey.where('name LIKE ?', "%#{params[:query]}%")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
respond_to do |format|
|
|
97
|
+
format.html { redirect_to @translation_key}
|
|
98
|
+
format.json { render json: @key_names.map(&:name) }
|
|
83
99
|
end
|
|
84
100
|
end
|
|
85
101
|
|
|
@@ -51,12 +51,27 @@
|
|
|
51
51
|
= language_name(locale)
|
|
52
52
|
- if translation_admin?
|
|
53
53
|
.pull-left.nav_text
|
|
54
|
-
|
|
54
|
+
%span
|
|
55
|
+
= link_to t('translation_center.dashboard'), dashboard_path
|
|
56
|
+
%li.divider-vertical
|
|
57
|
+
%form.navbar-search
|
|
58
|
+
%input#search_keys.search-query{placeholder: t('translation_center.search_keys'), type: "text", autocomplete: :off}
|
|
55
59
|
|
|
56
60
|
%ul.nav.pull-right
|
|
57
61
|
%li
|
|
58
62
|
= link_to t('translation_center.back_to_app'), main_app.root_path, target: Rails.application.class.parent_name
|
|
63
|
+
- if flash[:alert]
|
|
64
|
+
.alert.alert-error
|
|
65
|
+
%button{ type: 'button', class: 'close', 'data-dismiss' => 'alert' }
|
|
66
|
+
×
|
|
67
|
+
= flash[:alert]
|
|
59
68
|
|
|
69
|
+
- if flash[:notice]
|
|
70
|
+
.alert.alert-success
|
|
71
|
+
%button{ type: 'button', class: 'close', 'data-dismiss' => 'alert' }
|
|
72
|
+
×
|
|
73
|
+
= flash[:notice]
|
|
74
|
+
|
|
60
75
|
.container
|
|
61
76
|
.row
|
|
62
77
|
.span12
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
= link_to t('.back_to_category'), @translation_key.category
|
|
1
|
+
= link_to "#{t('.back_to_category')} #{@translation_key.category.name.titleize}", @translation_key.category, class: 'btn btn-primary'
|
|
2
|
+
|
|
2
3
|
%h1
|
|
3
4
|
= @translation_key.name
|
|
5
|
+
- if translation_admin?
|
|
6
|
+
= link_to t('.destroy'), @translation_key, method: :delete, data: { confirm: t('actions.are_you_sure', :default => 'Are you sure?') }, class: 'btn btn-danger'
|
|
7
|
+
|
|
4
8
|
= render 'translation_center/translation_keys/show', translation_key: @translation_key, index: 0
|
data/config/routes.rb
CHANGED
|
@@ -31,7 +31,8 @@ module TranslationCenter
|
|
|
31
31
|
|
|
32
32
|
# wraps a span if inspector option is set to all
|
|
33
33
|
def wrap_span(translation, translation_key)
|
|
34
|
-
if
|
|
34
|
+
# put the inspector class if inspector is all and the key doesn't belongs to translation_center
|
|
35
|
+
if TranslationCenter::CONFIG['inspector'] == 'all' && translation_key.name.split('.').first != 'translation_center'
|
|
35
36
|
"<span class='tc-inspector-key' data-type='#{translation_key.status(I18n.locale)}' data-id='#{translation_key.id}'> #{translation} </span>".html_safe
|
|
36
37
|
else
|
|
37
38
|
translation
|
|
@@ -96,9 +97,10 @@ module I18n
|
|
|
96
97
|
translation_key = keys
|
|
97
98
|
# remove locale
|
|
98
99
|
translation_key.shift
|
|
99
|
-
translation_key = TranslationCenter::TranslationKey.find_by_name(translation_key.join('.'))
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
translation_key = TranslationCenter::TranslationKey.find_by_name(translation_key.join('.'))
|
|
102
|
+
# don't put the inspector class if inspector is off or the key belongs to translation_center
|
|
103
|
+
if TranslationCenter::CONFIG['inspector'] == 'off' || translation_key.name.split('.').first == 'translation_center'
|
|
102
104
|
%(<span class="translation_missing" title="translation missing: #{keys.join('.')}">#{key}</span>)
|
|
103
105
|
else
|
|
104
106
|
%(<span class="translation_missing tc-inspector-key" data-type="#{translation_key.status(I18n.locale)}" data-id="#{translation_key.id}" title="translation missing: #{keys.join('.')}">#{key}</span>)
|
|
@@ -9,6 +9,16 @@ ar:
|
|
|
9
9
|
errors:
|
|
10
10
|
messages:
|
|
11
11
|
taken: محجوز
|
|
12
|
+
attributes:
|
|
13
|
+
email: "البريد الالكترونى"
|
|
14
|
+
password: "كلمة السر"
|
|
15
|
+
title: عنوان
|
|
16
|
+
layouts:
|
|
17
|
+
translation_center:
|
|
18
|
+
application:
|
|
19
|
+
back_to_app: "العودة إلى الموق"
|
|
20
|
+
to: إلى
|
|
21
|
+
translate_to: "ترجم إلى"
|
|
12
22
|
posts:
|
|
13
23
|
index:
|
|
14
24
|
Content: المحتوى
|
|
@@ -3,20 +3,12 @@ en:
|
|
|
3
3
|
actions:
|
|
4
4
|
are_you_sure: "Are you sure ?"
|
|
5
5
|
activerecord:
|
|
6
|
-
attributes:
|
|
7
|
-
post:
|
|
8
|
-
content: Content
|
|
9
|
-
title: Title
|
|
10
|
-
translation_center/translation_key:
|
|
11
|
-
name: Name
|
|
12
|
-
user:
|
|
13
|
-
email: Email
|
|
14
|
-
password: Password
|
|
15
|
-
remember_me: "Remember Me"
|
|
6
|
+
attributes: Attributes
|
|
16
7
|
errors:
|
|
17
8
|
messages:
|
|
18
9
|
record_invalid: "Validation failed: %{errors}"
|
|
19
10
|
taken: "has already been taken"
|
|
11
|
+
models: Models
|
|
20
12
|
attributes:
|
|
21
13
|
content: Content
|
|
22
14
|
email: Email
|
|
@@ -128,6 +120,7 @@ en:
|
|
|
128
120
|
invalid: "Invalid email or password."
|
|
129
121
|
invalid_token: "Invalid authentication token."
|
|
130
122
|
locked: "Your account is locked."
|
|
123
|
+
not_found_in_database: "Invalid email or password."
|
|
131
124
|
timeout: "Your session expired, please sign in again to continue."
|
|
132
125
|
unauthenticated: "You need to sign in or sign up before continuing."
|
|
133
126
|
unconfirmed: "You have to confirm your account before continuing."
|
|
@@ -169,6 +162,7 @@ en:
|
|
|
169
162
|
already_confirmed: "was already confirmed, please try signing in"
|
|
170
163
|
blank: "can't be blank"
|
|
171
164
|
confirmation: "doesn't match confirmation"
|
|
165
|
+
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
|
172
166
|
empty: "can't be empty"
|
|
173
167
|
equal_to: "must be equal to %{count}"
|
|
174
168
|
even: "must be even"
|
|
@@ -196,6 +190,11 @@ en:
|
|
|
196
190
|
create: "Create %{model}"
|
|
197
191
|
submit: "Save %{model}"
|
|
198
192
|
update: "Update %{model}"
|
|
193
|
+
label:
|
|
194
|
+
user:
|
|
195
|
+
email: Email
|
|
196
|
+
password: Password
|
|
197
|
+
remember_me: "Remember Me"
|
|
199
198
|
select:
|
|
200
199
|
prompt: "Please select"
|
|
201
200
|
submit:
|
|
@@ -211,6 +210,7 @@ en:
|
|
|
211
210
|
to: To
|
|
212
211
|
translate_to: "Translate To"
|
|
213
212
|
meta_search:
|
|
213
|
+
created_at_gteq: "Created At Gteq"
|
|
214
214
|
or: or
|
|
215
215
|
predicates:
|
|
216
216
|
contains: "%{attribute} contains"
|
|
@@ -282,13 +282,13 @@ en:
|
|
|
282
282
|
delimiter: ""
|
|
283
283
|
post:
|
|
284
284
|
content: Content
|
|
285
|
-
title: Title
|
|
286
285
|
posts:
|
|
287
286
|
index:
|
|
288
287
|
Content: Content
|
|
289
|
-
Listing_posts: "Listing Posts"
|
|
290
288
|
Title: Title
|
|
291
289
|
testing_new_keys: "Testing New Keys"
|
|
290
|
+
search:
|
|
291
|
+
created_at_gteq: "Created At Gteq"
|
|
292
292
|
support:
|
|
293
293
|
array:
|
|
294
294
|
last_word_connector: ", and "
|
|
@@ -318,13 +318,51 @@ en:
|
|
|
318
318
|
pending: Pending
|
|
319
319
|
translated: Translated
|
|
320
320
|
untranslated: Untranslated
|
|
321
|
+
center:
|
|
322
|
+
activity:
|
|
323
|
+
ago: Ago
|
|
324
|
+
changes: Changes
|
|
325
|
+
key: Key
|
|
326
|
+
locale: Locale
|
|
327
|
+
no_matches: "No Matches"
|
|
328
|
+
time: Time
|
|
329
|
+
user: User
|
|
330
|
+
dashboard:
|
|
331
|
+
activity: Activity
|
|
332
|
+
ago: Ago
|
|
333
|
+
all: All
|
|
334
|
+
changes: Changes
|
|
335
|
+
choose_filter: "Choose Filter"
|
|
336
|
+
dashboard: Dashboard
|
|
337
|
+
date: Date
|
|
338
|
+
filter: Filter
|
|
339
|
+
filter_by: "Filter By"
|
|
340
|
+
key: Key
|
|
341
|
+
language: Language
|
|
342
|
+
locale: Locale
|
|
343
|
+
pending: Pending
|
|
344
|
+
progress: Progress
|
|
345
|
+
reset: Reset
|
|
346
|
+
search: Search
|
|
347
|
+
search_by: "Search By"
|
|
348
|
+
select_locale: "Select Locale"
|
|
349
|
+
time: Time
|
|
350
|
+
to: To
|
|
351
|
+
translated: Translated
|
|
352
|
+
untranslated: Untranslated
|
|
353
|
+
user: User
|
|
354
|
+
dashboard: Dashboard
|
|
355
|
+
search_keys: "Search Keys"
|
|
321
356
|
translate_to: "Translate To"
|
|
322
357
|
translation_center: "Translation Center"
|
|
323
358
|
translation_keys:
|
|
359
|
+
destroyed_successfully: "Translation key was destroyed successfully"
|
|
324
360
|
show:
|
|
325
361
|
Add/Edit_Translation: "Add/Edit Translation"
|
|
326
362
|
Add_Translation: "Add Translation"
|
|
327
363
|
Translations: Translations
|
|
364
|
+
back_to_category: "Back To"
|
|
365
|
+
destroy: Destroy
|
|
328
366
|
no_translations_available: "No Translations Available"
|
|
329
367
|
show_keys:
|
|
330
368
|
translated: Translated
|
|
@@ -364,6 +402,7 @@ en:
|
|
|
364
402
|
password: Password
|
|
365
403
|
remember_me: "Remember Me"
|
|
366
404
|
signed_in: "Signed In"
|
|
405
|
+
unauthenticated: Unauthenticated
|
|
367
406
|
will_paginate:
|
|
368
407
|
next_label: "Next →"
|
|
369
408
|
page_entries_info:
|