2009-05-18 59 views
5

Ich benutze das Permalink_fu-Plugin, um Permalinks aus Titeln zu erstellen. Mein Problem ist: Wenn der Titel deutsche Zeichen enthält, werden sie einfach durch '_' ersetzt.Ersetzen Sie Umlaute (Äüö) für SEO-Link in Schienen - bester Weg

Was ich brauche, ist etwas, das ersetzt ä mit ae ü mit ue ö mit oe

I fount String.tr aber das Problem hier ist, dass es ein Zeichen mit 1 Ersatz ersetzt, so würde es funktionieren für den Ersatz

é mit e ø mit o

usw.

Hat jemand eine schöne und saubere Lösung dafür?

Dank

+0

Doppelte von http: // stackoverflow.com/questions/225471/how-do-ich-ersetzen-Akzent-Latein-Zeichen-in-Rubin –

+0

Eigentlich nehme ich das zurück. Sie scheinen nur ausgewählte Zeichen ersetzen zu wollen, nicht alle. –

+0

Welche Version von Ruby verwenden Sie? 1.8 war kaum Unicode bewusst. 1.9.2 ist viel, viel besser und bietet einige gute Code-Set-Übersetzungs-Tools, die Multi-Byte-Zeichen kennen, anstatt an Bytes gebunden zu sein. –

Antwort

7

Verwendung String.gsub():

"ich bin doch nicht blöd, mann!".gsub(/[äöü]/) do |match| 
    case match 
     when "ä" 
      'ae' 
     when "ö" 
      'oe' 
     when "ü" 
      'ue' 
    end 
end 

Natürlich kann die Suche durch die Verwendung einer Lookup-Tabelle verbessert werden, aber das Prinzip sollte klar sein.

+0

Wenn ich dies tue, bekomme ich 'ungültige Multibyte-Zeichen (US-ASCII)' –

+0

@moose: dann müssen Sie das Gebietsschema (speziell LC_CTYPE), unter dem Sie Rubin ausführen, um UTF-8 sein. Die Gebietsschemabehandlung von Ruby ist eine Sackgasse. –

9

Ich habe eine kleine Bibliothek Asciify für genau

diesen Zweck genannt geschrieben
$ sudo gem install asciify 

Verbrauch:

#!/bin/ruby 
require "asciify" 

"Lücke".asciify #=> "Luecke" 

Sie eine YAML-Datei für benutzerdefinierte Zuordnungen wie so zur Verfügung stellen können:

translator = Asciify.new("/path/to/mappings.yaml") 
output_string = translator.convert("input string") 

(siehe the builtin default mapping für das erwartete Format)

Das ganze Projekt ist ziemlich alt, aber vielleicht macht es die Arbeit, die Sie brauchen. Wenn nicht, wird vielleicht die source code hilfreich sein.

+0

Schön. Ich habe gerade einen PR gepostet, um es etwas einfacher zu machen. – Adamantish

-1

Versuchen Sie dies mit: "Ich bin doch nicht böld ähhh ühh öhhh".gsub(/[äöüßÄÖÜ„“§%&–+]/){|t|t.to_xs}

+1

NoMethodError: undefined Methode 'to_xs 'für" ö ": String –

5
"äöü".gsub('ä','ae').gsub('ö','oe').gsub('ü','ue') 

;)

+0

upvote für die Kürze und Lesbarkeit. – Christian

+1

aber dann wieder downvote, weil mehrere 'sub!' S nicht funktionieren in ruby1.9 – Christian

+0

Ich testete mit Ruby 2.3.1p112 und es funktioniert gut. – Bijan

12

Blick auf transkribieren und parametrieren (mit Transkriptionen in locales/de.yml):

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate

I18n.transliterate("Über der Höhenstraße") 
=> "Ueber der Hoehenstrasse" 

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

"Über der Höhenstraße".parameterize 
=> "ueber-der-hoehenstrasse" 

Wenn Sie die Transliterationen nicht selbst schreiben möchten, können Sie den Edelstein rails-i18n installieren.

Verwandte Themen