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:         5.96 msec
Page Memory:   514.9k
docs / viewController / view (200)
Request UUID: 59ef1e06063e89.79542367
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.166.203.76
HTTP_X_REAL_IP
54.166.203.76
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
HTTP_IF_MODIFIED_SINCE
Fri, 18 Aug 2017 00:58:51 GMT
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
42364
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
1508843014.024
REQUEST_TIME
1508843014
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.298 DEBUG 309.73 Configuration loaded:
Array
(
    [0] => app_prod.yml
    [1] => config_prod.yml
)
2 2.571 DEBUG 323.34 Listener "kernel.terminate[webprofiler]" has been added because of hathoora.logger.webprofiler.enabled
3 2.736 DEBUG 326.73 Event kernel.ready has been registered.
4 2.949 DEBUG 335.09 Calling App dispatcher (Array ( [class] => customDispatcher [method] => dispatch ) )...
5 3.111 DEBUG 349.52 Event kernel.route has been registered.
6 3.364 DEBUG 378.88 Event kernel.controller has been registered.
7 3.414 DEBUG 379.84 Calling controller (\docs\controller\viewController::view) with following params
Array
(
    [0] => v1
    [1] => translations
)
8 4.017 INFO 467.19 Template (docs/v1/translations.tpl.php) loaded
9 4.231 INFO 475.53 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/htmlMeta.tpl.php) loaded
10 4.351 INFO 476.78 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/flashMessages.tpl.php) loaded
11 5.557 INFO 438.17 Template (docs.tpl.php) fetched.
12 5.617 DEBUG 437.77 Event kernel.response has been registered.
13 5.658 DEBUG 438.95 Event kernel.terminate has been registered.
14 5.765 DEBUG 442.17 Event kernel.terminate->webprofiler has been notified.
Profiling
template
# Time (msec) Name Cached Took (msec)
1 3.516 docs.tpl.php 0 1.924