יוצא לי כבר הרבה שנים לראות הרבה פתרונות מוזרים לאיך שאנשים מתנהגים עם שפות כחלק מהאתר או האפליקציה שלהם. החלטתי להראות איך אפשר לעשות את זה אולי קצת יותר בקלות עם רילז.
אני החלטתי ללכת על קישור בצורה הבאה:
/he/home /en/home
העניין הוא ש /lang/ משתנה בהתאם לשפה, אבל בפועל הלוגיקה אצלי בתוכנה לא משתנה. אז איך לגרום שהניתוב יהיה כזה ?
בקובץ routes.rb נוסיף את השורה בצורה הבאה:
map.home :home, :action => 'home', :controller => 'index', :path_prefix => '/:locale'
והנה ההסבר:
יצרתי קישור סטטי עבור דף בשם home. הוא שייך לcontroller של index (במקרה הזה), ולפעולה שנקראת home (אפשר גם לספק שם אחר, אבל אני מעדיף שלא). עד כאן זה נראה ניתוב סטטי די בסיסי ופשוט ברילז. אבל הוספתי גם עוד אפשרות של prefix לנתיב. זה אומר בעצם מה המקדם שיהיה. במקרה הזה אני יוצר משתנה בשם locale במקום שם סטטי.
עכשיו ב controller הראשי (application_controller.rb) נכתוב את הקוד הבא:
before_filter :set_locale def set_locale I18n.locale = (I18n.available_locales.include? params[:locale]) ? params[:locale] : I18n.default_locale end
וזו כל הלוגיקה שיש לנו.
מה שקורה כאן, זה כל פעם שנכנסים ל controller (כלומר עבור כל בקשה של דף) המתודה set_locale תרוץ. המתודה מחפשת את ה locale ובמידה והוא קיים ברשימת הlocale הקיימים בתוכנית, הוא מחליט שזו השפה של הדף. במידה ולא, אז הוא משתמש בשפת ברירת המחדל שהגדרנו עבור האפליקציה.
אני יצרתי גם helper נחמד שמקצר לי את האפשרות לתרגום:
def tp(text) I18n.t text.to_sym, :scope => [:pages, @page.to_sym] rescue text.to_s end
ה helper כאמור נגיש ב view. וב view עצמו זה יראה ככה:
<%= link_to tp(:home), home_path(@lang) %>
וזה הכל 🙂