2011-03-20 9 views
22

De acuerdo con la documentación al http://guides.rubyonrails.org/i18n.html#adding-date-time-formats, la mejor manera de solicitar formatos específicos para una fecha es definirlos en /config/locales/en.yml. Copié y pegué este archivo: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml en mi directorio local.Personalización del formato de fecha y hora en en.yml en Rails 3

He hecho algunos cambios (asteriscos para el énfasis solamente):

"en-US": 
    date: 
    formats: 
     default: "%Y-%m-%d" 
     **short: "short %b %d"** 

y

time: 
    formats: 
     default: "%a, %d %b %Y %H:%M:%S %z " 
     **short: "short %B %d, %Y"** 

y en mi parcial:

<%= l item.create_date, :format => :short %> 

donde create_date es una fecha y hora fila en mi base de datos de elementos.

he reiniciado mi servidor pero todavía estoy recibiendo una fecha con formato de esta manera: 15 Mar 00:00

Tengo la sensación de que es porque estoy usando ni una fecha o una hora. No puedo encontrar la definición de "corto" o "largo" para datetime. Intenté agregarlo a este archivo agregando este código:

datetime: 
    formats: 
     short: "short %B %d, %Y" 

no luck. Qué me estoy perdiendo. Siento que estoy siguiendo las instrucciones directamente. ¡Gracias!

+0

¿Cuál es el resultado de ejecutar '' item.create_date.class' sobre carriles console' (? O simplemente deshacerse de ellos en la pantalla) –

+0

me sale: ActiveSupport :: TimeWithZone – panzhuli

Respuesta

5

[varios años más tarde ...]

Si desea secar sus formatos de fecha y/o si tiene código heredado con to_s por todo el lugar y no planificar la internacionalización de su aplicación, se puede haga esto:

I18n.t('date.formats').each do |key, value| 
    Date::DATE_FORMATS[key] = value 
end 

Luego defina sus formatos en config/locales/en.yml. Por supuesto, si alguna vez planea traducir su aplicación, necesitará cambiar todas las ocurrencias de to_s para usar el método I18n.l que se sugiere a continuación.

También puede usar esto sin rieles. Sólo tiene que añadir el texto siguiente antes del código anterior:

require 'active_support/time' 
I18n.load_path << 'en.yml' 
8

Sospecho que el problema aquí es en la función I18n: l de Rails. Pruebe con esto:

  1. Añadir debajo de las líneas a uno de sus archivos de inicializador, por ejemplo, config/environment.rb:

    DateTime :: [DATE_FORMATS: corto] = "corta% Y-% m- % d% H:% M:% S"

    Tiempo :: DATE_FORMATS [: corto] = "corto% Y-% m-% d% H:% M:% S"

    Fecha :: DATE_FORMATS [: short] = "short% Y-% m-% d"

  2. modificar vista:

    <% = (item.create_date.to_s: corto)%>

Se puede ver el cambio de salida a "corto algo".

Sé que no es una respuesta perfecta, pero espero que pueda darle algunas pistas (no tuve tiempo de verificar la función I18n :: l).

+0

Esto hace lo truco por ahora - gracias :) – panzhuli

32

[Varios meses más tarde ...]

El problema es que usted está tratando de definir un formato de "fecha y hora" en en.yml, pero el código de localización rieles sólo verifica si hay "fecha" o "tiempo "(agrupando" datetime "in con" time ").

El código erróneo es en el código base i18n here, en la línea 53:

type = object.respond_to?(:sec) ? 'time' : 'date'

Se comprueba si el objeto dado puede responder a "sec"; si es así, lee las cosas del "tiempo" en en.yml, si no, lee el formato de "fecha". Sin "fecha y hora".

Como Tyrael sugirió, puede obligarlo a obedecer su voluntad a punta de pistola a través del código de inicialización. Eso ciertamente funcionará, pero ahora has puesto el código de localización en tus inicializadores. Eso es potencialmente confuso y desordenado, IMO.

OMI, una forma más limpia de hacer esto sería añadir el formato que desea para DateTime a la sección de 'tiempo' de en.yml especificando un 'formato' diferente, así:

en: 
    time: 
    formats: 
     short_datetime: %B %d, %Y 
     long_datetime: %B %d, %Y, at %r 
     hammer_datetime: STOP! %B %d, %Y, is HAMMERTIME! 
     # and so on... da dum... da dum... 

Que podría usar de esta manera:

<%= l item.create_date, :format => :short_datetime %> 

Ese es el enfoque que uso yo mismo.

Pero esté completo, también se puede hacer esto:

en: 
    datetime: 
    formats: 
     default: %B %d, %Y 

Y luego decirle a Rails cómo leerlo, así:

# In your Application Helper 
def localize_datetime(dt) 
    # quick-and-dirty demo... doesn't accept different format options and stuff... 
    dt.strftime(I18n.t(:"datetime.formats.default", {:locale => I18n.locale })) 
end 
def ld(dt) 
    localize_datetime(dt) 
end 
# or something like that... 

Entonces usarlo de esta manera:

<%= ld item.create_date %> 

Esto mantendría la información de localización en sus archivos de localización, pero requiere ensuciarse las manos (código ve no realiza ninguna comprobación de errores, no acepta parámetros, etc.) y le obliga a utilizar una función diferente para generarla (en lugar de simplemente "l", una "ld" dolorosamente larga).

Por último (y probablemente menos), podríamos decirle a los gnomos de Rails que corrijan esa función para que permita la "fecha y hora". :)

Espero que haya sido útil. La mejor de las suertes.

+3

Esto fue útil gracias. Solo quería agregar una nota para los demás (algo que me hizo tropezar): 'item.created_at.to_s (: short_datetime) 'will * not * do localization. Tienes que llamarlo con el método 'l' como' l item.create_date,: format =>: short_datetime'. ¡Gracias! –

+0

¿Su '% B' también se tradujo? De hecho, estoy tratando de localizar los nombres de los meses a través de I18N, hasta ahora sin éxito. – knut

0

sólo quiero aclarar que si se utiliza con el registro activo, simplemente convertir el valor de cadena datetime a date objeto como ejemplo a continuación.

en: 
    date: 
    formats: 
     default: "%Y-%m-%d" 
     short: "%b %d" 
     long: "%B %d, %Y" 

<%= l(post.the_created_at.to_date, format: :long) %>

Cuestiones relacionadas