2009-05-18 8 views
5

Używam wtyczki permalink_fu do tworzenia permalinków z tytułów. Mój problem polega na tym, że jeśli tytuł zawiera niemieckie znaki, są one zastępowane przez "_".Zamień umlaute (äüö) na link SEO w szynach - najlepszy sposób

Co potrzebne jest coś, co zastępuje A z ae ü z ue ö z oe

I Fount String.tr ale tu problemem jest to, że zastępuje ona 1 znak z 1 wymiany, tak to działa zastępowania

ez e o z o

itp

Czy ktoś ma ładne i czyste rozwiązanie za to?

Dzięki

+0

Duplikat http: // stackoverflow.com/questions/225471/how-do-i-replace-acented-latin-characters-in-ruby –

+0

Właściwie to cofam. Wygląda na to, że chcesz zastąpić tylko wybrane znaki, a nie wszystkie. –

+0

Jakiej wersji Ruby używasz? 1.8 był ledwo znany z Unicode. 1.9.2 jest znacznie, dużo, lepiej i dostarcza kilka dobrych narzędzi do tłumaczenia kodu, które znają znaki wielobajtowe, zamiast być powiązane z bajtami. –

Odpowiedz

7

Zastosowanie String.gsub():

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

Oczywiście odnośnika można poprawić za pomocą tabeli odnośników, ale zasada powinna być jasne.

+0

Kiedy to zrobię, otrzymuję 'nieprawidłowy znak wielobajtowy (US-ASCII)' –

+0

@moose: wtedy musisz naprawić ustawienia narodowe (konkretnie LC_CTYPE), pod którym używasz ruby, aby być UTF-8. Obsługa lokalna Ruby jest pitnicą. –

9

Pisałem mała biblioteka nazywa Asciify dokładnie tym celu

$ sudo gem install asciify 

Zastosowanie:

#!/bin/ruby 
require "asciify" 

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

Możesz podać YAML plik dla niestandardowych odwzorowań tak:

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

(patrz the builtin default mapping dla oczekiwanego formatu)

Cały projekt jest dość stary, ale być może spełnia on swoje zadanie. Jeśli nie, być może pomocna będzie source code.

+0

Nice. Właśnie wysłałem do niego PR, aby było łatwiejsze w użyciu. – Adamantish

-1

Spróbuj użyć tego: "Ich bin doch nicht böld ähhh ühh öhhh".gsub(/[äöüßÄÖÜ„“§%&–+]/){|t|t.to_xs}

+1

NoMethodError: niezdefiniowana metoda 'to_xs 'dla" ö ": String –

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

;)

+0

upvote dla zwięzłości i czytelności. – Christian

+1

, ale następnie ponownie, ponieważ wiele 'sub!' S nie działa w ruby1.9 – Christian

+0

Przetestowałem z ruby ​​2.3.1p112 i działa dobrze. – Bijan

12

Spójrz na transliterację i parametryzacji (z transliteracji w lokalizacjach/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" 

Jeśli nie chcesz samodzielnie pisać transliteracji, możesz zainstalować klejnot rails-i18n.