Last Updated: September 09, 2019
·
14.08K
· gerardsans

Angular - Internationalisation - Adding RTL Support

AngularJs Meetup South London Collection | this article

In this protip we will implement a basic rtl support. We are going to define a flag to use in our css classes using the same approach used by Modernizr. You can check the previous protip for more details on the initial configuration here.

Creating a RTL flag function

//language module
angular.module('myapp.language', ['pascalprecht.translate'])

.config(function($httpProvider, $translateProvider) {
   ... //seen before
})

// Service definition
.factory('Language', function ($translate) {
    //add the languages you support here. ar stands for arabic
    var rtlLanguages = ['ar'];

    var isRtl = function() {
        var languageKey = $translate.proposedLanguage() || $translate.use();
        for (var i=0; i<rtlLanguages.length; i+=1) {
            if (languageKey.indexOf(rtlLanguages[i])>-1) 
                return true;
        }
        return false; 
    };

    //public api
    return {
        isRtl: isRtl
    };
});

Changes on index.html

We will use the rtl flag to add a class to the html element. This will be used later as part of a css selector.

<html ng-app="myapp" ng-class="{'rtl':Language.isRtl()}">

Changes on app.js

We need to add the language module dependency and expose the service to the page.

angular.module('myapp', [ 
    ... 
    'myapp.language', 
    ...
])
.run(function($rootScope, Language, ...) {
   //make the service available     
   $rootScope.Language = Language;
   ...
});

CSS usage

In order to apply the changes targeting different classes or elements use:

.className img { float:right; }
.rtl .className img { float:left; }

LESS usage

.className { 
     img { float: right; }

     .rtl & { 
       img { float: left; }
     }
}

HTML dir attribute

To help us during the layout for specific texts we can also set the text direction attribute. The syntax is <element dir="ltr|rtl|auto">. We will link it to the previous flag to setup the whole application. By setting this attribute the browser tries to get the desired result on most of the cases.

<html ng-app="myapp" ... dir="{{(Language.isRtl())?'rtl':'ltr'}}">

Resources

Angular supported locales

Demo code: link

AngularJs Meetup South London Collection | this article

Have a fresh tip? Share with Coderwall community!

Post
Post a tip
Did you know?

Angular apps often share the page with analytics and payment scripts that are not Angular modules. Those scripts execute on the same origin as the framework.

Security insights from Cside