ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rails: Internationalisierung
BeitragVerfasst: 25 Sep 2005, 01:21 
Offline
Geselle

Registriert: 06 Okt 2004, 09:50
Beiträge: 157
Hi,

ich habe eine Frage zu Rails: Wenn ich Methoden für die Validierung von Variablen verwende (z.B. validates_presence_of usw.) wird eine entsprechende Fehlermeldung angezeigt, wenn die Validierung fehlschlägt. Diese Fehlermeldungen sind jedoch auf Englisch. Kann man Rails in irgendeiner Weise internationalisieren, so dass man einfach deutsche Meldungen anzeigen lassen kann?

Gruß

Mike


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 17:09 
Offline
Geselle

Registriert: 05 Mai 2005, 14:15
Beiträge: 107
Zum beispiel in dem man folgendes in das Environment einbaut:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
module ActiveRecord
class Errors
begin
@@default_error_messages.update( {
:inclusion => "ist nicht in Liste g��ltiger Optionen enthalten",
:exclusion => "ist reserviert",
:invalid => "ist ung��ltig",
:confirmation => "entspricht nicht der Best��tigung",
:accepted => "muss akzeptiert werden",
:empty => "darf nicht leer sein",
:blank => "darf nicht leer sein",
:too_long => "ist zu lang (h��chstens %d Zeichen)",
:too_short => "ist zu kurz (mindestens %d Zeichen)",
:wrong_length => "hat eine falsche L��nge (es sollten %d Zeichen sein)",
:taken => "ist schon vergeben",
:not_a_number => "ist keine Zahl",
})
end
end
end

# date.rb

require 'date'

class Date
MONTHNAMES = [nil, 'Januar', 'Februar', 'M��rz', 'April', 'Mai',
'Juni', 'Juli', 'August', 'September', 'Oktober',
'November', 'Dezember' ]
end


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 17:40 
Offline
Geselle

Registriert: 06 Okt 2004, 09:50
Beiträge: 157
Ah genial! Danke!

Gruß

Mike


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 18:45 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
toll, oracle! toll, Rails! :)

internationalisierung ist aber noch mehr als übersetzung. es müsste auch dynamisch möglich sein, indem man @@default_error_messages also hash mit block neu initialisiert.

wollen wir das mal ausprobieren und als beispiel ins rails-wiki stellen?

@oracle: warum machst du begin...end um den block? die geschweiften klammern kannst du glaube ich weglassen, wenn du schon runde hast.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 19:45 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
ich habe noch etwas mehr übersetzt und die dynamisierung vorbereitet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Include your app's configuration here:
class ActiveRecord::Errors
ERRORS = {}
ERRORS[:en] = @@default_error_messages
@@default_error_messages = Hash.new do |hash, key|
lang = :de
ERRORS[lang][key]
end

# for pluralize
extend ActionView::Helpers::TextHelper

ERRORS[:en].update(
:cannot_save => proc do |error_count, object_name|
"#{pluralize(error_count, "error")} prohibited this " +
"#{object_name.gsub("_", " ")} from being saved"
end,
:there_were_errors => 'There were problems with the following fields:'
)

ERRORS[:de] = {
:exclusion => 'ist reserviert',
:inclusion => 'ist nicht in der Liste enthalten',
:invalid => 'ist ung��ltig',
:confirmation => 'entspricht nicht der Best��tigung',
:accepted => 'muss akzeptiert werden',
:empty => 'darf nicht leer sein',
:blank => 'darf nicht frei gelassen werden',
:too_long => 'ist zu lang (h��chstens %d Zeichen)',
:too_short => 'ist zu kurz (mindestens %d Zeichen)',
:wrong_length => 'hat eine falsche L��nge (%d Zeichen erwartet)',
:taken => 'ist schon vergeben',
:not_a_number => 'ist keine Zahl',
:cannot_save => proc do |error_count, object_name|
object_name = object_name.to_s.gsub("_", " ").capitalize
"#{error_count} Fehler verhinder#{error_count == 1 ? 't' : 'n'} das Speichern von #{object_name}"
end,
:there_were_errors => 'Es gab Probleme mit folgenden Feldern:',
}
end

