WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hantera flera språk i MVC-Ramverk(CodeIgniter) (https://www.wn.se/forum/showthread.php?t=1048964)

pelmered 2011-07-05 13:53

Hantera flera språk i MVC-Ramverk(CodeIgniter)
 
Jag håller just nu på med ett projekt i CodeIgniter där jag behöver lägga in stöd för flera språk. Det kommer till att börja med vara två språk, men det kommer troligen bli fler inom en inte alltför avlägsen tid.

De krav/önskemål jag har är:
  • Ska klara av flera språk(3+).
  • Möjligheten att lägga in nya språk ska finnas och det ska inte vara så avancerat rent tekniskt(arbetet med själva översättningen är ju inget man kommer undan).
  • Texterna ska kunna ändras ganska enkelt. Det kan vara okej om man måste kunna PHP/HTML för att kunna ändra om lösningen är bra i övrigt.
  • Ska fungera med olika vyer med samma innehåll. Tänker främst på standardwebbplats och mobil webb, men det kan bli fler.
  • Texterna ska bara behöva ändras på ett ställe för att ändringen ska komma upp i alla vyer.
  • Om det blir en databasbaserad lösning(vilket jag antar) så bör det finns möjlighet till att cachea texterna i sin helhet, företrädesvis i Memcached.

Är det någon här som har erfarenhet av detta i något MVC-ramverk(CodeIgniter eller något som liknar på det i strukturen)? Hur löste ni det då?

allstars 2011-07-05 14:33

Jag jobbar med ett .NET MVC 3 projekt där jag ändrar i routes att en språkvariabel alltid ska finnas i urlen (för sökoptimeringens skull). Standard sätter jag till sv.

På varje ActionResult i Controllerna lägger jag till ett attribut (LocalizationAttribute som ärver från ActionFilterAttribute) som lägger till efterfrågat språk (som kommer ifrån urlen) i en kontext.

Till sist har jag en helper som hämtar nuvarande språk från kontexten och presenterar på lite olika sätt beroende på användningsområde, som t ex hämtning från db där man filtrerar på current language.

Om jag gjort det för simpelt eller för krångligt för mig själv vet jag inte, men det fungerar bra tycker jag.

abergman 2011-07-05 14:48

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20410639)
Jag håller just nu på med ett projekt i CodeIgniter där jag behöver lägga in stöd för flera språk. Det kommer till att börja med vara två språk, men det kommer troligen bli fler inom en inte alltför avlägsen tid.

De krav/önskemål jag har är:
  • Ska klara av flera språk(3+).
  • Möjligheten att lägga in nya språk ska finnas och det ska inte vara så avancerat rent tekniskt(arbetet med själva översättningen är ju inget man kommer undan).
  • Texterna ska kunna ändras ganska enkelt. Det kan vara okej om man måste kunna PHP/HTML för att kunna ändra om lösningen är bra i övrigt.
  • Ska fungera med olika vyer med samma innehåll. Tänker främst på standardwebbplats och mobil webb, men det kan bli fler.
  • Texterna ska bara behöva ändras på ett ställe för att ändringen ska komma upp i alla vyer.
  • Om det blir en databasbaserad lösning(vilket jag antar) så bör det finns möjlighet till att cachea texterna i sin helhet, företrädesvis i Memcached.

Är det någon här som har erfarenhet av detta i något MVC-ramverk(CodeIgniter eller något som liknar på det i strukturen)? Hur löste ni det då?

Jag har för mig att det finns lang-moduler för CI.

http://codeigniter.com/wiki/i18n_Mul...ibrary_Helper/

Kanske är till någon hjälp?

pelmered 2011-07-06 13:18

Citat:

Ursprungligen postat av allstars (Inlägg 20410640)
Jag jobbar med ett .NET MVC 3 projekt där jag ändrar i routes att en språkvariabel alltid ska finnas i urlen (för sökoptimeringens skull). Standard sätter jag till sv.

På varje ActionResult i Controllerna lägger jag till ett attribut (LocalizationAttribute som ärver från ActionFilterAttribute) som lägger till efterfrågat språk (som kommer ifrån urlen) i en kontext.

Till sist har jag en helper som hämtar nuvarande språk från kontexten och presenterar på lite olika sätt beroende på användningsområde, som t ex hämtning från db där man filtrerar på current language.

Om jag gjort det för simpelt eller för krångligt för mig själv vet jag inte, men det fungerar bra tycker jag.

Det var något sådant jag tänkte på också.

Har du olika vyer då eller skickar du med en array från controllern med alla texter som ska användas i vyn?

abergman: Tack, men det finns massvis med likande lösningar, till exempel den inbyggda http://codeigniter.com/user_guide/li.../language.html

Problemet är ju att det i grunden blir massa språkfiler vilket kan blir lite svårhanterligt på sikt när det blir en stor sida med massa olika språk.

Kimpo 2011-07-13 22:03

Själv kör jag också .net mvc3 och har byggt en väldigt simpel lösning men fungerar bra för mina ändamål.

Har en tabell [LanguageResources] med en kolumn för nycklar(detta är ett beskrivande strängvärde) och en för värden(själva språkfraserna) och sen en tredje som är id:t för själva språket. Sen cachar jag dem i minnet som en dictionary/namevalue collection och kan fråga efter dem vilket går extremt fort.

Sedan kan du köra på en annan tabell som heter [Languages] där du har alla språken. Har du väldigt bra konventioner för hur all kod skrivs i din "business layer" så skulle du kunna lagra namnen på språken där då det är inte varje dag man slänger in nya språk. Men att ha dem i en tabell är nog att föredra.

