# coding: utf-8 #Make a 'localization' for Date, DateTime and Time. # #This is not using locale, but if you use locale, it is detected and locale sensitive. # #The output is in iso-8859-1, other encodings can be set with Date_locale.set_target_encoding. # require 'date' # #Adaption for a localized Date-class # #Solution based on discussion at ruby-forum.de #-http://forum.ruby-portal.de/viewtopic.php?f=1&t=10527&start=0 # module Date_locale #Constant/Hash with the supported languages. # #Initial definitions are taken from localization_simplified. # #Changes: #* added de_at #* adapted :pt to pt_br (original :pt was French). DATE_TEXTS = { :ca => { :monthnames => [nil] + %w{gener febrer març abril maig juny juliol agost setembre octubre novembre desembre}, :abbr_monthnames => [nil] + %w{gen feb mar abr mai jun jul ago set oct nov des}, :daynames => %w{diumenge dilluns dimarts dimecres dijous divendres dissabte}, :abbr_daynames => %w{dg dl dt dc dj dv ds}, }, :cf => { :monthnames => [nil] + %w{Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre}, :abbr_monthnames => [nil] + %w{Jan Fev Mar Avr Mai Jun Jui Aou Sep Oct Nov Dec}, :daynames => %w{Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi}, :abbr_daynames => %w{Dim Lun Mar Mer Jeu Ven Sam}, }, :cs => { :monthnames => [nil] + %w{Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad Prosinec}, :abbr_monthnames => [nil] + %w{Led Úno Bře Dub Kvě Čvn Čvc Srp Zář Říj Lis Pro}, :daynames => %w{Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota}, :abbr_daynames => %w{Ne Po Út St Čt Pá So}, }, :da => { :monthnames => [nil] + %w{januar februar marts april maj juni juli august september oktober november december}, :abbr_monthnames => [nil] + %w{jan feb mar apr maj jun jul aug sep okt nov dec}, :daynames => %w{søndag mandag tirsdag onsdag torsdag fredag lørdag}, :abbr_daynames => %w{søn man tir ons tors fre lør}, }, :de => { :monthnames => [nil] + %w{Januar Februar März April Mai Juni Juli August September Oktober November Dezember}, :abbr_monthnames => [nil] + %w{Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez}, :daynames => %w{Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag}, :abbr_daynames => %w{So Mo Di Mi Do Fr Sa}, }, :de_at => { :monthnames => [nil] + %w(Jänner Feber März April Mai Juni Juli August September Oktober November Dezember), :abbr_monthnames => [nil] + %w(Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez), :daynames => %w(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag), :abbr_daynames => %w(So Mo Di Mi Do Fr Sa), }, :et => { :monthnames => [nil] + %w{Jaanuar Veebruar Märts Aprill Mai Juuni Juuli August September Oktober November Detsember}, :abbr_monthnames => [nil] + %w{Jaan. Veebr. Märts Apr. Mai Juuni Juuli. Aug. Sep. Okt. Nov. Dets.}, :daynames => %w{Pühapäev Esmapäev Teisipäev Kolmapäev Neljapäev Reedel Laupäev}, :abbr_daynames => %w{P E T K N R L}, }, :en => { :monthnames => [nil] + %w{January February March April May June July August September October November December}, :abbr_monthnames => [nil] + %w{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec}, :daynames => %w{Sunday Monday Tuesday Wednesday Thursday Friday Saturday}, :abbr_daynames => %w{Sun Mon Tue Wed Thu Fri Sat}, }, :es => { :monthnames => [nil] + %w{enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre}, :abbr_monthnames => [nil] + %w{ene feb mar abr may jun jul ago sep oct nov dic}, :daynames => %w{domingo lunes martes miércoles jueves viernes sábado}, :abbr_daynames => %w{dom lun mar mié jue vie sáb}, }, :es_ar => { :monthnames => [nil] + %w{enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre}, :abbr_monthnames => [nil] + %w{ene feb mar abr may jun jul ago sep oct nov dic}, :daynames => %w{domingo lunes martes miércoles jueves viernes sábado}, :abbr_daynames => %w{dom lun mar mié jue vie sáb}, }, :fi => { :monthnames => [nil] + %w{tammikuu helmikuu maaliskuu huhtikuu toukokuu kesäkuu heinäkuu elokuu syyskuu lokakuu marraskuu joulukuu}, :abbr_monthnames => [nil] + %w{tammi helmi maalis huhti touko kesä heinä elo syys loka marras joulu}, :daynames => %w{sunnuntai maanantai tiistai keskiviikko torstai perjantai lauantai}, :abbr_daynames => %w{su ma ti ke to pe la}, }, :fr => { :monthnames => [nil] + %w{janvier février mars avril mai juin juillet août septembre octobre novembre decembre}, :abbr_monthnames => [nil] + %w{jan fév mar avr mai jun jul aoû sep oct nov déc}, :daynames => %w{dimanche lundi mardi mercredi jeudi vendredi samedi}, :abbr_daynames => %w{dim lun mar mer jeu ven sam}, }, :it => { :monthnames => [nil] + %w{Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre }, :daynames => %w{ Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato }, :abbr_monthnames => [nil] + %w{ Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic }, :abbr_daynames => %w{ Dom Lun Mar Mer Gio Ven Sab }, }, :ko => { :monthnames => [nil] + %w{1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월}, :abbr_monthnames => [nil] + %w{1 2 3 4 5 6 7 8 9 10 11 12}, :daynames => %w{일요일 월요일 화요일 수요일 목요일 금요일 토요일}, :abbr_daynames => %w{일 월 화 수 목 금 토}, }, :nl => { :monthnames => [nil] + %w{Januari Februari Maart April Mei Juni Juli Augustus September Oktober November December}, :abbr_monthnames => [nil] + %w{Jan Feb Maa Apr Mei Jun Jul Aug Sep Okt Nov Dec}, :daynames => %w{Zondag Maandag Dinsdag Woensdag Donderdag Vrijdag Zaterdag}, :abbr_daynames => %w{Zo Ma Di Wo Do Vr Za}, }, :no => { :monthnames => [nil] + %w{januar februar mars april mai juni juli august september oktober november desember}, :abbr_monthnames => [nil] + %w{jan feb mar apr mai jun jul aug sep okt nov des}, :daynames => %w{søndag mandag tirsdag onsdag torsdag fredag lørdag}, :abbr_daynames => %w{søn man tir ons tors fre lør}, }, :pt => { :monthnames => [nil] + %w{Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro}, :abbr_monthnames => [nil] + %w{Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez}, :daynames => %w{domingo segunda terça quarta quinta sexta sábado}, :abbr_daynames => %w{Dom Seg Ter Qua Qui Sex Sab}, }, :pt_br => { :monthnames => [nil] + %w{janeiro fevereiro março abril maio junho julho agosto setembro outubro novembro dezembro}, :abbr_monthnames => [nil] + %w{jan fev mar abr mai jun jul ago set out nov dez}, :daynames => %w{domingo segunda terça quarta quinta sexta sábado}, :abbr_daynames => %w{dom seg ter qua qui sex sáb}, }, :ru => { :monthnames => [nil] + %w{Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь}, :abbr_monthnames => [nil] + %w{Янв Фев Мар Апр Май Июн Июл Авг Сен Окт Ноя Дек}, :daynames => %w{Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота}, :abbr_daynames => %w{Вск Пнд Втр Сре Чет Пят Суб}, }, :sv => { :monthnames => [nil] + %w{januari februari mars april maj juni juli augusti september oktober november december}, :abbr_monthnames => [nil] + %w{jan feb mar apr maj jun jul aug sep okt nov dec}, :daynames => %w{söndag måndag tisdag onsdag torsdag fredag lördag}, :abbr_daynames => %w{sön mån tis ons tors fre lör}, }, :sr => { :monthnames => [nil] + %w{Januar Februar Mart April Maj Jun Jul Avgust Septembar Oktobar Novembar Decembar}, :abbr_monthnames => [nil] + %w{Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec}, :daynames => %w{Nedelja Ponedeljak Utorak Sreda Četvrtak Petak Subota}, :abbr_daynames => %w{Ned Pon Uto Sre Čet Pet Sub}, }, :hu => { :monthnames => [nil] + %w{január február március május június július augusztus szeptember október november december}, :abbr_monthnames => [nil] + %w{jan feb már ápr máj jún júl aug sze okt nov dec}, :daynames => %w{vasárnap hétfő kedd szerda csütörtök péntek szombat}, :abbr_daynames => %w{vas hét ked sze csü pén szo}, }, } #~ puts DATE_TEXTS.to_yaml #Not really necessary. #But I want to avoid later changes. DATE_TEXTS.freeze # #Test if the seleted language is available in Date_locale. def self.locale?( lang ) return DATE_TEXTS[lang] end # #Get the key for the wanted language. # #Allows the usage (or not to use) locale. def self.get_language_key( lang = nil ) # #What's the better solution? Check for locale, or check for the method :language? # #if defined?( Locale ) and lang.is_a?(Locale::TagList) if lang.respond_to?(:language) if lang.respond_to?(:charset) && lang.charset != nil Date_locale.set_target_encoding( lang.charset ) end return lang.language.to_sym end case lang when nil #Undefined default, take actual locale or en return defined?( Locale ) ? Locale.current.language.to_sym : :en #This code require locale (or you get an error "uninitialized constant Date_locale::Locale") #when Locale::Object # return lang.language.to_sym else return lang.to_sym end end # #strftime with the day- and month names in the selected language. # #Lang can be a language symbol or a locale. def strftime_locale(format = '%F', lang = nil ) lang = Date_locale.get_language_key(lang) #Get the texts if DATE_TEXTS[lang] daynames = DATE_TEXTS[lang][:daynames] abbr_daynames = DATE_TEXTS[lang][:abbr_daynames] monthnames = DATE_TEXTS[lang][:monthnames] abbr_monthnames = DATE_TEXTS[lang][:abbr_monthnames] else #raise "Missing Support for locale #{lang.inspect}" #fallback to english daynames = DATE_TEXTS[:en][:daynames] abbr_daynames = DATE_TEXTS[:en][:abbr_daynames] monthnames = DATE_TEXTS[:en][:monthnames] abbr_monthnames = DATE_TEXTS[:en][:abbr_monthnames] end #Make the original replacements, after.... result = self.strftime_orig( #...you replaced the language dependent parts. format.gsub(/%([aAbB])/){|m| case $1 when 'a'; abbr_daynames[self.wday] when 'A'; daynames[self.wday] when 'b'; abbr_monthnames[self.mon] when 'B'; monthnames[self.mon] else raise "Date#strftime: InputError" end } ) result.encode("utf-8") end #strftime_locale(format = '%F', lang = :en ) end #module Date_locale class Date include Date_locale alias :strftime_orig :strftime #Redefine strftime with flexible daynames. # def strftime(format = '%F', lang = nil ) return strftime_locale(format, lang ) end #strftime end #class Date # #Redefine strftime for DateTime # class DateTime #No alias! It is done already in class Date. #alias :strftime_orig_date :strftime #Redefine strftime. #strftime_orig is already defined in Date. def strftime( format='%F', lang = nil ) return strftime_locale(format, lang ) end #strftime end class Time include Date_locale alias :strftime_orig :strftime #Redefine strftime for locale versions. def strftime(format='%F', lang = nil ) return strftime_locale(format, lang ) end #strftime end # #Make some quick tests # if __FILE__ == $0 #~ require 'date_locale' d = Date.new(2009,10,21) puts d.strftime("de: %A {%a} {%A} {%W} %w ", :de ) #=> de: Mittwoch {Mi} {Mittwoch} {42} 3 (loc: en) puts d.strftime("en: %A {%a} {%A} {%W} %w ", :en ) #=> en: Wednesday {Wed} {Wednesday} {42} 3 (loc: en) puts "=======Load locale" require 'locale' Locale.current = 'de' puts d.strftime("#{Locale.current}: %A {%a} {%A} {%W} %w") #=> de: Mittwoch {Mi} {Mittwoch} {42} 3 Locale.current = 'en' puts d.strftime("#{Locale.current}: %A {%a} {%A} {%W} %w") #=> en: Wednesday {Wed} {Wednesday} {42} 3 puts d.strftime("de: %A {%a} {%A} {%W} %w (loc: #{Locale.current})", :de ) #=> de: Mittwoch {Mi} {Mittwoch} {42} 3 (loc: en) puts d.strftime("en: %A {%a} {%A} {%W} %w (loc: #{Locale.current})", :en ) #=> en: Wednesday {Wed} {Wednesday} {42} 3 (loc: en) end #if __FILE__ == $0