routing-filter
routing-filter copied to clipboard
Support for case insensitive locales
For example it will both support zh-CN
and zh-cn
segments.
Here's the code we used for a project we are working on:
module CaseInsensitiveLocaleSupport
# Extract the segment and find its supported version using the locales_map hash
def extract_segment!(*)
locale = super
CaseInsensitiveLocaleSupport.locales_map.fetch(locale.downcase, locale).to_s if locale
end
# Setup a map for downcased locales
def self.locales_map
@locales_map ||= RoutingFilter::Locale.locales.map { |locale| [locale.to_s.downcase, locale]}.to_h
end
end
class RoutingFilter::Locale
# Update the regexp to ignore case
@@locales_pattern = Regexp.new(locales_pattern.source, Regexp::IGNORECASE)
prepend CaseInsensitiveLocaleSupport
end
As you can see it uses an additional hash that maps downcased locales symbols with their original versions. This will allow to fetch the right locale after extracting the URL segment.
If you think this could be useful we can provide a PR to include this support.
/cc @elia @masterkain
Hi, this leads to duplicate content, IMHO - a bad idea. Take this article for example: http://www.hobo-web.co.uk/duplicate-content-problems/
@rubyconvict you are totally right! I didn't considered this aspect. Do you have any other idea about how to implement this? Or do you think it's not doable at all?
What's the usecase for this?
@simi users could type website paths using both locale segments:
- website.com/zh-CN
- website.com/zh-cn
The last one (zh-cn
), as it is now (or as I think it is :smile:), will not be accepted as valid because it's not listed into I18n.available_locales
.
We are looking for a valid solution to accept both versions setting the current locale to zh-CN
, if possible.
Just redirect from website.com/zh-cn/*
to zh-CN/*
.
Well, redirecting was what I was trying to avoid since zh-CN
is not the only possible locale with this issue and, being needed on a multidomain platform on which each domain can have multiple locales, it would require more maintenance work per domain/locale. I was trying to figure out if this can be made dynamic. Thanks anyway!
@simi p.s sorry for not pointing that out in the too simplified usecase I've presented!
301 redirect is the way to go for SEO, if locele is not in case sensitive I18n.available_locales
, I would check downcased version against downcased array of locales and redirect based on mapping from downcased match, eg. {"zh-cn" => "zh-CN"}. Indeed, this would be cool opt-in feature for this gem.
@rubyconvict yes, that would be great and solve our usecase. Just wondering if and how is possible to make redirects from inside a routing filter. I can't see anything like that in other provided filters.