[Catalyst] Multi-language and REST

Christopher H. Laco claco at chrislaco.com
Fri Apr 25 21:45:25 BST 2008


Ian Docherty wrote:
> Christopher H. Laco wrote:
>> Ian Docherty wrote:
>>> Christopher H. Laco wrote:
>>>> Ian Docherty wrote:
>>>>> I have been pondering how to take an existing Catalyst application =

>>>>> and make it multi-lingual.
>>>>>
>>>>> I would prefer to use a RESTful method, so this would translate =

>>>>> /foo/bar to /en/foo/bar or /fr/foo/bar (for English and French =

>>>>> respectively).
>>>>>
>>>>> The problem as I see it is how to do this. I don't want to move all =

>>>>> my controllers, e.g. MyApp::Controller::Foo::Bar to =

>>>>> MyApp::Controller::Lang::Foo::Bar
>>>>>
>>>>> What other alternatives are there?
>>>>>
>>>>> Regards
>>>>> Ian
>>>>
>>>> Well, I'm sure there's a somewhat elegant way to do this with =

>>>> Chained, but it the other controllers don't use Chained now, that =

>>>> could get fun.
>>> I have considered chained, and would be prepared to re-write the =

>>> existing controllers. A bigger decision would be renaming the =

>>> controllers or moving them.
>>>
>>> e.g. existing MyApp::Controller::Foo::Bar maps to URI /foo/bar
>>>
>>> To match against /<lang>/foo/bar either I can leave the controller =

>>> where it is (lib/MyApp/Controller/Foo/Bar.pm) or move it =

>>> (lib/MyApp/Controller/Lang/Foo/Bar)
>>>
>>> The first approach is less work (only using chained) the second is =

>>> more work, but maps the URI namespace more logically to the Class names.
>>>
>>> What would people do if they were writing a Catalyst App from scratch =

>>> with this feature? That would tell me what the 'best practice' is =

>>> even if it means a big re-write exercise.
>>>>
>>>> The brute force way is to inspect the request and rip out the =

>>>> language portion before sending it on to get dispatched...just like =

>>>> the Flavour plugin does with file extensions:
>>>>
>>>> sub prepare_path {}
>>> One of my pet peeves  is exemplified in the 'Flavour' plugin. It is =

>>> such minimal documentation that it neither tells you what it does or =

>>> why it does it. OK, I can look at the code, but it is too much effort =

>>> unless I think I have a good reason to do so. I assume in this case =

>>> that it is something to do with date strings in the URI (for =

>>> blogging?). I can't be ar**d!
>>>
>>>
>>
>> It does just what just what Bill suggested.
>>
>> "I check if the prefix is a valid language (if it's one of the language
>> files I loaded at startup), if so I then remove it from the request
>> path and append it to the request base."
>>
>> In prepare_path.. you inspect the requested path.. yank out the =

>> language.. then pass along the remaining path...which should map to =

>> your existing controllers just fine.
> I have actually taken a look at the Flavour plugin (can't see for the =

> life of me why it is called that!) and it gives an example of yanking =

> off the /yyyy/mm/dd at the start of a path, putting the values into =

> accessors of flavour (e.g. $c->flavour->year) leaving the rest of the =

> path to be processed as normal. This is pretty much what I want to do =

> for the language so thanks for pointing out the plugin to me.
> =

> I am pretty confident that I can now write a plugin to strip out a =

> language from the start of a path in the same way.
> =

> Looking at the Catalyst best practices, am I going to be polluting the =

> catalyst namespace by writing this as a plugin? I can't see any =

> alternative (making it a base Controller is actually what I am trying to =

> avoid).
> =

> Any suggestions as to a namespace for this? Catalyst::Plugin::LangURI =

> perhaps?

If it's just for your app.. put it in MyApp.pm...
If you want to do something for the rest of us...personally... I'd =

suggest making this part of the I18N plugin... since it's really just =

another way to set the current $c->language...

And...it should be off by default...



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 187 bytes
Desc: OpenPGP digital signature
Url : http://lists.scsys.co.uk/pipermail/catalyst/attachments/20080425/def1=
7726/signature.pgp


More information about the Catalyst mailing list