איך לגרום לשפה להיות חלק מהקישור בRails (ולהישאר בחיים)

יוצא לי כבר הרבה שנים לראות הרבה פתרונות מוזרים לאיך שאנשים מתנהגים עם שפות כחלק מהאתר או האפליקציה שלהם. החלטתי להראות איך אפשר לעשות את זה אולי קצת יותר בקלות עם רילז.

אני החלטתי ללכת על קישור בצורה הבאה:

/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) %>

וזה הכל🙂

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s