tml-rails 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +368 -0
- data/Rakefile +61 -0
- data/app/controllers/tml_rails/tools_controller.rb +56 -0
- data/app/views/tml_rails/tags/_language_selector.html.erb +82 -0
- data/app/views/tml_rails/tags/_language_strip.html.erb +20 -0
- data/app/views/tml_rails/tags/_powered_by_trex.html.erb +18 -0
- data/app/views/tml_rails/tags/_scripts.html.erb +44 -0
- data/config/routes.rb +36 -0
- data/lib/i18n/backend/tml.rb +62 -0
- data/lib/tasks/tml.rake +60 -0
- data/lib/tml/cache_adapters/rails.rb +98 -0
- data/lib/tml_rails.rb +41 -0
- data/lib/tml_rails/core/string.rb +44 -0
- data/lib/tml_rails/engine.rb +39 -0
- data/lib/tml_rails/extensions/action_common_methods.rb +131 -0
- data/lib/tml_rails/extensions/action_controller_extension.rb +137 -0
- data/lib/tml_rails/extensions/action_view_extension.rb +188 -0
- data/lib/tml_rails/railtie.rb +52 -0
- data/lib/tml_rails/version.rb +34 -0
- metadata +93 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2015 Translation Exchange Inc. http://translationexchange.com
|
3
|
+
#
|
4
|
+
# _______ _ _ _ ______ _
|
5
|
+
# |__ __| | | | | (_) | ____| | |
|
6
|
+
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
7
|
+
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
8
|
+
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
9
|
+
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
10
|
+
# __/ |
|
11
|
+
# |___/
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
13
|
+
# a copy of this software and associated documentation files (the
|
14
|
+
# "Software"), to deal in the Software without restriction, including
|
15
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
16
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
17
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
18
|
+
# the following conditions:
|
19
|
+
#
|
20
|
+
# The above copyright notice and this permission notice shall be
|
21
|
+
# included in all copies or substantial portions of the Software.
|
22
|
+
#
|
23
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
25
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
27
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
28
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
29
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
30
|
+
#++
|
31
|
+
|
32
|
+
module TmlRails
|
33
|
+
class ToolsController < ApplicationController
|
34
|
+
|
35
|
+
def upgrade
|
36
|
+
Tml.cache.upgrade_version
|
37
|
+
redirect_back
|
38
|
+
end
|
39
|
+
|
40
|
+
def enable
|
41
|
+
tml_toggle_tools(true)
|
42
|
+
redirect_back
|
43
|
+
end
|
44
|
+
|
45
|
+
def disable
|
46
|
+
tml_toggle_tools(false)
|
47
|
+
redirect_back
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def redirect_back
|
53
|
+
redirect_to(request.env['HTTP_REFERER'] || '/')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<% if tml_session.tools_enabled? or type.blank? %>
|
2
|
+
<%
|
3
|
+
if tml_session.tools_enabled?
|
4
|
+
opts[:method] = 'Tml.UI.LanguageSelector.show(); return false;'
|
5
|
+
end
|
6
|
+
%>
|
7
|
+
|
8
|
+
<%= link_to('#',
|
9
|
+
:onclick => (opts[:method] || "alert('Custom language selector can be specified by passing it in the method attribute of the language selector tag.');"),
|
10
|
+
:style => (opts[:style] || 'padding-right:5px;text-decoration:none'),
|
11
|
+
:class => opts[:class]
|
12
|
+
) do %>
|
13
|
+
<% unless opts[:hide_flag] %>
|
14
|
+
<%= image_tag(tml_current_language.flag_url, :style => "align:middle") %>
|
15
|
+
|
16
|
+
<% end %>
|
17
|
+
<% if opts[:language] == :native %>
|
18
|
+
<%= tml_current_language.native_name %>
|
19
|
+
<% elsif opts[:language] == :english %>
|
20
|
+
<%= tml_current_language.english_name %>
|
21
|
+
<% else %>
|
22
|
+
<%= tml_current_language.english_name %>
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
<% elsif type == :list %>
|
27
|
+
<div style="padding-top:10px;">
|
28
|
+
<% tml_application.languages.each_with_index do |lang, index| %>
|
29
|
+
<% next if opts[:limit] and index >= opts[:limit] %>
|
30
|
+
<%= link_to(params.merge(:locale => lang.locale), :style => (opts[:style] || 'padding-right:5px;text-decoration:none'), :class => opts[:class]) do %>
|
31
|
+
<% if opts[:flags_only] or opts[:flags] %>
|
32
|
+
<%= image_tag(lang.flag_url) %>
|
33
|
+
<% end %>
|
34
|
+
<% unless opts[:flags_only] %>
|
35
|
+
<%= lang.english_name %>
|
36
|
+
<% end %>
|
37
|
+
<% end %>
|
38
|
+
<% end %>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<% elsif type == :dropdown %>
|
42
|
+
|
43
|
+
<script>
|
44
|
+
function tml_change_locale(selector) {
|
45
|
+
var query_parts = window.location.href.split('?');
|
46
|
+
var query = query_parts.length > 1 ? query_parts[1] : null;
|
47
|
+
var params = {};
|
48
|
+
if (query) {
|
49
|
+
var vars = query.split('&');
|
50
|
+
for (var i = 0; i < vars.length; i++) {
|
51
|
+
var pair = vars[i].split('=');
|
52
|
+
params[pair[0]] = pair[1];
|
53
|
+
}
|
54
|
+
}
|
55
|
+
params['locale'] = selector.options[selector.selectedIndex].value;
|
56
|
+
|
57
|
+
query = [];
|
58
|
+
var keys = Object.keys(params);
|
59
|
+
for (var i = 0; i < keys.length; i++) {
|
60
|
+
query.push(encodeURIComponent(keys[i]) + "=" + encodeURIComponent(params[keys[i]]));
|
61
|
+
}
|
62
|
+
|
63
|
+
var destination = query_parts[0] + '?' + query.join("&");
|
64
|
+
window.location = destination;
|
65
|
+
}
|
66
|
+
</script>
|
67
|
+
|
68
|
+
<select id="tml_language_selector" onchange="tml_change_locale(this)" style="<%=opts[:style]%>" class="<%=opts[:class]%>">
|
69
|
+
<% tml_application.languages.each do |lang| %>
|
70
|
+
<option dir='ltr' value="<%=lang.locale%>" <%="selected" if lang.locale == tml_current_locale %>>
|
71
|
+
<% if opts[:language] == :native %>
|
72
|
+
<%= lang.native_name %>
|
73
|
+
<% elsif opts[:language] == :english %>
|
74
|
+
<%= lang.english_name %>
|
75
|
+
<% else %>
|
76
|
+
<%= lang.english_name %>
|
77
|
+
<% end %>
|
78
|
+
</option>
|
79
|
+
<% end %>
|
80
|
+
</select>
|
81
|
+
|
82
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<% if Tml.config.enabled? %>
|
2
|
+
<% featured_languages = tml_application.featured_languages %>
|
3
|
+
<% if featured_languages.any? %>
|
4
|
+
<style>
|
5
|
+
.tml_language_strip {text-align:center; color:#777;}
|
6
|
+
.tml_language_strip a {text-decoration:none; color:#777; outline:none; border:0px; font-size:10px;}
|
7
|
+
.tml_language_strip a img {border:0px;}
|
8
|
+
.tml_language_strip a:hover {text-decoration:underline}
|
9
|
+
</style>
|
10
|
+
<div class="tml_language_strip" style="font-size:12px;">
|
11
|
+
<% featured_languages.each do |lang| %>
|
12
|
+
<%= tml_language_name_tag(lang, opts) %>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<% if featured_languages.size > 0 %>
|
16
|
+
<%=link_to_function("»".html_safe, "Tml.UI.LanguageSelector.show()") %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div style="padding-top:40px; color: #ccc; text-align:center; width:100%">
|
2
|
+
<%= tr("Powered by {trex}", :trex => link_to("TranslationExchange.com", "http://translationexchange.com", :style=>"color:#ccc;")) %>
|
3
|
+
|
4
|
+
<style>
|
5
|
+
.trex_logo {
|
6
|
+
margin-top:10px;
|
7
|
+
padding: 40px;
|
8
|
+
background-repeat: no-repeat;
|
9
|
+
background-image:url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABQCAYAAABCiMhGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQTg4MTEyOEU0NkIxMUUzODhCMEJEOUNDRDQ0QkU0MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQTg4MTEyOUU0NkIxMUUzODhCMEJEOUNDRDQ0QkU0MiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJBODgxMTI2RTQ2QjExRTM4OEIwQkQ5Q0NENDRCRTQyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJBODgxMTI3RTQ2QjExRTM4OEIwQkQ5Q0NENDRCRTQyIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+mszKSAAAAqFJREFUeNrsnE1IFVEYhr+53QiKEIkgpCBwJSH9SITkqkVELXJZ0iYIqRaBCZWgoWKikRBI1KVNmyg3gVKQ0CZE+9kHQYukaGP2I6iEP1ffc+dc7iwK5s5Mx3PPvC88zGxm5s4zc85853JmvNardwTxwC1wGuyWdGQGvARduaH23wUJkJHFcgoclnTmKzgIIT8yWOlNsQiVPeB+8c74hmWNMNXqzqimh0JqlIxVeigkr2Tk6aGQtQwdlEIZlEEZlEEZEZONuf0YmASLYNNGPRI1e8FFsHUjZNwAg5Zd3GHwHuw02Uw+WShCZRr0m+4zPljc9D+alpG1WMYW0zJsfgplxMGTYp1BGZRBGZRBGZRBGZRBGZRBGZRBGQxlUAZlUAZlUAZlUAZlUAZlUAZlUIbDMmyeYr3KO6OUJdMyGiyWcdS0DPV+ykMLRRwD16JuHGc60gV9Fd6KP/Vxs/hTEDvBbIT9nQLNEdp8XkpTH0/GMRl3bladJpi7EWQcB89dfLSW24EdAeOsM0T2gQkWXX4bf6P7mlTL2KFFbE97Ob4NvAO70j42UcdTbyHU2jo28Qwe7zXYb2nl6mXE3DzwF6DJ5kGrkjFv4EBP4laHBjKjZDz7zwfJgTOWi3iVG2qfVTKui//ZhMTaXmD9Hmi1XMSf4m9UMubAIfAY/Epg58t62QcuWyxhQfx37A7grvgcHKipgdU5UPWX538LuBlh8Deu+4oVS2X8BN8h4p+j1jlNMOW+5lQ8+QmpsIQpusr5vsYV8EUqNElWoKojHpYKTlIyusFtqfAkIWMA9IgDiStD/cXXIY4kjowHoE0cSlQZj8AlcSxRZDwF58XBhJGxFlgfBWfF0YSR4QXK62ZxOGFk1OtR7QlxPGFkjIBGSUHWBRgAlJNpO4bVinwAAAAASUVORK5CYII=);
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
|
13
|
+
<div style="text-align: center">
|
14
|
+
<%=link_to('http://translationexchange.com') do %>
|
15
|
+
<img class="trex_logo" src="" alt="" />
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<% if Tml.config.enabled? %>
|
2
|
+
<style type="text/css">
|
3
|
+
.tml_fltr {<%=tml_style_attribute_tag('float', 'right')%> !important;}
|
4
|
+
.tml_fltl {<%=tml_style_attribute_tag('float', 'left')%> !important;}
|
5
|
+
.tml_txtr {<%=tml_style_attribute_tag('text-align', 'right')%> !important;}
|
6
|
+
.tml_txtl {<%=tml_style_attribute_tag('text-align', 'left')%> !important;}
|
7
|
+
<%= tml_application.css %>
|
8
|
+
</style>
|
9
|
+
|
10
|
+
<% if tml_session.tools_enabled? %>
|
11
|
+
<script>
|
12
|
+
(function() {
|
13
|
+
if (window.tml_already_initialized) return;
|
14
|
+
window.tml_already_initialized = true;
|
15
|
+
|
16
|
+
var script = window.document.createElement('script');
|
17
|
+
script.setAttribute('id', 'tml-tools');
|
18
|
+
script.setAttribute('type', 'application/javascript');
|
19
|
+
script.setAttribute('src', '<%= tml_application.tools['javascript'] %>');
|
20
|
+
script.setAttribute('charset', 'UTF-8');
|
21
|
+
script.onload = function() {
|
22
|
+
Tml.Utils.insertCSS(window.document, "<%= tml_application.tools['stylesheet'] %>", false);
|
23
|
+
Tml.app_key = '<%= tml_application.key %>';
|
24
|
+
Tml.host = '<%= tml_application.tools['host'] %>';
|
25
|
+
Tml.locale = '<%= tml_current_language.locale %>';
|
26
|
+
Tml.sources = [];
|
27
|
+
<%
|
28
|
+
if tml_application.feature_enabled?(:shortcuts)
|
29
|
+
tml_application.shortcuts.each do |key, script|
|
30
|
+
%>
|
31
|
+
shortcut.add('<%=key.html_safe%>', function() {<%= script.html_safe %>});
|
32
|
+
<%
|
33
|
+
end
|
34
|
+
end
|
35
|
+
%>
|
36
|
+
if (typeof(tml_on_ready) === 'function') {
|
37
|
+
tml_on_ready();
|
38
|
+
}
|
39
|
+
};
|
40
|
+
window.document.getElementsByTagName('head')[0].appendChild(script);
|
41
|
+
})();
|
42
|
+
</script>
|
43
|
+
<% end %>
|
44
|
+
<% end %>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2015 Translation Exchange Inc. http://translationexchange.com
|
3
|
+
#
|
4
|
+
# _______ _ _ _ ______ _
|
5
|
+
# |__ __| | | | | (_) | ____| | |
|
6
|
+
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
7
|
+
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
8
|
+
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
9
|
+
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
10
|
+
# __/ |
|
11
|
+
# |___/
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
13
|
+
# a copy of this software and associated documentation files (the
|
14
|
+
# "Software"), to deal in the Software without restriction, including
|
15
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
16
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
17
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
18
|
+
# the following conditions:
|
19
|
+
#
|
20
|
+
# The above copyright notice and this permission notice shall be
|
21
|
+
# included in all copies or substantial portions of the Software.
|
22
|
+
#
|
23
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
25
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
27
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
28
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
29
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
30
|
+
#++
|
31
|
+
|
32
|
+
Rails.application.routes.draw do
|
33
|
+
get '/tml/upgrade' => 'tml_client_sdk/tools#upgrade'
|
34
|
+
get '/tml/on' => 'tml_client_sdk/tools#enable'
|
35
|
+
get '/tml/off' => 'tml_client_sdk/tools#disable'
|
36
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2015 Translation Exchange Inc. http://translationexchange.com
|
3
|
+
#
|
4
|
+
# _______ _ _ _ ______ _
|
5
|
+
# |__ __| | | | | (_) | ____| | |
|
6
|
+
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
7
|
+
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
8
|
+
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
9
|
+
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
10
|
+
# __/ |
|
11
|
+
# |___/
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
13
|
+
# a copy of this software and associated documentation files (the
|
14
|
+
# "Software"), to deal in the Software without restriction, including
|
15
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
16
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
17
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
18
|
+
# the following conditions:
|
19
|
+
#
|
20
|
+
# The above copyright notice and this permission notice shall be
|
21
|
+
# included in all copies or substantial portions of the Software.
|
22
|
+
#
|
23
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
25
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
27
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
28
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
29
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
30
|
+
#++
|
31
|
+
|
32
|
+
require 'i18n/backend/base'
|
33
|
+
require 'tml'
|
34
|
+
|
35
|
+
module I18n
|
36
|
+
module Backend
|
37
|
+
class Tml < I18n::Backend::Simple
|
38
|
+
|
39
|
+
module Implementation
|
40
|
+
include Base, Flatten
|
41
|
+
|
42
|
+
def application
|
43
|
+
::Tml.session.application
|
44
|
+
end
|
45
|
+
|
46
|
+
def available_locales
|
47
|
+
application.locales
|
48
|
+
end
|
49
|
+
|
50
|
+
def lookup(locale, key, scope = [], options = {})
|
51
|
+
default_key = super(application.default_locale, key, scope, options)
|
52
|
+
default_key ||= key
|
53
|
+
application.language(locale.to_s).translate(default_key)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
include Implementation
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
data/lib/tasks/tml.rake
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2015 Translation Exchange Inc. http://translationexchange.com
|
3
|
+
#
|
4
|
+
# _______ _ _ _ ______ _
|
5
|
+
# |__ __| | | | | (_) | ____| | |
|
6
|
+
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
7
|
+
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
8
|
+
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
9
|
+
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
10
|
+
# __/ |
|
11
|
+
# |___/
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
13
|
+
# a copy of this software and associated documentation files (the
|
14
|
+
# "Software"), to deal in the Software without restriction, including
|
15
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
16
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
17
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
18
|
+
# the following conditions:
|
19
|
+
#
|
20
|
+
# The above copyright notice and this permission notice shall be
|
21
|
+
# included in all copies or substantial portions of the Software.
|
22
|
+
#
|
23
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
25
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
27
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
28
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
29
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
30
|
+
#++
|
31
|
+
|
32
|
+
require 'tml'
|
33
|
+
|
34
|
+
namespace :tml do
|
35
|
+
|
36
|
+
namespace :cache do
|
37
|
+
|
38
|
+
desc 'upgrades shared translation cache'
|
39
|
+
task :upgrade => :environment do
|
40
|
+
Tml.cache.upgrade_version
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'generates local file cache'
|
44
|
+
task :generate => :environment do
|
45
|
+
Tml::Generators::Cache::File.new.run
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'rolls back to the previous version'
|
49
|
+
task :rollback => :environment do
|
50
|
+
Tml::Generators::Cache::File.new.rollback
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'rolls up to the next version'
|
54
|
+
task :rollup => :environment do
|
55
|
+
Tml::Generators::Cache::File.new.rollup
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2015 Translation Exchange Inc. http://translationexchange.com
|
4
|
+
#
|
5
|
+
# _______ _ _ _ ______ _
|
6
|
+
# |__ __| | | | | (_) | ____| | |
|
7
|
+
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
8
|
+
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
9
|
+
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
10
|
+
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
11
|
+
# __/ |
|
12
|
+
# |___/
|
13
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
14
|
+
# a copy of this software and associated documentation files (the
|
15
|
+
# "Software"), to deal in the Software without restriction, including
|
16
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
17
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
18
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
19
|
+
# the following conditions:
|
20
|
+
#
|
21
|
+
# The above copyright notice and this permission notice shall be
|
22
|
+
# included in all copies or substantial portions of the Software.
|
23
|
+
#
|
24
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
25
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
26
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
27
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
28
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
29
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
30
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
31
|
+
#++
|
32
|
+
|
33
|
+
class Tml::CacheAdapters::Rails < Tml::Cache
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
Tml.logger.info('Initializing Rails cache...')
|
37
|
+
@cache = Rails.cache
|
38
|
+
end
|
39
|
+
|
40
|
+
def cache_name
|
41
|
+
@cache.class.name
|
42
|
+
end
|
43
|
+
|
44
|
+
def read_only?
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def fetch(key, opts = {})
|
49
|
+
miss = false
|
50
|
+
data = @cache.fetch(versioned_key(key, opts)) do
|
51
|
+
info("Cache miss: #{key}")
|
52
|
+
miss = true
|
53
|
+
if block_given?
|
54
|
+
yield
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
info("Cache hit: #{key}") unless miss
|
60
|
+
data
|
61
|
+
rescue Exception => ex
|
62
|
+
warn("Failed to retrieve data: #{ex.message}")
|
63
|
+
return nil unless block_given?
|
64
|
+
yield
|
65
|
+
end
|
66
|
+
|
67
|
+
def store(key, data, opts = {})
|
68
|
+
info("Cache store: #{key}")
|
69
|
+
@cache.write(versioned_key(key, opts), data)
|
70
|
+
data
|
71
|
+
rescue Exception => ex
|
72
|
+
warn("Failed to store data: #{ex.message}")
|
73
|
+
key
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete(key, opts = {})
|
77
|
+
info("Cache delete: #{key}")
|
78
|
+
@cache.delete(versioned_key(key, opts))
|
79
|
+
key
|
80
|
+
rescue Exception => ex
|
81
|
+
warn("Failed to delete data: #{ex.message}")
|
82
|
+
key
|
83
|
+
end
|
84
|
+
|
85
|
+
def exist?(key, opts = {})
|
86
|
+
data = @cache.fetch(versioned_key(key, opts))
|
87
|
+
not data.nil?
|
88
|
+
rescue Exception => ex
|
89
|
+
warn("Failed to check if key exists: #{ex.message}")
|
90
|
+
false
|
91
|
+
end
|
92
|
+
|
93
|
+
def clear(opts = {})
|
94
|
+
info("Cache clear")
|
95
|
+
rescue Exception => ex
|
96
|
+
warn("Failed to clear cache: #{ex.message}")
|
97
|
+
end
|
98
|
+
end
|