Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.
Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.
То же соединение получало успех, когда я был в любой другой сети.
Я столкнулся с той же проблемой. Однако, когда я пытался реализовать решение Питера , мне пришло в голову более простое решение. Помощник time_zone_select
принимает параметр : model
, который по умолчанию равен ActiveSupport :: TimeZone
. Согласно документации API, все, что должна сделать эта модель, - это вернуть массив объектов часовых поясов в методе all
. Затем мы можем переопределить метод to_s
, чтобы вернуть перевод (по умолчанию используется оригинал, если перевод не найден). Вот класс:
# lib/i18n_time_zone.rb
class I18nTimeZone < ActiveSupport::TimeZone
def self.all
super.map { |z| create(z.name, z.utc_offset) }
end
def to_s
translated_name = I18n.t(name, :scope => :timezones, :default => name)
"(GMT#{formatted_offset}) #{translated_name}"
end
end
И в представлении:
<%= time_zone_select :user, :time_zone, nil, :model => I18nTimeZone %>
С переводами, указанными в файле перевода, как и раньше:
# es.yml
es:
timezones:
"International Date Line West": "Línea de fecha internacional del oeste"
"Pacific Time (US & Canada)": "Tiempo pacífico (& de los E.E.U.U.; Canadá)"
# and so on
Я предполагаю, что это нужно будет делать вручную, так же, как любые другие переводы I18n выполняются в Rails. Это будет означать создание файлов локали с переводами. Примерно так:
# es.yml
es:
timezones:
"International Date Line West": "Línea de fecha internacional del oeste"
"Pacific Time (US & Canada)": "Tiempo pacífico (& de los E.E.U.U.; Canadá)"
# and so on
Вы можете перезаписать метод time_zone_options_for_select
(который используется time_zone_select
) следующим образом:
def time_zone_options_for_select(selected = nil, priority_zones = nil, model = ::ActiveSupport::TimeZone)
zone_options = ""
zones = model.all
convert_zones = lambda do |list|
list.map do |z|
localized_name = I18n.t(z.name, :scope => :timezones, :default => z.name)
[ "(GMT#{z.formatted_offset}) #{localized_name}", z.name ]
end
end
if priority_zones
if priority_zones.is_a?(Regexp)
priority_zones = model.all.find_all {|z| z =~ priority_zones}
end
zone_options += options_for_select(convert_zones[priority_zones], selected)
zone_options += "<option value=\"\" disabled=\"disabled\">-------------</option>\n"
zones = zones.reject { |z| priority_zones.include?( z ) }
end
zone_options += options_for_select(convert_zones[zones], selected)
zone_options
end
Изменения:
convert_zones = lambda do |list|
list.map do |z|
localized_name = I18n.t(z.name, :scope => :timezones, :default => z.name)
[ "(GMT#{z.formatted_offset}) #{localized_name}", z.name ]
end
end
Что мы делаем то есть получение локализованного имени из имени TimeZone с помощью I18n.t, которое находится в config / locales / LANG.yml
, отформатированном, как показано выше. Если мы не можем найти перевод, мы просто используем имя TimeZone.
Теперь, когда мы выполнили эту настройку, мы должны иметь возможность использовать:
f.time_zone_select :timezone, ActiveSupport::TimeZone.all
или более короткое
f.time_zone_select :timezone # defaults to ActiveSupport::TimeZone.all
У меня была та же проблема, и ответ fishwebby помог легко решить эту проблему. Мне нужен был перевод часовых поясов на испанский, поэтому я оставляю список:
"International Date Line West": "Línea de fecha internacional del oeste"
"Midway Island": "Isla de Midway"
"Samoa": "Samoa"
"Hawaii": "Hawai"
"Alaska": "Alaska"
"Pacific Time (US & Canada)": "Hora del Pacífico (EE.UU. y Canadá)"
"Tijuana": "Tijuana"
"Mountain Time (US & Canada)": "Hora de las Montañas (EE.UU. y Canadá)"
"Arizona": "Arizona"
"Chihuahua": "Chihuahua"
"Mazatlan": "Mazatlán"
"Central Time (US & Canada)": "Hora central (EE.UU. y Canadá)"
"Saskatchewan": "Saskatchewan"
"Guadalajara": "Guadalajara"
"Mexico City": "Ciudad de México"
"Monterrey": "Monterrey"
"Central America": "América Central"
"Eastern Time (US & Canada)": "Hora del Este (EE.UU. y Canadá)"
"Indiana (East)": "Indiana (Este)"
"Bogota": "Bogotá"
"Lima": "Lima"
"Quito": "Quito"
"Atlantic Time (Canada)": "Hora del Atlántico (Canadá)"
"Caracas": "Caracas"
"La Paz": "La Paz"
"Santiago": "Santiago"
"Newfoundland": "Terranova"
"Brasilia": "Brasilia"
"Buenos Aires": "Buenos Aires"
"Georgetown": "Georgetown"
"Greenland": "Groenlandia"
"Mid-Atlantic": "Atlántico medio"
"Azores": "Azores"
"Cape Verde Is.": "Isla Cabo Verde"
"Dublin": "Dublín"
"Edinburgh": "Edimburgo"
"Lisbon": "Lisboa"
"London": "Londres"
"Casablanca": "Casablanca"
"Monrovia": "Monrovia"
"UTC": "UTC"
"Belgrade": "Belgrado"
"Bratislava": "Bratislava"
"Budapest": "Budapest"
"Ljubljana": "Ljubljana"
"Prague": "Praga"
"Sarajevo": "Sarajevo"
"Skopje": "Skopje"
"Warsaw": "Varsovia"
"Zagreb": "Zagreb"
"Brussels": "Bruselas"
"Copenhagen": "Copenhague"
"Madrid": "Madrid"
"Paris": "París"
"Amsterdam": "Amsterdam"
"Berlin": "Berlín"
"Bern": "Berna"
"Rome": "Roma"
"Stockholm": "Estocolmo"
"Vienna": "Viena"
"West Central Africa": "Centro-Oeste de África"
"Bucharest": "Bucarest"
"Cairo": "El Cairo"
"Helsinki": "Helsinki"
"Kyev": "Kyev"
"Riga": "Riga"
"Sofia": "Sofía"
"Tallinn": "Tallin"
"Vilnius": "Vilnius"
"Athens": "Atenas"
"Istanbul": "Estambul"
"Minsk": "Minsk"
"Jerusalem": "Jerusalén"
"Harare": "Harare"
"Pretoria": "Pretoria"
"Moscow": "Moscú"
"St. Petersburg": "San Petersburgo"
"Volgograd": "Volgogrado"
"Kuwait": "Kuwait"
"Riyadh": "Riad"
"Nairobi": "Nairobi"
"Baghdad": "Bagdad"
"Tehran": "Teherán"
"Abu Dhabi": "Abu Dhabi"
"Muscat": "Moscatel"
"Baku": "Bakú"
"Tbilisi": "Tbilisi"
"Yerevan": "Ereván"
"Kabul": "Kabul"
"Ekaterinburg": "Ekaterinburg"
"Islamabad": "Islamabad"
"Karachi": "Karachi"
"Tashkent": "Tashkent"
"Chennai": "Chennai"
"Kolkata": "Kolkata"
"Mumbai": "Mumbai"
"New Delhi": "Nueva Delhi"
"Kathmandu": "Katmandú"
"Astana": "Astana"
"Dhaka": "Dhaka"
"Sri Jayawardenepura": "Sri Jayawardenepura"
"Almaty": "Almaty"
"Novosibirsk": "Novosibirsk"
"Rangoon": "Rangún"
"Bangkok": "Bangkok"
"Hanoi": "Hanoi"
"Jakarta": "Yakarta"
"Krasnoyarsk": "Krasnoyarsk"
"Beijing": "Beijing"
"Chongqing": "Chongqing"
"Hong Kong": "Hong Kong"
"Urumqi": "Urumqi"
"Kuala Lumpur": "Kuala Lumpur"
"Singapore": "Singapur"
"Taipei": "Taipei"
"Perth": "Perth"
"Irkutsk": "Irkutsk"
"Ulaan Bataar": "Ulán Bator"
"Seoul": "Seúl"
"Osaka": "Osaka"
"Sapporo": "Sapporo"
"Tokyo": "Tokio"
"Yakutsk": "Yakutsk"
"Darwin": "Darwin"
"Adelaide": "Adelaida"
"Canberra": "Canberra"
"Melbourne": "Melbourne"
"Sydney": "Sydney"
"Brisbane": "Brisbane"
"Hobart": "Hobart"
"Vladivostok": "Vladivostok"
"Guam": "Guam"
"Port Moresby": "Port Moresby"
"Magadan": "Magadan"
"Solomon Is.": "Islas Salomón"
"New Caledonia": "Nueva Caledonia"
"Fiji": "Fiji"
"Kamchatka": "Kamchatka"
"Marshall Is.": "Islas Marshall"
"Auckland": "Auckland"
"Wellington": "Wellington"
"Nuku'alofa": "Nuku'alofa"