Rails nimmt ja die Pluralisierung bzw. Singularisierung von Model-Namen automatisch vor. Die funktioniert auch vorzüglich … zumindest in Englisch!!! Blöd nur, wenn man deutsche Model-Namen verwenden möchte. Das führt dann zu so herrlich falschen Pluralisierungen wie “Kategories” oder “Lieferungs”. Die Absicht, trotzdem deutsche Namen zu verwenden und nicht alles ins Englische zu übersetzten, finde ich aber durchaus legitim. So hat man gemäß der objektorientierten Programmierung Namen für Modelle, die man als den realen Objekten leichter zuordnen kann als wenn man sie ins englische übersetzt (z.B. “Lastschrift” statt “Direct Debit”). Außdem erhält man gleich deuschte Begriffe in den URLs, die sich der Benutzer besser merken kann und eventuell auch für Suchmaschinenoptimierung interessant sein könnte.
Die Regeln für Pluralisierung lassen sich in config/initializers/inflections.rb angeben. Dort hat man für deutsche Übersetzungen grundsätzlich zunächst mal die Möglichkeit, die Pluralisierung für einen Namen als Unregelmäßigkeit anzugeben:
inflect.irregular 'boot', 'boote'
Eleganter ist es natürlich, allgemeine Regeln für die Pluralisierung anzugeben, um nicht für jedes neue Model eine neue Regel definieren zu müssen. Leider ist Pluralisierung im deutschen nicht ganz so einfach und so regelmäßig wie im englischen. Ich haben mir trotzdem mal die Mühen gemacht und versucht, einige dieser Regeln in regulären Ausdrücken aufzuschreiben. Sicherlich sind diese noch ausbaufähig, aber ca. 60-70% der Pluralisierungen werden hiernach schon mal richtig gebildet:
ActiveSupport::Inflector.inflections do |inflect|
inflect.plural /(e)$/i, '\1n'
inflect.singular /([a-fh-z]*e)n$/i, '\1'
inflect.plural /([abcdfhijklmnpqrstuvwxyz]{1})$/i, '\1e'
inflect.singular /([abcdfhijklmnpqrstuvwxyz]{1})e$/i, '\1'
inflect.plural /(o)$/i, '\1s'
inflect.singular /^([a-zA-Z]*o)s$/i, '\1'
inflect.plural /(ung)$/i, '\1en'
inflect.singular /(ung)en$/i, '\1'
inflect.irregular 'haus', 'haeuser'
inflect.uncountable %w( benutzer )
end