2012-05-04 11 views
5

Ieri abbiamo avuto una presentazione di Play 2.0 presso il nostro locale JUG ma non siamo riusciti a capire se sia possibile avere URL localizzati (per scopi SEO).URL localizzati in Play 2.0?

Ad esempio/help,/hilfe ecc dovrebbe puntare allo stesso controller ma il modello dovrebbe essere reso con un diverso contenuto linguistico.

C'è un modo per farlo in Play 2.0?

+0

Interessante domanda. –

risposta

3

mi piace la tua domanda, perché era creativo, almeno per me :) controllare questo approccio funziona per me:

conf/routes:

GET  /help  controllers.Application.helpIndex(lang = "en") 
GET  /hilfe controllers.Application.helpIndex(lang = "de") 

GET  /help/:id  controllers.Application.helpTopic(lang = "en", id: Long) 
GET  /hilfe/:id controllers.Application.helpTopic(lang = "de", id: Long) 

controllers/Application.java:

public static Result helpIndex(String lang) { 
    return ok("Display help's index in " + lang.toUpperCase()); 
} 

public static Result helpTopic(String lang, Long id) { 
    return ok("Display details of help topic no " + id + " in " + lang.toUpperCase()); 
} 

views/someView.scala.html:

<a href="@routes.Application.helpIndex("en")">Help index</a><br/> 
<a href="@routes.Application.helpIndex("de")">Hilfe index</a><br/> 

<a href="@routes.Application.helpTopic("en", 12)">Help topic no 12</a><br/> 
<a href="@routes.Application.helpTopic("de", 12)">Hilfe topic no 12</a> 
0

è stato possibile in Play 1.2.x, non in 2.x per quanto ne so. Voglio dire, non è possibile senza duplicare i mapping nel file, aggiungendone uno per EN, uno per DE, ecc.

Un'alternativa più semplice per SEO può essere quella di "falsificare" gli URL nel tuo file Sitemap.

Quindi il file Routes ha

GET /action/:param/:seo-string Controller.methodAction(param) 

così seo-string saranno ignorati in fase di elaborazione e generare diversi link sul vostro file di Sitemaps:

/action/1/english-text 
/action/1/german-text 

Ciò fissati i motori di ricerca. Per gli utenti, quindi vedono l'url nella lingua giusta, è possibile modificare l'URL utilizzando la cronologia HTML 5.

E 'lavoro extra, ma se si vuole veramente ...

1

(Questo è l'approccio diverso rispetto a previous answer, quindi, aggiunto come separati uno)

È inoltre possibile creare una sorta di mapping table nel DB dove è possibile memorizzare percorsi completi per i record con diversi params:

urlpath    record_id lang 
/help/some-topic  12   en 
/hilfe/ein-topic  12   de 

che in conf/routes di file è necessario utilizzare regola che consente di utilizzare Dynamic parts spanning several / (vedi routing doc) vale a dire:

GET /:topic controller.Application.customDbRouter(topic:String) 

Si può anche mescolare entrambi - mechanismus instradamento di serie con uno personalizzato mettendo sopra regola alla fine del file conf/routes se nessuna regola 'statica' sarà disponibile, allora si cercherà di trovare nella tabella di mappatura o restituirà il risultato notFound().

1

Si utilizza da GlobalSettings.onHandlerNotFound() e verificare se si tratta di una versione tradotta dell'URL. Quindi puoi effettuare un reindirizzamento. Tuttavia questo termina con gli URL nella lingua predefinita.

Più pulito sarebbe utilizzare GlobalSettings.onRouteRequest in cui è possibile implementare la propria logica per ottenere il gestore.

Inoltre è possibile creare il proprio router. C'è stata una discussione a riguardo allo google-groups con un scala solution.