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
Demo code: link
Written by gerardsans
Related protips
Have a fresh tip? Share with Coderwall community!
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