obs: Detta använder jag för kortare fraser som namn olika element på sidan som knappar där det står save / spara , kontakta oss / contact us osv...

för ren content med mycket text bör man nog köra på nån annan lösning, mer CMS likt


vad är det för typ av site? Ska en och samma domän presentera innehållet på olika språk (beroende på url parametrar eller användarinställningar) eller kommer varje språk att få en egen domän?

allstars 2011-07-14 09:01

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20410740)
Det var något sådant jag tänkte på också.

Har du olika vyer då eller skickar du med en array från controllern med alla texter som ska användas i vyn?

abergman: Tack, men det finns massvis med likande lösningar, till exempel den inbyggda http://codeigniter.com/user_guide/li.../language.html

Problemet är ju att det i grunden blir massa språkfiler vilket kan blir lite svårhanterligt på sikt när det blir en stor sida med massa olika språk.

Nej samma vyer till alla språk. Jag använder resursfiler för språkversioner.
Då det plockas upp i global.asax (routingen) så sätts språket i någon context som sedan används när .net själv hämtar den resursfil till aktuellt språk.

Hellre en språkfil för varje språk (där standardspråket alltid är komplett) än att skapa olika vyer beroende på språk.

Althalos 2011-07-14 20:36

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20410740)
Det var något sådant jag tänkte på också.

Har du olika vyer då eller skickar du med en array från controllern med alla texter som ska användas i vyn?

abergman: Tack, men det finns massvis med likande lösningar, till exempel den inbyggda http://codeigniter.com/user_guide/li.../language.html

Problemet är ju att det i grunden blir massa språkfiler vilket kan blir lite svårhanterligt på sikt när det blir en stor sida med massa olika språk.

Man vill ju ha språkfiler och inte behöva ändra i vyerna. T.ex. verkar det finns en implementering av gettext som bl.a. används av Wordpress:
http://codeigniter.com/wiki/Category...tion::Gettext/

Jag har översatt Wordpress-sidor med gettext och det har fungerat bra...

pelmered 2011-07-15 01:14

Citat:

Ursprungligen postat av Kimpo (Inlägg 20411451)
Själv kör jag också .net mvc3 och har byggt en väldigt simpel lösning men fungerar bra för mina ändamål.

Har en tabell [LanguageResources] med en kolumn för nycklar(detta är ett beskrivande strängvärde) och en för värden(själva språkfraserna) och sen en tredje som är id:t för själva språket. Sen cachar jag dem i minnet som en dictionary/namevalue collection och kan fråga efter dem vilket går extremt fort.

Sedan kan du köra på en annan tabell som heter [Languages] där du har alla språken. Har du väldigt bra konventioner för hur all kod skrivs i din "business layer" så skulle du kunna lagra namnen på språken där då det är inte varje dag man slänger in nya språk. Men att ha dem i en tabell är nog att föredra.

obs: Detta använder jag för kortare fraser som namn olika element på sidan som knappar där det står save / spara , kontakta oss / contact us osv...

för ren content med mycket text bör man nog köra på nån annan lösning, mer CMS likt

Jag hade tänkt lite på något i stil med det där också. Jag tycker det känns bättre att ha texterna i databasen än att ha dem i textfiler. Känns lättare att underhålla plus att man ganska enkelt kan bygga ett webbinterferera för att ändra i texterna om vill senare(så att andra som inte har programmeringskunskaper kan ändra).

Jag funderade lite på om man skulle göra en sån där lösning men att man har två tabeller med text. En med korta texter(datatyp: VARCHAR(255)) och en med längre beskrivande texter(datatyp: TEXT). Är det en bra lösning eller är det bättre att köra en med TEXT för allt?
Texterna kommer ju cachas i memcached med lång TTL så de kommer nästan aldrig läsas ifrån databasen så det kanske inte gör något om man använder TEXT även för korta värden?

Citat:

Ursprungligen postat av Kimpo (Inlägg 20411451)
vad är det för typ av site? Ska en och samma domän presentera innehållet på olika språk (beroende på url parametrar eller användarinställningar) eller kommer varje språk att få en egen domän?

Det är en webbtjänst med en kontrollpanel. Det är kommer vara mest ganska korta texter men även en del längre beskrivande texter och hjälptexter.

Jag tror jag kommer köra på domän.com/en/... och domän.com/se/. Möjligen kommer vissa länder få en egen domän senare. Det är inte helt klart i dagsläget.

Clarence 2011-07-15 17:38

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20411585)
Jag funderade lite på om man skulle göra en sån där lösning men att man har två tabeller med text. En med korta texter(datatyp: VARCHAR(255)) och en med längre beskrivande texter(datatyp: TEXT). Är det en bra lösning eller är det bättre att köra en med TEXT för allt?
Texterna kommer ju cachas i memcached med lång TTL så de kommer nästan aldrig läsas ifrån databasen så det kanske inte gör något om man använder TEXT även för korta värden?

Rätt tänkt. Cachar du din data i ett annat lager så är det effektiviteten i det lagret som blir det viktiga i slutändan.

Själv tittade jag på gettext, tmx, tbx, xliff etc nyligen till ett nytt projekt men kom fram till att det finns alldeles för dåligt med smidiga, stabila och plattformoberoende öppna mjukvaror för hantering av alla dessa (för att inte tala om att många av formaten i sig redan har en del tveksamheter). Att göra en webb-admin med import/export till en databas kändes mycket bättre.


Alla tider är GMT +2. Klockan är nu 18:56.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson