Перевод часовых поясов

Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.

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

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

14
задан jpoz 8 September 2009 в 22:14
поделиться

3 ответа

Я столкнулся с той же проблемой. Однако, когда я пытался реализовать решение Питера , мне пришло в голову более простое решение. Помощник 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
14
ответ дан 1 December 2019 в 09:13
поделиться

Я предполагаю, что это нужно будет делать вручную, так же, как любые другие переводы 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      
1
ответ дан 1 December 2019 в 09:13
поделиться

У меня была та же проблема, и ответ 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"
4
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: