heroku не загружает языковой файл

Похоже, Heroku не загружает config/locales/pt.yml. (Язык правильно установлен на pt.)

I18n отлично работает на локальном хосте, но не на моем сервере heroku.
Код находится по адресу https://github.com/aneves/deficit-puzzle

локальный хост:

$ rails console
Loading development environment (Rails 3.0.5)
irb(main):001:0> I18n.t(:Edit)
=> "Editar"

геройку:

$ heroku console
Ruby console for deficit-puzzle.heroku.com
>> I18n.t(:Edit)
=> "translation missing: pt.Edit"

возможные дубликаты:

Есть ТАК совпадения для моей проблемы, но это мертвые темы. Я не хочу открывать награду в теме, чей OP оставил комментарии без ответа, я бы предпочел хороший вопрос с хорошим ответом. Кроме того, вопросы не точно определяют проблему, и поэтому ответы упускают суть.

  1. У одного нет ответа, и ОП не ответил на комментарии;
  2. Другой имеет только ответ, который не соответствует сути, и OP не следит за последний комментарий тоже.

person ANeves thinks SE is evil    schedule 23.10.2011    source источник
comment
Любопытно, что все переводы появляются в I18n.backend, но не в I18n.t.   -  person Alec Wenzowski    schedule 02.11.2011
comment
@AlexanderWenzowski, СПАСИБО! Ваш комментарий определенно считается An explanation to the problem, a way to fix the problem even without understanding it, or even hints strongly inducive to such a fix. в моей книге. Но баунти нельзя назначать комментариям. ;) Не могли бы вы опубликовать комментарий в качестве ответа? (Эта проблема I18n беспокоила меня с конца 28 августа... мда)   -  person ANeves thinks SE is evil    schedule 05.11.2011
comment
рад, что смог помочь!   -  person Alec Wenzowski    schedule 05.11.2011


Ответы (5)


Любопытно, что данные появлялись в I18n.backend, как и ожидалось, но их нельзя было выбрать по отдельности с помощью I18n.t.

Это привело к осознанию того, что путь загрузки должен быть правильно настроен для того, чтобы Rails мог найти файлы перевода, но он не анализировал их должным образом.

Это привело к тому, что @ANeves обнаружил, что BOM нарушал способность Heroku анализировать файлы, которые " rel="noreferrer">привел к исправлению удаления некорректной спецификации.


Википедия по спецификации в UTF-8

Стандарт Unicode разрешает спецификацию в UTF-8, но не требует и не рекомендует его использование. Порядок байтов не имеет значения в UTF-8, поэтому в UTF-8 спецификация служит только для идентификации текстового потока или файла как UTF-8.

Многие программы Windows (включая Блокнот Windows) по умолчанию добавляют спецификации в файлы UTF-8.

Если будущие читатели находятся на ruby-1.9 рекомендуем прочитать об частых проблемах кодирования.

person Alec Wenzowski    schedule 05.11.2011
comment
И я действительно думаю, что это лучший ответ, чем мой. Отметка также как ответ. - person ANeves thinks SE is evil; 05.11.2011

@Alexander Wenzowski направил меня на правильный путь.

Похоже, что знак порядка следования байтов мешал Heroku загружать файлы локализации...
Когда я преобразовал файлы, чтобы они не имели спецификации, используя Notepad ++, все было исправлено.

Сначала я просто пытался осмотреть эту новую для меня штуку, I18n.backend... а потом заметил то, что упустил с первого взгляда: хоть данные и были, но все они были искажены.

>> I18n.backend
=> #<I18n::Backend::Simple:0x7f74643e2f08 @skip_syntax_deprecation=false, @translations={:"\357\273\277# Sample localization file for English. Add mor
e files in this directory for other locales. # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.\nen"=>{:Dest
roy=>"Remove", :suspend=>"suspend", :confirm=>"Are you sure?", :Admin=>"Administration", :suspended=>"%{model} was successfully suspended.", :Back=>"B
ack", :updated=>"%{model} was successfully updated.", :html_title=>"DeficitPuzzle", :to_frontpage=>"to frontpage", :approve=>"approve", :Show=>"Show",
 :to_admin=>"to administration", :theme=>{:n=>{:one=>"1 theme", :other=>"%{count} themes"}, :List=>"Listing themes", :New=>"New theme", :Destroy_perma
nently=>"Permanently remove this theme", :Editing=>"Editing theme", :_=>"Theme"}, :Progress=>"Progress", :Proposals=>"Proposals", :approved=>"%{model}
 was successfully approved.", :activerecord=>nil, :save_errors=>{:one=>"1 error prohibited this item from being saved", :other=>"%{count} errors prohi
