Search code examples
ruby-on-railsruby-on-rails-4internationalizationrails-i18n

I18n translated values do not show up if changed from helper method rails


Hello not sure how to explain this but i will give it my best shot.

I hv a model like this

class Answer < ActiveRecord::Base
  EMPLOYMENT_TYPE = [
    ['Employed', I18n.t('self_evaluation.self_evaluation_form.employment_status.employed')],
    ['Self-Employed', I18n.t('self_evaluation.self_evaluation_form.employment_status.self_employed')],
    ['Unemployed / Retired', I18n.t('self_evaluation.self_evaluation_form.employment_status.unemployed')]
  ]
end

I also have a helper method that calls this

module AnswerHelper
  def get_employment_type_list
    return Answer::EMPLOYMENT_TYPE
  end
end

And a partial view that should display the values like this

_step_1.html.erb

<% employment_list = get_employment_type_list %>
<%= employment_list %>
<div class="flex_center flex_column button-wrap">
  <%= collection_radio_buttons("application[answer_attributes]", :employment_type, employment_list, :first, :last, item_wrapper_tag: false, checked: @selected_employment_type) do |b|
    b.label(class: 'employment_type_radio') { b.radio_button(:onchange => "return_employment_type(value)", class:'radio-label')  + b.label(class:'button-label'){b.text}}
  end %>
</div>

_step_2.html.erb

<% employer_list = get_employer_list(chosen_employment_type(@decoded_self_evaluation)) %>
<% employer_type = @decoded_self_evaluation.try(:loan_application).try(:kyc_answer).try(:employer_type) %>
<div class="flex_center flex_column button-wrap">
  <%= collection_radio_buttons("loan_application[kyc_answer_attributes]", :employer_type, employer_list, :first, :last, item_wrapper_tag: false, checked: employer_type) do |b|
    b.label(class: 'employer_type_radio') { b.radio_button(:onchange => "is_business_registered(value)", class:'radio-label') + b.label(class:'button-label'){b.text}}
  end %>
</div>

identity.js

$.ajax({
    url:'/self_evaluations/' + self_evaluation_id + '/employment_type',
    method:"POST",
    data:JSON.stringify({employment_type: employment_type, key: $('#token_key').val()}),
    contentType:"application/json; charset=utf-8",
    dataType:"script",
    async: false,
    success: function(data) {
      $valid = true;
    }
  })

employment_list.js.erb

$('#id_employer').empty();
$('#id_employer').append("<%=j render 'self_evaluations/self_evaluation_partials/step_2' %>");

Now the problem is that i have already added all that's needed for I18n translations to happen in Rails and for texts that are translated on the html view it works correctly when i switch from the different languages but for texts that are been gotten via a helper method like this. Based on initial help, on initial load, all page work fine but if i change the language and then run an ajax call that loads the employment_list.js.erb my locale seems to still be the primary language the the values do not change accordingly

Not sure why this is happening anyone faced something like this before?


Solution

  • Because you declared the translations as a constant in your model, so the translations were loaded just one time when Answer model was loaded in the first time.

    In production environment, the model will be loaded after starting server. In development environment, the model will be loaded when the file content is changed, ...

    In order to solve your issue, you can add the translations in your helper instead:

    module AnswerHelper
      def get_employment_type_list
        [
          ['Employed', I18n.t('self_evaluation.self_evaluation_form.employment_status.employed')],
          ['Self-Employed', I18n.t('self_evaluation.self_evaluation_form.employment_status.self_employed')],
          ['Unemployed / Retired', I18n.t('self_evaluation.self_evaluation_form.employment_status.unemployed')]
        ]
      end
    end
    

    I usually use this approach, please have a look!

    class Answer < ActiveRecord::Base
      EMPLOYMENT_TYPE = [:employed, :self_employed, :unemployed_or_retired]
    end
    
    module AnswerHelper
      def get_employment_type_list
        i18n_scope = 'self_evaluation.self_evaluation_form.employment_status'
    
        Answer::EMPLOYMENT_TYPE.map do |type|
          [type, t(type, scope: i18n_scope)]
        end
      end
    end