Tutorial: Basic Localization and Nice Urls
Now we learn how to use nice urls and add localization to our project
Code
First we create our hello class little bit differently:
class hello: public application { public: hello(worker_thread &worker) : application(worker) { url.add("^/(en|he)/?$", boost::bind(&hello::say_hello,this,_1)); use_template("view"); } void say_hello(string lang) { set_lang(lang); data::message c; c.message=gettext("Hello World"); render("message",c); } };
Instead of overloading main()
function, we use a url
member of application class and add dispatchers according
to urls we need.
We bind to url that match regular expression: ^/(en|he)/?$
member function say_hello
which receives first matched expression (en|he)
as first parameter (using placeholder _1
).
Then we implement say_hello(string)
member function.
First of all, we define our locale by calling set_lang(lang)
. and then set value of c.message
using gettext()
.
Note: CppCMS gettext implementation is thread safe, thus you can set different languages in different threads.
Template
Now we change our template, and use following code:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" > </head> <% if rtl %> <body dir="rtl"> <% else %> <body> <% end %> <h1><% gt "We want to say" %></h1> <p><% message %></p> </body> <html>
First, we added utf-8
charset and then we have two important localization functions:
<% if rtl %>
is condition that checks if language is written right-to-left, like Hebrew or Arabic.- Instead of writing directly "We want to say" we use command
<% gt "We want to say" %>
, defined that quoted text becomes translated to the target language when template is rendered.
Translation
Now when we build template code we add gettext domain name for our application using -d hello
:
cppcms_tmpl_cc -d hello view.tmpl -o view.cpp
Now when C++ source code is build we can extract messages from them calling
xgettext view.cpp hello.cpp
And translate them.
There is an important part in messages.po:
msgid "LTR" msgstr ""
It should be translated as RTL for languages like Hebrew or Arabic -- right-to-left languages.
After complete translation, we can create standard
gettext directory locale/he/LC_MESSAGES
and put there
our hello.mo.
Configuration and Running
In order to enable gettext support in our application we should add following lines to our config.txt
locale.dir = "./locale" locale.lang_list = { "he" "en" } locale.domain_list = { "hello" }
Specifying location of "locale" directory, the list of supported languages and list of supported domains.
Now we can run our application
cppcms_run hello.fcgi -c config.txt
We can go to localhost:8080/hello.fcgi/en and see our "Hello World".
We can make urls nicer by adding -s
parameter --- the script path.
cppcms_run -s /hello hello.fcgi -c config.txt
And now we can visit localhost:8080/hello/en or localhost:8080/hello/he