W jaki sposob stworzyc dwujezyczna aplikacje , prosty CMS ?
Chodzi mi o panel administracyjny, w jaki sposob zbudowac formularz obslugujacy obydwa jezyki na raz ?
mysalalem o tym aby zdublowac pola formularza i nazwac je :title_pl , :title_en oraz :content_pl oraz :content_en , a nastepnie do modelu dodac metody content_pl= itd i oblugiwac to przez Globalize2, dobry pomysl ?
Ja bym stworzył dwie tabele. Pierwsza to powiedzmy tabela “language” mająca 3 pola: language_id, language_name oraz language_article_id(has_many :articles). Druga tabela to by było natomiast “articles”: article_id, article_title, article_text.
Twoje rozwiązanie jest bardzo nieelastyczne. Problem będzie, jeśli będziesz chciał dodać trzeci…n-ty język. Jeśli się mylę to mnie poprawcie, ale myślę, że to dobre rozwiązanie
[quote=matix]Ja bym stworzył dwie tabele. Pierwsza to powiedzmy tabela “language” mająca 3 pola: language_id, language_name oraz language_article_id(has_many :articles). Druga tabela to by było natomiast “articles”: article_id, article_title, article_text.
Twoje rozwiązanie jest bardzo nieelastyczne. Problem będzie, jeśli będziesz chciał dodać trzeci…n-ty język. Jeśli się mylę to mnie poprawcie, ale myślę, że to dobre rozwiązanie :)[/quote]
Weź przeczytaj pierwszego posta, a potem poczytaj co to Globalize2.
jak pierwszy raz robiłem takie coś, dawno temu właśnie z pomocą globalize, głównie opierałem się na: http://www.artweb-design.de/
i np.: http://www.artweb-design.de/2006/11/10/get-on-rails-with-globalize-comprehensive-writeup
tylko pamiętaj, że to jest już stara wersja
pomogło mi też http://webtypes.com/2007/03/18/globalizing-mephisto
ta sama uwaga tutaj. odrazu mówie, że tego tutoriala nie przejdziesz (sam miałem z nim problem, co widać po komentarzach na tej stronie - rozwiązaniem było to, że tutorial działał z którymś konkretnym commitem - oczywiście nie pamiętam już którym). Myślę jednak, że warto zobaczyć ten plugin.
Po takich początkach, README z globalize2 jest banalne i działa z pewnością (po prostu ustawiasz locale i wyciąga ci odpowiednie dane).
[code]class Site < ActiveRecord::Base
translates :title, :content
def title_en=(value)
I18n.locale = :en
self.title = value
end
def title_en
I18n.locale = :en
self.title
end
def title_pl=(value)
I18n.locale = :pl
self.title = value
end
def title_pl
I18n.locale = :pl
self.title
end
def content_en=(value)
I18n.locale = :en
self.content = value
end
def content_en
I18n.locale = :en
self.content
end
def content_pl=(value)
I18n.locale = :pl
self.content = value
end
def content_pl
I18n.locale = :pl
self.content
end
end[/code]
Jak widac, trzeba sie mocno naklepac, moze daloby sie te metody generowac dynamicznie ?
Zwllaszcza ze Site.globalize_options[:translated_attributes]
zwraca tlumaczone atrybuty
Jakies sugestie ?
Nie wiem za bardzo co chcesz w ten sposób osiągnąć… jednym słowem “you’re doing it wrong”.
Po co ci osobno title_en, title_pl ?Dla każdego języka będziesz miał oddzielny widok?
Powinieneś zrobić metodę set_locale, która ustawia:
domyślnie np. en
żądany język przeglądarki
język przekazany z parametru (np. ?lang=pl)
język zapisany w sesji
Tak wywołana metoda ustawia odpowiednie locale i Railsy zwracają ci odpowiedni title.
Astropanic, podobnie jak ja, chciałby w panelu administracyjnym w jednym formularzu od razu mieć dostępne (edytowalne) stringi dla przewidzianych (“głównych”) locale – np. polskiego i angielskiego.
Dokladnie, zastanawia mnie czy nie daloby sie napisac pluginu typu act_as_costam, ktory jako parametry przyjmowalby interesujace mnie locale ( w tym przypadku :en oraz :pl, oraz na podstawie Site.globalize_options[:translated_attributes] ,majac zarowno porzadane locale jak i atrybuty modelu, wygenerowac accessory dynamicznie. Jak widac na powyzszym przykladzie, dla dwoch atrybutow jest to juz 8 metod, nie wiem jak Wy ale ja jestem leniwy i nie lubie duzo pisac. Nie jestem tez zbyt dumny zeby sie przyznac ze jestem za cienki w uszach zeby samemu taki plugin napisac, wiec jesli macie jakies pomysly, byc moze wspolnie cos wyrzezbimy ?
Cóż, jak się nie umie szukać w sieci, to trzeba pisać samemu
Zamiast surowego dobierania się do danych używa całkiem fajnego interfejsu dodanego przez globalize2 (kudosy dla autora, wypas). Zresztą zachęcam do obejrzenia kodu źródłowego, raptem 20 linijek.
Testowanie, komentarze, sugestie (github issues!) mile widziane. A teraz przepraszam, bo mi narzeczona marudzi żebym wreszcie posprzątał ze stołu po śniadaniu
class Product
translates :title, :description
globalize_accessors :title, :description, :locales => [:pl, :en, :de]
end
Jak widac, podajemy w dwoch miejscach :title, :description, a wiec sprzeczne z zasadami DRY
Nie lepiej by bylo tak ?
class Product
translates :title, :description
globalize_accessors :pl, :en, :de
end
Trza by bylo w samym pluginie pobrac tlumaczone atrybuty bezposrednio z modelu, nie wiem tylko jak zgodnie ze skladnia Ruby dobrac sie z poziomu modulu do nazwy klasy.
Poki co wklepalem na sztywno:
[code] module ActMethods
def globalize_accessors(*attr_names)
languages = attr_names
attribs = Site.globalize_options[:translated_attributes] # Tu zamiast Site na sztywno, trza by bylo pobrac nazwe klasy
attribs.each do |attr_name|
languages.each do |with_locale|
define_method :"#{attr_name}_#{with_locale}" do
globalize.fetch with_locale, attr_name
end
define_method :"#{attr_name}_#{with_locale}=" do |val|
globalize.stash with_locale, attr_name, val
self[attr_name] = val
end
end
end
end
end[/code]