2009-05-18 24 views
5

Tôi đang sử dụng plugin permalink_fu để tạo liên kết cố định từ tiêu đề. Vấn đề của tôi là: Nếu tiêu đề chứa các ký tự tiếng Đức, chúng chỉ được thay thế bằng '_'.Thay thế umlaute (äüö) cho liên kết SEO trong đường ray - cách tốt nhất

Những gì tôi cần là cái gì đó thay thế ä với ae ü với ue ö với oe

Tôi fount String.tr nhưng vấn đề ở đây là nó thay thế 1 ký tự với 1 thay thế, vì vậy nó có thể làm việc để thay thế

é với e ø với o

, vv

có ai có một giải pháp tốt đẹp và sạch vì điều đó?

Cảm ơn

+0

Bản sao của http: // stackoverflow.com/questions/225471/how-do-i-replace-dấu-latin-characters-in-ruby –

+0

Thực ra, tôi lấy lại. Bạn dường như chỉ muốn thay thế các ký tự được chọn, không phải tất cả. –

+0

Bạn đang sử dụng phiên bản Ruby nào? 1,8 chỉ là Unicode nhận thức được. 1.9.2 là nhiều, nhiều, tốt hơn và cung cấp một số công cụ dịch mã được thiết lập tốt, nhận thức được các ký tự nhiều byte, thay vì được gắn với byte. –

Trả lời

7

Sử dụng String.gsub():

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

Tất nhiên, việc tra cứu có thể được cải thiện bằng cách sử dụng một bảng tra cứu, nhưng nguyên tắc phải rõ ràng.

+0

Khi tôi làm điều này, tôi nhận được 'multibyte char không hợp lệ (US-ASCII)' –

+0

@moose: sau đó bạn cần sửa miền địa phương (cụ thể là LC_CTYPE) theo đó bạn đang chạy ruby ​​là UTF-8. Xử lý miền địa phương của Ruby là một hố cess. –

0

I asked a similar question once. Đó là cho JavaScript, và nó cần một regex dựa trên aproach. Có lẽ giải pháp vẫn mang một số giá trị cho bạn, theo phương pháp luận.

9

Tôi đã viết một thư viện nhỏ gọi là Asciify cho mục đích chính xác điều đó

$ sudo gem install asciify 

Cách sử dụng:

#!/bin/ruby 
require "asciify" 

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

Bạn có thể cung cấp một YAML-file cho ánh xạ tùy chỉnh như sau:

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

(xem the builtin default mapping cho định dạng mong muốn)

Toàn bộ dự án khá cũ, nhưng có thể nó thực hiện công việc bạn cần. Nếu không, có thể là source code sẽ hữu ích.

+0

Tuyệt. Tôi chỉ đăng một PR cho nó để làm cho nó dễ dàng hơn một chút để sử dụng. – Adamantish

-1

Hãy thử sử dụng này: "Ich bin doch nicht böld ähhh ühh öhhh".gsub(/[äöüßÄÖÜ„“§%&–+]/){|t|t.to_xs}

+1

NoMethodError: phương thức không xác định 'to_xs 'cho" ö ": Chuỗi –

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

;)

+0

upvote cho ngắn gọn và dễ đọc. – Christian

+1

nhưng sau đó một lần nữa downvote vì nhiều phụ '' không làm việc trong ruby1.9 – Christian

+0

Tôi đã thử nghiệm với ruby ​​2.3.1p112 và nó hoạt động tốt. – Bijan

12

Nhìn vào transliterate và parameterize (với transliterations trong miền địa phương/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" 

Nếu bạn không muốn tự mình viết tự phiên, bạn có thể cài đặt đá quý rails-i18n.

Các vấn đề liên quan