Nope, no questions, readable enough. I'll give it a shot in my application.... Thanks a lot!

Btw: do you have a change locale link? How do you make sure it plays nice with bookmarkable urls? I was thinking of using a redirect if the page is bookmarkable, but haven't worked it out yet...

Thanks again,
Sebastiaan

Jan Kriesten wrote:

hi sebastiaan,

i just snip the things out and comment (as far as necessary):

use this filter instead of the default wicket filter:

---8<---
object LocaleFilter
{
  final val REQUEST_LOCALE_ATTRIBUTE = "_request_locale_"
}

class LocaleFilter extends WicketFilter
{
  import de.footprint.utils.lang.LocaleUtils
  import javax.servlet.http.HttpServletRequest

  /**
* Extracts an optional locale attribute from the request path and sets the * requests locale as an request attribute. The part of the request path before
   * the first '/' is checked against available java system locales.
   *
   * @param request
   *         incoming request
   * @return relative request paths w/o locale attribute
   */
  override def getRelativePath( request: HttpServletRequest ) =
  {
    val relPath = super.getRelativePath( request )
    val len = relPath.length
    val idx = if( len>2 ) relPath.indexOf( '/' ) else -1

    if( idx >= 0 )
    {
      val lang = relPath.substring( 0, idx )

      LocaleUtils.getLocale( lang ) match
      {
        case Some(locale) =>
request.setAttribute( LocaleFilter.REQUEST_LOCALE_ATTRIBUTE, locale )
          if( len > lang.length ) relPath.substring( lang.length + 1 )
          else ""
        case _ => relPath
      }
    }
    else relPath
  }
}
---8<---

i think that's self explanatory.

second, you have to alter application, session + request a bit.


Application:

---8<---
abstract class LocaleApplication extends WebApplication
{
  /**
   * Evaluate the current Locale to use.
   *
* Based on the Locale provided by the LocaleFilter, the current Locale is selected as:
   *
* - if none is set and no Locale is passed in, the Application default Locale is returned
   * - if none is set but a Locale is passed in, this is returned
* - if a Locale is set by the filter and this is supported by the Application, its returned
   * - if a Locale is set but unsupported, the default Locale is returned
   *
   * @param currentLocale
   *         current Locale in use or null
   * @return Locale to use
   */
  protected[application] def getLocale( currentLocale: Locale ) : Locale =
  {
val request = RequestCycle.get.getRequest.asInstanceOf[WebRequest].getHttpServletRequest.asInstanceOf[HttpServletRequest]; val requestLocale = request.getAttribute( LocaleFilter.REQUEST_LOCALE_ATTRIBUTE ).asInstanceOf[Locale];

    if( requestLocale == null )
    {
      if( currentLocale == null ) getDefaultLocale
      else currentLocale
    }
    else
    if( currentLocale == null || currentLocale != requestLocale )
    {
getSupportedLocales.find( x => x == requestLocale || x.getLanguage == requestLocale.getLanguage ).getOrElse( getDefaultLocale )
    }
    else currentLocale
  }

  /**
   * Sets the Locale to use in newly created sessions.
   *
   * @param session
   *         newly created session
   */
protected def sessionCreateListener( session: WebSession ) = session.setLocale( getLocale( null ) )

  /**
   * Overridden to use the unified Locale selection
   *
   * @param servletRequest
   *         Current request to generate Request instance for.
   * @return new LocaleRequest instance
   */
override protected def newWebRequest( servletRequest: HttpServletRequest ) = new LocaleRequest( servletRequest )

}
---8<---


Request:

---8<---
class LocaleRequest( req: HttpServletRequest ) extends UploadWebRequest( req )
{
  override def getLocale = LocaleApplication.get.getLocale( null )
}
---8<---


Session:

---8<---
class LocaleSession( req: Request ) extends WebSession( req )
{
  override def getLocale =
  {
    val sessionLocale = super.getLocale
    val requestLocale = LocaleApplication.get.getLocale( sessionLocale )

    if( sessionLocale!=requestLocale )
      setLocale( requestLocale )

    requestLocale
  }
}
---8<---


any questions? :D

best regards, --- jan.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to