bited this item from being saved"}, :proposal=>{:n=>{:one=>"1 proposal", :other=>"%{count} proposals"}, :List=>"Listing proposals", :New=>"New proposa
l", :Impact=>"Impact", :Destroy_permanently=>"Permanently remove this proposal.", :Editing=>"Editing proposal", :Approved=>"Approved", :"Approved?"=>"
Approved?", :_=>"Proposal", :Title=>"Title", :Description=>"Description"}, :helpers=>{:submit=>nil}, :created=>"%{model} was successfully created.", :
Edit=>"Edit", :title=>"Deficit puzzle: you fix the budget"}, :pt=>{:Destroy=>"Remover", :suspend=>"suspender", :confirm=>"De certeza?", :Admin=>"Ad
ministração", :suspended=>"%{model} foi suspendida com sucesso.", :Back=>"Atrás", :updated=>"%{model} foi actualizada com sucesso.", :html_title=>"
DeficitPuzzle", :to_frontpage=>"ir para página principal", :approve=>"aprovar", :Show=>"Mostrar", :to_admin=>"ir para administração", :theme=>{:n=>
{:one=>"1 tema", :other=>"%{count} temas"}, :List=>"Listando temas", :New=>"Novo tema", :Destroy_permanently=>"Remover este tema permanentemente.", :E
diting=>"Editando tema", :_=>"Tema"}, :Progress=>"Progressão", :Proposals=>"Propostas", :approved=>"%{model} foi aprovada com sucesso.", :activerecor
d=>{:attributes=>{:theme=>{:title=>"Título"}, :proposal=>{:impact=>"Impacto", :description=>"Descrição", :title=>"Título"}}, :models=>{:theme=>"Te
ma", :proposal=>"Proposta"}}, :save_errors=>{:one=>"1 erro impediu este item de ser salvo", :other=>"%{count} erros impediram este item de ser salvo"}
, :proposal=>{:n=>{:one=>"1 proposta", :other=>"%{count} propostas"}, :List=>"Listando propostas", :New=>"Nova proposta", :Impact=>"Impacto", :Destroy
_permanently=>"Remover permanentemente esta proposta.", :Editing=>"Editando proposta", :Approved=>"Aprovada", :"Approved?"=>"Aprovada?", :_=>"Proposta
", :Title=>"Título", :Description=>"Descrição"}, :helpers=>{:submit=>{:update=>"Actualizar %{model}", :create=>"Criar %{model}"}}, :created=>"%{mod
el} foi criada com sucesso.", :Edit=>"Editar", :title=>"Deficit puzzle: tu consertas o orçamento"}, :en=>{:support=>{:array=>{:words_connector=>", ",
 :two_words_connector=>" and ", :last_word_connector=>", and "}}, :number=>{:precision=>{:format=>{:delimiter=>""}}, :format=>{:separator=>".", :delim
iter=>",", :precision=>3, :significant=>false, :strip_insignificant_zeros=>false}, :human=>{:storage_units=>{:units=>{:byte=>{:one=>"Byte", :other=>"B
ytes"}, :kb=>"KB", :mb=>"MB", :gb=>"GB", :tb=>"TB"}, :format=>"%n %u"}, :format=>{:delimiter=>"", :precision=>3, :significant=>true, :strip_insignific
ant_zeros=>true}, :decimal_units=>{:units=>{:million=>"Million", :unit=>"", :billion=>"Billion", :trillion=>"Trillion", :quadrillion=>"Quadrillion", :
thousand=>"Thousand"}, :format=>"%n %u"}}, :percentage=>{:format=>{:delimiter=>""}}, :currency=>{:format=>{:separator=>".", :unit=>"$", :delimiter=>",
", :precision=>2, :significant=>false, :strip_insignificant_zeros=>false, :format=>"%u%n"}}}, :datetime=>{:distance_in_words=>{:about_x_hours=>{:one=>
"about 1 hour", :other=>"about %{count} hours"}, :about_x_years=>{:one=>"about 1 year", :other=>"about %{count} years"}, :x_days=>{:one=>"1 day", :oth
er=>"%{count} days"}, :over_x_years=>{:one=>"over 1 year", :other=>"over %{count} years"}, :less_than_x_minutes=>{:one=>"less than a minute", :other=>
"less than %{count} minutes"}, :about_x_months=>{:one=>"about 1 month", :other=>"about %{count} months"}, :x_minutes=>{:one=>"1 minute", :other=>"%{co
unt} minutes"}, :almost_x_years=>{:one=>"almost 1 year", :other=>"almost %{count} years"}, :x_months=>{:one=>"1 month", :other=>"%{count} months"}, :l
ess_than_x_seconds=>{:one=>"less than 1 second", :other=>"less than %{count} seconds"}, :half_a_minute=>"half a minute", :x_seconds=>{:one=>"1 second"
, :other=>"%{count} seconds"}}, :prompts=>{:day=>"Day", :minute=>"Minute", :month=>"Month", :year=>"Year", :hour=>"Hour", :second=>"Seconds"}}, :time=
>{:formats=>{:default=>"%a, %d %b %Y %H:%M:%S %z", :short=>"%d %b %H:%M", :long=>"%B %d, %Y %H:%M"}, :pm=>"pm", :am=>"am"}, :date=>{:formats=>{:defaul
t=>"%Y-%m-%d", :short=>"%b %d", :long=>"%B %d, %Y"}, :abbr_day_names=>["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], :order=>[:year, :month, :day]
, :day_names=>["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], :abbr_month_names=>[nil, "Jan", "Feb", "Mar", "Apr", "Ma
y", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], :month_names=>[nil, "January", "February", "March", "April", "May", "June", "July", "August", "S
eptember", "October", "November", "December"]}, :errors=>{:format=>"%{attribute} %{message}", :messages=>{:even=>"must be even", :confirmation=>"doesn
't match confirmation", :greater_than_or_equal_to=>"must be greater than or equal to %{count}", :accepted=>"must be accepted", :equal_to=>"must be equ
al to %{count}", :not_an_integer=>"must be an integer", :empty=>"can't be empty", :wrong_length=>"is the wrong length (should be %{count} characters)"
, :less_than=>"must be less than %{count}", :blank=>"can't be blank", :too_short=>"is too short (minimum is %{count} characters)", :exclusion=>"is res
erved", :inclusion=>"is not included in the list", :less_than_or_equal_to=>"must be less than or equal to %{count}", :not_a_number=>"is not a number",
 :too_long=>"is too long (maximum is %{count} characters)", :invalid=>"is invalid", :odd=>"must be odd", :greater_than=>"must be greater than %{count}
"}}, :activerecord=>{:errors=>{:messages=>{:record_invalid=>"Validation failed: %{errors}", :taken=>"has already been taken"}}}, :helpers=>{:submit=>{
:submit=>"Save %{model}", :update=>"Update %{model}", :create=>"Create %{model}"}, :select=>{:prompt=>"Please select"}}}}, @initialized=true>
person ANeves thinks SE is evil    schedule 04.11.2011

Эта проблема, похоже, не связана с Heroku и может возникнуть в любой Windows/UNIX, смешанной с Ruby/i18n.

person David Dollar    schedule 07.11.2011
comment
Очень напористо. Правильно ли я предполагаю, что этот ответ основан на личном опыте? (Делает ответ очень полезным. :) - person ANeves thinks SE is evil; 08.11.2011
comment
Heroku использует стандартную сборку Ruby, так что это почти наверняка просто разница между Windows/UNIX и пометкой BOM. В среде Heroku не должно быть ничего уникального, что могло бы сыграть здесь роль. - person David Dollar; 11.11.2011

Я столкнулся с похожей проблемой, но у меня были дубликаты ключей.

В одном файле мы определили это:

en:
  dashboard: "Dashboard"

И еще один мы определили

en:
  dashboard:
    title: "Some Title"

Локально I18n.t("dashboard.title") работало нормально, а на продакшене - нет. Причина, вероятно, была связана с разницей в порядке загрузки между Heroku и моей машиной для разработки.

Я исправил это, изменив имя первой клавиши dashboard, чтобы больше не было перекрытия.

person Nick    schedule 06.04.2016
comment
Это была именно моя проблема. Найдите дубликаты записей! - person ThorstenC; 08.03.2018

Написание этой строки также устранит проблему в вашем application.rb.

config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
person Eren Atbaş    schedule 29.12.2011
comment
Я думаю, у вас была другая проблема, потому что моя проблема заключалась не в получении файла, а в разборе его содержимого: спецификация портила загрузку содержимого файла. - person ANeves thinks SE is evil; 05.01.2012
comment
Да, геройку не читал мой файл локалей, поэтому, когда я его поставил, я работал на меня. - person Eren Atbaş; 06.01.2012