Dwujezyczna wersja aplikacji www

Witajcie,

Model Article posiada :title oraz :content.

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 ?

Czy macie jakies ciekawsze rozwiazanie problemu ?

Nie wymyślaj koła. :slight_smile:
http://guides.rubyonrails.org/i18n.html

Czytalem ten artykul, gdzie tam jest rozwiazanie mojego problemu ?

Pozdrowienia

Fail, Olek – problem kolegi właśnie przerasta railsowe i18n w swojej podstawowej postaci :stuck_out_tongue:

@astropanic: ja zrobiłem dokładnie jak opisujesz, nie znalazłem lepszego rozwiązania :confused:

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 :slight_smile:

Aaaa, kurde, myślałem, że chodzi o proste i18n i się zdziwiłem, po co jakieś kombinowanie w modelu. :confused:

[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).

pozdrawiam

[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 ?

Kiedys robilem wielojezycznego cmsa na http://iain.nl/2008/09/plugin-translatable_columns/
Idea jest bardzo zblizona do Twojej i dziala calkiem milo

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.

pozdrawiam

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 ?

Pozdrowienia

Walnę coś jutro przy śniadaniu, stay tuned :slight_smile:

Hm a patrzyles na linka ktory wcisnolem 5 postow wyzej ? Wydaje mi sie, ze w pelni sprosta zadaniu :slight_smile: No chyba, ze lubisz wymyslac kolo na nowo :slight_smile:

Sniadanko zjedzone ? :wink:

No dobra, przy lunchu :wink:

Hmm, nie pomyślałem o tym. Wybaczcie :slight_smile:
Kiedyś widziałem coś takiego, ale nie pamiętam gdzie… muszę poszukać.

pozdrawiam

Cóż, jak się nie umie szukać w sieci, to trzeba pisać samemu :smiley:

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 :wink:

Bardzo dobre, dziekuje, mam jednak jedna uwage

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]

Pozdrowienias