Fork me on GitHub

Translations

Translations in Hathoora PHP Framework are database driven (and cached) which makes it easy to modify content without any code release. In addition translations can also be used for creating static pages quickly without having to deploy any code.

Database Schema

Following is the required database schema for translations.

            
            CREATE TABLE `translation_key` (
              `translation_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
              `translation_key` varchar(105) NOT NULL,
              `notes` varchar(255) NOT NULL,
              PRIMARY KEY (`translation_id`),
              UNIQUE KEY `item_UNIQUE` (`translation_key`)
            ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


            CREATE TABLE `translation_route` (
              `translation_id` int(11) NOT NULL,
              `route` varchar(150) NOT NULL,
              PRIMARY KEY (`translation_id`,`route`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


            CREATE TABLE `translation_value` (
              `translation_id` int(11) NOT NULL,
              `language` varchar(5) NOT NULL,
              `translation` longtext NOT NULL,
              PRIMARY KEY (`translation_id`,`language`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
            # Sample data
            INSERT INTO `translation_value` VALUES (1,'en_US','Hello, {{name}}'),(1,'fr_FR','Bonjour, {{name}}'),
                                                   (2,'en_US','Today is: {{date}}'),(2,'fr_FR','aujourd\'hui: {{date}}'),
                                                   (3,'en_US','Link to hathoora'),(3,'fr_FR','lien vers hathoora'),
                                                   (4,'en_US','Name is trimmed: "{{name|trim}}"<br />
<br />
Custom filter: "{{name|customFilter(3)|trim}}"'),(4,'fr_FR','nom est coupé: "{{name|trim}}"<br /> <br /> Filtre Personnalisé: "{{name|customFilter(3)|trim}}"');
            INSERT INTO `translation_route` VALUES (2,'hathoora_translation_route'),(3,'hathoora_route_example_title');
        
    

Configuration

Enable configuration in configuration like so

        
            # File config.yml

            hathoora:
                translation:
                    enabled: 1
                    cache_service: @cache@
                    cache_time: 86400
                    dsn: default

                    # display empty translations keys, good for debugging
                    show_empty: true # default value
                    languages: [ en_US, fr_FR ]
                    default_language: en_US

                    # for debugging show translations keys, in below configuration passing
                    # tkDebug=1 would show tks for debugging
                    debug:
                        # GET, HEADER
                        method: GET
                        parameter: tkDebug

                # where cache service is defined as
                cache:
                    debug: 1
                    pools:
                        common: { driver: 'memcache', servers: [{host: "localhost", port: 11211}]}
        
    

hathoora.translation.enabled = 1 adds a translation service. We also passed a cache service so we do not hit database for every fetch. We also specified language we are supporting.

You can now use translation service like so:

        
            // get translation for hathoora_hello_world
            $helloTranslation = $this->getService('translation')->t(
                'hathoora_hello_world', array('name' => 'World')
            );

            // get translations for route
            $routeTranslations = $this->getService('translation')->getRouteTranslations('hathoora_translation_route',
                array(
                    'hathoora_route_example_title' => array(
                        'date' => date('m/d/y H:i:s')
                    ),
                    'hathoora_route_example_body' => array(
                        'link' => 'http://hathoora.org'
                    )
                )
            );
        
    

To learn more about translations, filters and to see translation in action click here.

Page Took:         3.86 msec
Page Memory:   514.37k
docs / viewController / view (200)
Request UUID: 59963bcb07e596.82550606
Get
Post
Cookies
Files
Session
Server
Response
No data.
No data.
No data.
No data.
No data.
REDIRECT_HATHOORA_ENV
prod
REDIRECT_STATUS
200
HATHOORA_ENV
prod
HTTP_HOST
hathoora.org
HTTP_X_FORWARDED_FOR
54.224.184.251
HTTP_X_REAL_IP
54.224.184.251
HTTP_CONNECTION
close
HTTP_ACCEPT_ENCODING
x-gzip, gzip, deflate
HTTP_USER_AGENT
CCBot/2.0 (http://commoncrawl.org/faq/)
HTTP_ACCEPT
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
PATH
/sbin:/usr/sbin:/bin:/usr/bin
SERVER_SIGNATURE
Apache/2.2.15 (CentOS) Server at hathoora.org Port 80
SERVER_SOFTWARE
Apache/2.2.15 (CentOS)
SERVER_NAME
hathoora.org
SERVER_ADDR
192.168.1.11
SERVER_PORT
80
REMOTE_ADDR
207.126.164.119
DOCUMENT_ROOT
/var/websites/hathoora.org/docroot
SERVER_ADMIN
webmaster@hathoora.org
SCRIPT_FILENAME
/var/websites/hathoora.org/docroot/index.php
REMOTE_PORT
45306
REDIRECT_URL
/docs/v1/translations
GATEWAY_INTERFACE
CGI/1.1
SERVER_PROTOCOL
HTTP/1.0
REQUEST_METHOD
GET
QUERY_STRING
REQUEST_URI
/docs/v1/translations
SCRIPT_NAME
/index.php
PHP_SELF
/index.php
REQUEST_TIME_FLOAT
1503017931.031
REQUEST_TIME
1503017931
Status: 200
Headers:
Content-Type
text/html; charset=UTF-8
Configutation
Key Value
app.admin
Array
(
    [pattern] => /admin(|/)
    [directory] => hathoora
    [namespace] => hathoora\admin
)
app.docs
Array
(
    [pattern] => /docs(|/)
    [directory] => hathoora
    [dispatcher] => Array
        (
            [class] => customDispatcher
            [method] => dispatch
        )

)
app.site
Array
(
    [default] => 1
)
hathoora.logger
Array
(
    [profiling] => Array
        (
            [enabled] => 1
        )

    [logging] => Array
        (
            [enabled] => 1
            [level] => DEBUG
        )

    [webprofiler] => Array
        (
            [enabled] => 1
            [system] => 
            [show_redirects] => 
        )

)
hathoora.template
Array
(
    [engine] => Array
        (
            [name] => Stuob
        )

)
hathoora.database
Array
(
    [default] => mysql://dbuser:dbpassword@dbhost:3306/dbname
)
services.container
Array
(
    [class] => \hathoora\container
    [method] => getContainer
)
Logging (14)
hathoora.logger.logging.enabled: 1
# Time (msec) Level Memory (KB) Message
1 2.255 DEBUG 309.33 Configuration loaded:
Array
(
    [0] => app_prod.yml
    [1] => config_prod.yml
)
2 2.373 DEBUG 322.94 Listener "kernel.terminate[webprofiler]" has been added because of hathoora.logger.webprofiler.enabled
3 2.453 DEBUG 326.33 Event kernel.ready has been registered.
4 2.542 DEBUG 334.70 Calling App dispatcher (Array ( [class] => customDispatcher [method] => dispatch ) )...
5 2.613 DEBUG 349.01 Event kernel.route has been registered.
6 2.725 DEBUG 378.35 Event kernel.controller has been registered.
7 2.747 DEBUG 379.30 Calling controller (\docs\controller\viewController::view) with following params
Array
(
    [0] => v1
    [1] => translations
)
8 3.015 INFO 466.66 Template (docs/v1/translations.tpl.php) loaded
9 3.121 INFO 475.00 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/htmlMeta.tpl.php) loaded
10 3.172 INFO 476.25 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/flashMessages.tpl.php) loaded
11 3.688 INFO 437.64 Template (docs.tpl.php) fetched.
12 3.714 DEBUG 437.23 Event kernel.response has been registered.
13 3.731 DEBUG 438.42 Event kernel.terminate has been registered.
14 3.779 DEBUG 441.64 Event kernel.terminate->webprofiler has been notified.
Profiling
template
# Time (msec) Name Cached Took (msec)
1 2.793 docs.tpl.php 0 0.843