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:         6.12 msec
Page Memory:   515.86k
docs / viewController / view (200)
Request UUID: 5d339dcc5f9938.40213007
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.211.135.32
HTTP_X_REAL_IP
54.211.135.32
HTTP_CONNECTION
close
HTTP_USER_AGENT
CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE
en-US,en;q=0.5
HTTP_IF_MODIFIED_SINCE
Fri, 24 May 2019 10:59:14 BST
HTTP_ACCEPT_ENCODING
gzip
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
50370
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
1563663820.39
REQUEST_TIME
1563663820
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.373 DEBUG 310.34 Configuration loaded:
Array
(
    [0] => app_prod.yml
    [1] => config_prod.yml
)
2 2.666 DEBUG 323.95 Listener "kernel.terminate[webprofiler]" has been added because of hathoora.logger.webprofiler.enabled
3 2.842 DEBUG 327.34 Event kernel.ready has been registered.
4 3.047 DEBUG 335.71 Calling App dispatcher (Array ( [class] => customDispatcher [method] => dispatch ) )...
5 3.212 DEBUG 350.49 Event kernel.route has been registered.
6 3.470 DEBUG 379.84 Event kernel.controller has been registered.
7 3.521 DEBUG 380.80 Calling controller (\docs\controller\viewController::view) with following params
Array
(
    [0] => v1
    [1] => translations
)
8 4.150 INFO 468.15 Template (docs/v1/translations.tpl.php) loaded
9 4.356 INFO 476.49 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/htmlMeta.tpl.php) loaded
10 4.474 INFO 477.74 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/flashMessages.tpl.php) loaded
11 5.714 INFO 439.13 Template (docs.tpl.php) fetched.
12 5.777 DEBUG 438.73 Event kernel.response has been registered.
13 5.818 DEBUG 439.91 Event kernel.terminate has been registered.
14 5.931 DEBUG 443.13 Event kernel.terminate->webprofiler has been notified.
Profiling
template
# Time (msec) Name Cached Took (msec)
1 3.644 docs.tpl.php 0 1.938