module ActionView::Helpers::ActiveRecordHelper
# Returns a string with a div containing all the error messages for the object located as an instance variable by the name
# of <tt>object_name</tt>. This div can be tailored by the following options:
#
# * <tt>header_tag</tt> - Used for the header of the error div (default: h2)
# * <tt>id</tt> - The id of the error div (default: errorExplanation)
# * <tt>class</tt> - The class of the error div (default: errorExplanation)
def error_messages_for(object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")
unless object.errors.empty?
content_tag("div",
content_tag(
options[:header_tag] || "h2",
ActiveRecord::Errors.default_error_messages[:cannot_save].call(object.errors.count, object_name.to_s)
) +
content_tag("p", ActiveRecord::Errors.default_error_messages[:there_were_errors]) +
content_tag("ul", object.errors.full_messages.collect { |msg| content_tag("li", msg) }),
"id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
)
end
end
end
(in die environment.rb)

frage: wie komme ich in zeile 6 an die gewünschte sprache? vielleicht kann man irgendwie auf die aktuelle session zugreifen?

Rails hat wohl bisher kein konzept für sowas. es ist auch nicht möglich, Rails einzudeutschen; Deutsch ist viel zu kompliziert (geni, kompliziertere pluralformen, groß-/kleinschreibung, zeichen, die nicht als identifier auftauchen dürfen etc.) aber wenigstens die validation-fehlermeldungen sind ja für normale user gedacht, die sollte man internationalisieren können.


Zuletzt geändert von murphy am 25 Sep 2005, 19:53, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 19:49 
Offline
Geselle

Registriert: 05 Mai 2005, 14:15
Beiträge: 107
murphy hat geschrieben:
@oracle: warum machst du begin...end um den block? die geschweiften klammern kannst du glaube ich weglassen, wenn du schon runde hast.


Weil ich das irgendwo so gefunden habe ;)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 19:56 
Offline
Geselle

Registriert: 05 Mai 2005, 14:15
Beiträge: 107
murphy hat geschrieben:
frage: wie komme ich in zeile 6 an die gewünschte sprache? vielleicht kann man irgendwie auf die aktuelle session zugreifen?


Folgendes ist in meinem ApplicationController, das hab ich auch aus dem Rails Wiki.

der localize filter checkt den HTTP request und kann dadurch auf die bevorzugte Sprache schliessen




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class ApplicationController < ActionController::Base
include LoginSystem
include SecurityHelper
model :user
before_filter :set_default_content_type
before_filter :localize

def set_content_type(content_type)
@response.headers["Content-Type"] = content_type
end

def set_default_content_type
set_content_type("text/html; charset=utf-8")
end

private

def localize
# We will use instance vars for the locale so we can make use of them in
# the templates.
@charset = 'utf-8'
@headers["Content-Type"] = "text/html; charset=#{@charset}"
# Here is a very simplified approach to extract the prefered language
# from the request. If all fails, just use 'en_EN' as the default.
temp = if @request.env['HTTP_ACCEPT_LANGUAGE'].nil?
[]
else
@request.env['HTTP_ACCEPT_LANGUAGE'].split(',').first.split('-') rescue []
end
language = temp.slice(0)
dialect = temp.slice(1)
@language = language.nil? ? 'en' : language.downcase # default is en
# If there is no dialect use the language code ('en' becomes 'en_EN').
@dialect = dialect.nil? ? language : dialect
# The complete locale string consists of
# language_DIALECT (en_EN, en_GB, de_DE, ...)
@locale = "#{@language}_#{@dialect.upcase}"
@htmllang = @locale.sub('_', '-')
# Finally, bind the textdomain to the locale. From now on every used
# _('String') will get translated into the right language. (Provided
# that we have a corresponding mo file in the right place).
bindtextdomain('messages', "#{RAILS_ROOT}/locale", @locale, @charset)
end
end


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 20:06 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
"bindtextdomain" ?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 20:48 
Offline
Obfuscator

Registriert: 18 Feb 2004, 15:47
Beiträge: 560
Wohnort: Erkelenz (Ostlimburg)
Gettext.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 21:30 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
könntest du das genauer erklären? ist das eine library?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25 Sep 2005, 22:46 
Offline
Geselle

Registriert: 05 Mai 2005, 14:15
Beiträge: 107
GNU gettext ist ein Framework um Programme zu übersetzen.
http://www.gnu.org/software/gettext/

Ist gibt soweit ich weiß zwei Adaptierungen für Ruby, eine die C-Bindings verwendet, und eine native Ruby Implementierung.

Funktionieren tut das in etwa so, dass man alle zu übersetzenden Strings mit folgendem Konstrukt umgibt:




_("��bersetze mich")


und zur Laufzeit werden diese dann durch den korrekt übersetzten String ersetzt.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: