mongo_translatable 0.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.
Files changed (112) hide show
  1. data/.document +5 -0
  2. data/.gitignore +26 -0
  3. data/.gitmodules +3 -0
  4. data/LICENSE +295 -0
  5. data/README.rdoc +131 -0
  6. data/Rakefile +55 -0
  7. data/VERSION +1 -0
  8. data/app/controllers/translations_controller.rb +150 -0
  9. data/app/helpers/translations_helper.rb +71 -0
  10. data/app/views/layouts/translations.html.erb +18 -0
  11. data/app/views/translations/_form.html.erb +50 -0
  12. data/app/views/translations/_translatable_value.html.erb +17 -0
  13. data/app/views/translations/_translation_field.html.erb +34 -0
  14. data/app/views/translations/_translation_field_input.html.erb +8 -0
  15. data/app/views/translations/edit.html.erb +8 -0
  16. data/app/views/translations/index.html.erb +22 -0
  17. data/app/views/translations/new.html.erb +7 -0
  18. data/app/views/translations/show.html.erb +12 -0
  19. data/config/locales/en.yml +33 -0
  20. data/config/locales/fr.yml +18 -0
  21. data/lib/mongo_translatable.rb +336 -0
  22. data/lib/mongo_translatable_configuration.rb +5 -0
  23. data/lib/translatables_helper.rb +227 -0
  24. data/lib/translations_controller_helpers.rb +37 -0
  25. data/rails/init.rb +3 -0
  26. data/test/full_2_3_5_app_with_tests/.gitignore +27 -0
  27. data/test/full_2_3_5_app_with_tests/README +1 -0
  28. data/test/full_2_3_5_app_with_tests/Rakefile +10 -0
  29. data/test/full_2_3_5_app_with_tests/app/controllers/application_controller.rb +26 -0
  30. data/test/full_2_3_5_app_with_tests/app/controllers/items_controller.rb +85 -0
  31. data/test/full_2_3_5_app_with_tests/app/helpers/application_helper.rb +3 -0
  32. data/test/full_2_3_5_app_with_tests/app/helpers/items_helper.rb +2 -0
  33. data/test/full_2_3_5_app_with_tests/app/models/comment.rb +3 -0
  34. data/test/full_2_3_5_app_with_tests/app/models/item.rb +5 -0
  35. data/test/full_2_3_5_app_with_tests/app/models/not_swapped_in_record.rb +3 -0
  36. data/test/full_2_3_5_app_with_tests/app/models/person.rb +3 -0
  37. data/test/full_2_3_5_app_with_tests/app/models/recipe.rb +21 -0
  38. data/test/full_2_3_5_app_with_tests/app/views/items/edit.html.erb +24 -0
  39. data/test/full_2_3_5_app_with_tests/app/views/items/index.html.erb +24 -0
  40. data/test/full_2_3_5_app_with_tests/app/views/items/new.html.erb +23 -0
  41. data/test/full_2_3_5_app_with_tests/app/views/items/show.html.erb +21 -0
  42. data/test/full_2_3_5_app_with_tests/app/views/layouts/items.html.erb +19 -0
  43. data/test/full_2_3_5_app_with_tests/config/boot.rb +110 -0
  44. data/test/full_2_3_5_app_with_tests/config/database.yml +22 -0
  45. data/test/full_2_3_5_app_with_tests/config/environment.rb +54 -0
  46. data/test/full_2_3_5_app_with_tests/config/environments/development.rb +17 -0
  47. data/test/full_2_3_5_app_with_tests/config/environments/production.rb +28 -0
  48. data/test/full_2_3_5_app_with_tests/config/environments/test.rb +28 -0
  49. data/test/full_2_3_5_app_with_tests/config/initializers/backtrace_silencers.rb +7 -0
  50. data/test/full_2_3_5_app_with_tests/config/initializers/inflections.rb +10 -0
  51. data/test/full_2_3_5_app_with_tests/config/initializers/mime_types.rb +5 -0
  52. data/test/full_2_3_5_app_with_tests/config/initializers/new_rails_defaults.rb +21 -0
  53. data/test/full_2_3_5_app_with_tests/config/initializers/session_store.rb +15 -0
  54. data/test/full_2_3_5_app_with_tests/config/locales.yml +5 -0
  55. data/test/full_2_3_5_app_with_tests/config/locales/en.yml +4 -0
  56. data/test/full_2_3_5_app_with_tests/config/locales/fr.yml +4 -0
  57. data/test/full_2_3_5_app_with_tests/config/locales/zh.yml +4 -0
  58. data/test/full_2_3_5_app_with_tests/config/routes.rb +4 -0
  59. data/test/full_2_3_5_app_with_tests/db/migrate/20100407010602_create_items.rb +14 -0
  60. data/test/full_2_3_5_app_with_tests/db/migrate/20100504234216_create_not_swapped_in_records.rb +15 -0
  61. data/test/full_2_3_5_app_with_tests/db/migrate/20100509011052_create_people.rb +13 -0
  62. data/test/full_2_3_5_app_with_tests/db/migrate/20100509042718_create_comments.rb +14 -0
  63. data/test/full_2_3_5_app_with_tests/db/migrate/20110112023516_create_recipes.rb +14 -0
  64. data/test/full_2_3_5_app_with_tests/db/schema.rb +56 -0
  65. data/test/full_2_3_5_app_with_tests/db/seeds.rb +7 -0
  66. data/test/full_2_3_5_app_with_tests/doc/README_FOR_APP +2 -0
  67. data/test/full_2_3_5_app_with_tests/public/404.html +30 -0
  68. data/test/full_2_3_5_app_with_tests/public/422.html +30 -0
  69. data/test/full_2_3_5_app_with_tests/public/500.html +30 -0
  70. data/test/full_2_3_5_app_with_tests/public/favicon.ico +0 -0
  71. data/test/full_2_3_5_app_with_tests/public/images/rails.png +0 -0
  72. data/test/full_2_3_5_app_with_tests/public/index.html +275 -0
  73. data/test/full_2_3_5_app_with_tests/public/javascripts/application.js +2 -0
  74. data/test/full_2_3_5_app_with_tests/public/javascripts/controls.js +963 -0
  75. data/test/full_2_3_5_app_with_tests/public/javascripts/dragdrop.js +973 -0
  76. data/test/full_2_3_5_app_with_tests/public/javascripts/effects.js +1128 -0
  77. data/test/full_2_3_5_app_with_tests/public/javascripts/prototype.js +4320 -0
  78. data/test/full_2_3_5_app_with_tests/public/robots.txt +5 -0
  79. data/test/full_2_3_5_app_with_tests/public/stylesheets/scaffold.css +54 -0
  80. data/test/full_2_3_5_app_with_tests/script/about +4 -0
  81. data/test/full_2_3_5_app_with_tests/script/console +3 -0
  82. data/test/full_2_3_5_app_with_tests/script/dbconsole +3 -0
  83. data/test/full_2_3_5_app_with_tests/script/destroy +3 -0
  84. data/test/full_2_3_5_app_with_tests/script/generate +3 -0
  85. data/test/full_2_3_5_app_with_tests/script/performance/benchmarker +3 -0
  86. data/test/full_2_3_5_app_with_tests/script/performance/profiler +3 -0
  87. data/test/full_2_3_5_app_with_tests/script/plugin +3 -0
  88. data/test/full_2_3_5_app_with_tests/script/runner +3 -0
  89. data/test/full_2_3_5_app_with_tests/script/server +3 -0
  90. data/test/full_2_3_5_app_with_tests/test/factories.rb +18 -0
  91. data/test/full_2_3_5_app_with_tests/test/functional/translations_controller_test.rb +66 -0
  92. data/test/full_2_3_5_app_with_tests/test/integration/translation_test.rb +72 -0
  93. data/test/full_2_3_5_app_with_tests/test/performance/browsing_test.rb +9 -0
  94. data/test/full_2_3_5_app_with_tests/test/selenium.rb +83 -0
  95. data/test/full_2_3_5_app_with_tests/test/test_helper.rb +86 -0
  96. data/test/full_2_3_5_app_with_tests/test/unit/helpers/translatables_helper_test.rb +37 -0
  97. data/test/full_2_3_5_app_with_tests/test/unit/helpers/translations_helper_test.rb +62 -0
  98. data/test/full_2_3_5_app_with_tests/test/unit/mongo_translatable_test.rb +342 -0
  99. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/init.rb +1 -0
  100. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter.rb +94 -0
  101. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/base.rb +31 -0
  102. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/force_extension.rb +57 -0
  103. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/locale.rb +70 -0
  104. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/pagination.rb +33 -0
  105. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/uuid_token.rb +78 -0
  106. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/force_extension_spec.rb +65 -0
  107. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/generation_spec.rb +367 -0
  108. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/pagination_extension_spec.rb +19 -0
  109. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/recognition_spec.rb +76 -0
  110. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/routing_filter_spec.rb +114 -0
  111. data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/spec_helper.rb +108 -0
  112. metadata +309 -0
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "mongo_translatable"
8
+ gem.summary = %Q{MongoDB backed Rails specific I18n model localization meant to tie-in to existing ActiveRecord models}
9
+ gem.description = %Q{Rails specific I18n model localization meant to tie-in to existing ActiveRecord models, ala Globalize2, backed by MongoDB rather than an RDBMS. May include UI elements, too.}
10
+ gem.email = "walter@katipo.co.nz"
11
+ gem.homepage = "http://github.com/kete/mongo_translatable"
12
+ gem.authors = ["Walter McGinnis", "Kieran Pilkington", "Breccan McLeod-Lundy"]
13
+ gem.add_dependency "mongo_mapper", ">= 0.7.3"
14
+ gem.add_dependency "activerecord", "2.3.5"
15
+ gem.add_development_dependency "shoulda", ">= 2.10.3"
16
+ gem.add_development_dependency "factory_girl", "= 1.2.3"
17
+ gem.add_development_dependency "webrat", ">= 0.5.3"
18
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ require 'rake/testtask'
26
+ Rake::TestTask.new(:test) do |test|
27
+ puts "This gem includes a full rails app for running tests (and staging development not yet extracted to the gem proper). Run tests there by changing to test/full_[RAIlS_VERSION_#_with_underscores]_app_with_tests and doing 'rake test'."
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "mongo_translatable #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,150 @@
1
+ class TranslationsController < ApplicationController
2
+ # Prevents the following error from showing up, common in Rails engines
3
+ # A copy of ApplicationController has been removed from the module tree but is still active!
4
+ unloadable
5
+
6
+ before_filter :set_translatable_key_and_class
7
+ # just being picky about contextual naming for clarity in variable's purpose
8
+ before_filter :get_translatable, :only => [:new, :create]
9
+ before_filter :get_translated, :except => [:new, :create]
10
+ before_filter :get_translation, :except => [:new, :index, :create]
11
+
12
+ # GET /translations
13
+ # GET /translations.xml
14
+ def index
15
+ @translations = @translated.translations
16
+
17
+ respond_to do |format|
18
+ format.html # index.html.erb
19
+ format.xml { render :xml => @translations }
20
+ end
21
+ end
22
+
23
+ # GET /translations/1
24
+ # GET /translations/1.xml
25
+ def show
26
+ respond_to do |format|
27
+ format.html # show.html.erb
28
+ format.xml { render :xml => @translation }
29
+ end
30
+ end
31
+
32
+ # GET /translations/new
33
+ # GET /translations/new.xml
34
+ def new
35
+ @translation = @translatable.translate(:locale => (params[:to_locale] || I18n.locale.to_s))
36
+
37
+ respond_to do |format|
38
+ format.html # new.html.erb
39
+ format.js { render :layout => false } # needs to come after html for IE to work
40
+ format.xml { render :xml => @translation }
41
+ end
42
+ end
43
+
44
+ # GET /translations/1/edit
45
+ def edit
46
+ @translation = @translated.translation_for(params[:id]) || @translatable_class::Translation.find(params[:id])
47
+ end
48
+
49
+ # POST /translations
50
+ # POST /translations.xml
51
+ def create
52
+ translation_params = params[:translation] || params[@translatable_params_name + '_translation']
53
+ @translation = @translatable.translate(translation_params)
54
+
55
+ respond_to do |format|
56
+ if @translation.save
57
+ flash[:notice] = t('translations.controllers.created')
58
+ # we redirect to translated object in the new translated version
59
+ # assumes controller name is tableized version of class
60
+ format.html { redirect_to url_for_translated }
61
+ # TODO: adjust :location accordingly for being a nested route
62
+ format.xml { render :xml => @translation, :status => :created, :location => @translation }
63
+ else
64
+ format.html { render :action => "new" }
65
+ format.xml { render :xml => @translation.errors, :status => :unprocessable_entity }
66
+ end
67
+ end
68
+ end
69
+
70
+ # PUT /translations/1
71
+ # PUT /translations/1.xml
72
+ def update
73
+ respond_to do |format|
74
+ translation_params = params[:translation] || params[@translatable_params_name + '_translation']
75
+ if @translation.update_attributes(translation_params)
76
+ flash[:notice] = t('translations.controllers.updated')
77
+ format.html { redirect_to url_for_translated }
78
+ format.xml { head :ok }
79
+ else
80
+ format.html { render :action => "edit" }
81
+ format.xml { render :xml => @translation.errors, :status => :unprocessable_entity }
82
+ end
83
+ end
84
+ end
85
+
86
+ # DELETE /translations/1
87
+ # DELETE /translations/1.xml
88
+ def destroy
89
+ return_to = params[:return_to_translated].present? && params[:return_to_translated] ? url_for_translated : { :action =>:index }
90
+ @translation.destroy
91
+
92
+ respond_to do |format|
93
+ flash[:notice] = t('translations.controllers.deleted')
94
+ format.html { redirect_to return_to }
95
+ format.xml { head :ok }
96
+ end
97
+ end
98
+
99
+ protected
100
+ # accepts translation.locale or translation.id for lookup
101
+ # translation.locale should be unique within the scope of @translated
102
+ def get_translation
103
+ @translation = @translated.translation_for(params[:id]) || @translatable_class::Translation.find(params[:id])
104
+ end
105
+
106
+ %w{translatable translated}.each do |term|
107
+ define_method("get_" + term) do
108
+ value = @translatable_class.find(params[@translatable_key])
109
+
110
+ # handle case of editing translation from another locale than original
111
+ if value.locale != value.original_locale &&
112
+ params[:controller] == 'translations' &&
113
+ params[:action] == 'edit'
114
+
115
+ starting_locale = I18n.locale
116
+
117
+ I18n.locale = value.original_locale
118
+
119
+ value.reload
120
+
121
+ I18n.locale = starting_locale
122
+ end
123
+
124
+ instance_variable_set("@" + term, value)
125
+ end
126
+ end
127
+
128
+ # assuming nested routing, this should return exactly one params key
129
+ # and its matching class
130
+ def set_translatable_key_and_class
131
+ translatable_keys = params.keys.select { |key| key.to_s.include?('_id') }
132
+
133
+ translatable_keys.each do |key|
134
+ key = key.to_s
135
+ if key != 'translation_id' && request
136
+ key_singular = key.sub('_id', '')
137
+
138
+ # make sure this is found in the request url
139
+ # thus making this a nested route
140
+ # assumes plural version for controller name
141
+ if request.path.split('/').include?(key_singular.pluralize)
142
+ @translatable_class = key_singular.camelize.constantize
143
+ @translatable_key = key.to_sym
144
+ @translatable_params_name = key_singular
145
+ break
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,71 @@
1
+ module TranslationsHelper
2
+ # outputs a display of translatable attributes
3
+ # internationalized, assumes translation key is made up of the following
4
+ # @translatable.class.name.tablize (i.e. controller name for routing purposes)
5
+ # .
6
+ # form (i.e. template name used by new and edit actions in most cases for forms)
7
+ # .
8
+ # the_attribute_name (i.e. what the accessor method name is for attribute in question on the model)
9
+ # expects @translatable var or @translated var
10
+ # returns an array with a hash per attribute where the key is the label (internationalized)
11
+ # and the value for the attribute
12
+ mattr_accessor :available_locales
13
+ @@available_locales ||= YAML.load(IO.read(File.join(RAILS_ROOT, 'config/locales.yml')))
14
+
15
+ %w{untranslated translated}.each do |term|
16
+ define_method(term + '_values_with_localized_labels') do
17
+ set_original
18
+ raise "No object supplied to translate." if @original.blank?
19
+ raise "No matching translation available." if term == 'translated' && @translation.blank?
20
+
21
+ @original.translatable_attributes.collect do |attribute_key|
22
+ value = (term == 'untranslated') ? @original.send(attribute_key) : @translation[attribute_key]
23
+ { :attribute_key => attribute_key,
24
+ :localized_label => localized_label_for(attribute_key),
25
+ :value => modify_translation_value(value, @original) }
26
+ end
27
+ end
28
+ end
29
+
30
+ # We don't do anything here, just provide it for users to if they need it
31
+ def modify_translation_value(value, original_object)
32
+ value
33
+ end
34
+
35
+ def localized_label_for(attribute_key)
36
+ t(@translatable_class.name.tableize + '.' + 'form' + '.' + attribute_key.to_s)
37
+ end
38
+
39
+ def available_locales_for_options
40
+ @@available_locales.collect { |key,value| [value,key] }
41
+ end
42
+
43
+ def available_in_locales
44
+ set_original
45
+ list = @original.available_in_these_locales.collect do |locale|
46
+ link_to_unless_current(TranslationsHelper::available_locales[locale], url_for_translated(:locale => locale))
47
+ end
48
+ list = '<ul>' + '<li>' + list.join('</li><li>') + '</li>' + '</ul>'
49
+ end
50
+
51
+ def needed_in_locales
52
+ set_original
53
+ list = @original.needed_in_these_locales.collect do |locale|
54
+ link_to(TranslationsHelper::available_locales[locale],
55
+ :action => :new,
56
+ :controller => :translations,
57
+ @translatable_key => @original,
58
+ :to_locale => locale)
59
+ end
60
+ list = '<ul>' + '<li>' + list.join('</li><li>') + '</li>' + '</ul>'
61
+ end
62
+
63
+ def translatable_field_a_text_area?(form, translation_field)
64
+ form.object.translatable_class.columns_hash[translation_field.to_s].type == :text
65
+ end
66
+
67
+ private
68
+ def set_original
69
+ @original ||= @translatable || @translated
70
+ end
71
+ end
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+ <title><%= controller.controller_name %>: <%= controller.action_name %></title>
8
+ <%= yield :add_on_scripts_and_links %>
9
+ <%= javascript_include_tag :defaults %>
10
+ </head>
11
+ <body>
12
+
13
+ <p style="color: green"><%= flash[:notice] %></p>
14
+
15
+ <%= yield %>
16
+
17
+ </body>
18
+ </html>
@@ -0,0 +1,50 @@
1
+ <% translatable = @translatable.present? ? @translatable : @translated %>
2
+ <h2 style="margin:0 0 10px 0;">
3
+ <%= I18n.t('translations.form.translate_from_and_to',
4
+ :from => TranslationsHelper::available_locales[translatable.original_locale],
5
+ :to => TranslationsHelper::available_locales[h(@translation.locale)]) %>
6
+ </h2>
7
+
8
+ <%= form.error_messages %>
9
+ <%= form.hidden_field :locale %>
10
+ <%= hidden_field_tag :version, params[:version] if params[:version] %>
11
+
12
+ <!-- Use a table instead of floated divs because it gives better results in IE -->
13
+ <table style="width: 98%;">
14
+ <tr>
15
+ <th colspan="2" style="width: 48%;">
16
+ <h3 style="margin:0 0 10px 0;"><%= TranslationsHelper::available_locales[translatable.original_locale] %></h3>
17
+ </th>
18
+ <th rowspan="<%= @translatable_class.translatable_attributes.size + 1 %>" style="width:1px; border-left: 1px solid #000; padding: 0; margin: 0"></th>
19
+ <th colspan="3" style="width: 48%;">
20
+ <h3 style="margin:0 0 10px 0;"><%= TranslationsHelper::available_locales[@translation.locale] %></h3>
21
+ </th>
22
+ </tr>
23
+
24
+ <% translatable_attributes = @translatable.present? ? @translatable.translatable_attributes : @translated.translatable_attributes
25
+ @untranslated_values_with_localized_labels = untranslated_values_with_localized_labels
26
+ -%>
27
+ <% translatable_attributes.each do |attribute_key| %>
28
+ <tr>
29
+ <% untranslated_value = @untranslated_values_with_localized_labels.find { |l| l[:attribute_key] == attribute_key }
30
+ locals = { :form => form, :untranslated_value => untranslated_value } %>
31
+ <%= render 'translatable_value', locals %>
32
+ <% if untranslated_value[:value].present? -%>
33
+ <%= render 'translation_field', locals.merge(:attribute_key => attribute_key) %>
34
+ <% else -%>
35
+ <td colspan="3" class="translatable_label_and_field" valign="top" style="padding: 5px;">
36
+ <%= I18n.t('translations.form.original_has_no_value') -%>
37
+ </td>
38
+ <% end -%>
39
+ </tr>
40
+ <% end %>
41
+ </table>
42
+
43
+ <div class="make_translation" style="text-align: center; margin-top: 20px; width: 98%;">
44
+ <%= form.submit @button_text %>
45
+ </div>
46
+
47
+ <div class="translate_links" style="margin-top: 20px;">
48
+ <%= available_in_locales_for(@original, :lightbox => request.xhr?) %>
49
+ <%= needed_in_locales_for(@original, :lightbox => request.xhr?) %>
50
+ </div>
@@ -0,0 +1,17 @@
1
+ <% if translatable_field_a_text_area?(form, untranslated_value[:attribute_key]) %>
2
+
3
+ <td colspan="2" class="original_label_and_value" valign="top" style="padding: 5px;">
4
+ <%= h(untranslated_value[:localized_label]) -%><br />
5
+ <%= h(untranslated_value[:value]) -%>
6
+ </td>
7
+
8
+ <% else %>
9
+
10
+ <td class="original_label" valign="top" style="width: 10%; padding: 5px;">
11
+ <%= h(untranslated_value[:localized_label]) -%>
12
+ </td>
13
+ <td class="original_value" valign="top" style="padding: 5px;">
14
+ <%= h(untranslated_value[:value]) -%>
15
+ </td>
16
+
17
+ <% end %>
@@ -0,0 +1,34 @@
1
+ <% locals = { :form => form, :untranslated_value => untranslated_value, :attribute_key => attribute_key } %>
2
+
3
+ <% if translatable_field_a_text_area?(form, attribute_key) %>
4
+
5
+ <td colspan="3" class="translatable_label_and_field" valign="top" style="padding: 5px;">
6
+ <%= form.label attribute_key, localized_label_for(attribute_key) %><br />
7
+ <%= render 'translation_field_input', locals %>
8
+ </td>
9
+
10
+ <% else %>
11
+
12
+ <td class="translatable_label" valign="top" style="width: 10%; padding: 5px;">
13
+ <%= form.label attribute_key, localized_label_for(attribute_key) %>
14
+ </td>
15
+ <td class="translatable_value" valign="top" style="padding: 5px;">
16
+ <%= render 'translation_field_input', locals %>
17
+ </td>
18
+ <td class="translatable_auto_translate" valign="top" style='font-size:0.8em;'>
19
+ <% if MongoTranslatableConfiguration.provide_autotranslate -%>
20
+
21
+ <span class="translate_link_span"></span>
22
+ <% translate_link = link_to('[auto translate]', '#', :title => 'Auto Translate Using Google', :class => 'translate_link') %>
23
+ <%= javascript_tag("
24
+ $$('.translate_link_span').last().update(#{::ActiveSupport::JSON.encode(translate_link)});
25
+ $$('.translate_link').last().observe('click', function(event) {
26
+ getGoogleTranslation(this.up('tr').down('.translatable_value').down('input').id,
27
+ '#{escape_javascript(h(untranslated_value[:value]))}',
28
+ '#{I18n.locale}', '#{h(@translation.locale)}');
29
+ event.stop();
30
+ });") %>
31
+ <% end -%>
32
+ </td>
33
+
34
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# assign the value of the untranslated field if this record is a new object %>
2
+ <% form.object.send("#{attribute_key}=", untranslated_value[:value]) if form.object.new_record? %>
3
+
4
+ <% if translatable_field_a_text_area?(form, attribute_key) %>
5
+ <%= form.text_area attribute_key, :rows => 7, :cols => 35 %>
6
+ <% else %>
7
+ <%= form.text_field attribute_key %>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% @button_text = t("translations.edit.update") -%>
2
+
3
+ <% form_for(@translation, :url => { :action => :update,
4
+ @translatable_key => @translated, :id => @translation.locale }) do |f| %>
5
+
6
+ <%= render :partial => f -%>
7
+
8
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <% type = @translated.class.name.titleize.downcase -%>
2
+ <h2 style="margin:0 0 10px 0;"><%= t("translations.index.title", :type => type) -%></h2>
3
+
4
+ <ul>
5
+ <% @translations.each do |translation| %>
6
+ <li>
7
+ <%= link_to(TranslationsHelper::available_locales[translation.locale], { :action => :show, :id => h(translation.locale) }) -%>
8
+ [ <%= link_to(t('translations.index.edit').downcase, { :id => h(translation.locale), :action => :edit }) -%> |
9
+ <%= link_to(t('translations.index.delete').downcase, { :id => h(translation.locale), :action => :destroy },
10
+ { :method => :delete, :confirm => t('translations.index.are_you_sure') }) -%> ]
11
+ </li>
12
+ <% end %>
13
+ </ul>
14
+
15
+ <ul style="list-style:none; padding:0; margin:0;">
16
+ <li style="float:left; padding: 0 5px;">
17
+ <%= link_to(t("translations.index.back", :type => type), url_for_translated) %>
18
+ </li>
19
+ <li style="float:left; padding: 0 5px; border-left: 1px solid #000;">
20
+ <%= link_to(t("translations.index.new"), { :action => :new }) %>
21
+ </li>
22
+ </ul>