Your search did not match any results.
Right-to-Left Support

Right-to-Left Support

The Navigation widgets fully support RTL languages. As is illustrated in this demo, the Navigation widgets are able to display their contents in a right-to-left direction and fully mirror associated UI elements. Use the language drop-down menu (change from English to Arabic) to explore the differences between default and RTL modes available in DevExtreme.

Copy to CodeSandBox
Apply
Reset
<div [ngClass]="{'dx-rtl': rtlEnabled}"> <div class="options" > <div class="caption">Options</div> <div class="dx-fieldset"> <div class="dx-field"> <div class="dx-field-label">Language</div> <div class="dx-field-value"> <dx-select-box [items]="languages" [value]="languages[1]" (onValueChanged)="selectLanguage($event)" ></dx-select-box> </div> </div> </div> </div> <div> <div class="dx-fieldset"> <div class="dx-fieldset-header"> <dx-menu [dataSource]="continents" [rtlEnabled]="rtlEnabled" [displayExpr]="rtlEnabled ? 'textAr' : 'text'" ></dx-menu> </div> </div> <div class="dx-fieldset"> <div class="dx-field"> <div class="dx-field-label"> <dx-tree-view [width]=200 [dataSource]="continents" [displayExpr]="rtlEnabled ? 'textAr' : 'text'" [rtlEnabled]="rtlEnabled" ></dx-tree-view> </div> <div class="dx-field-value"> <dx-accordion [dataSource]="europeCountries" [rtlEnabled]="rtlEnabled" [itemTitleTemplate]="rtlEnabled ? 'arabicTitle' : 'englishTitle'" [itemTemplate]="rtlEnabled ? 'arabic' : 'english'" > <div *dxTemplate="let item of 'arabicTitle'"> {{item.nameAr}} </div> <div *dxTemplate="let country of 'arabic'"> <div>عاصمة: {{country.capitalAr}} </div> <div>عدد السكان: {{country.population}} نسمة</div> <div>المساحة: {{country.area}} كم<sup>2</sup></div> </div> <div *dxTemplate="let item of 'englishTitle'"> {{item.nameEn}} </div> <div *dxTemplate="let country of 'english'"> <div>Capital: {{country.capitalEn}} </div> <div>Population: {{country.population}} people</div> <div>Area: {{country.area}} km<sup>2</sup></div> </div> </dx-accordion> </div> </div> </div> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxAccordionModule, DxSelectBoxModule, DxMenuModule, DxTreeViewModule, DxTemplateModule } from 'devextreme-angular'; import { Continent, EuropeCountry, Service } from './app.service'; if(!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'], providers: [Service] }) export class AppComponent { continents: Continent[]; europeCountries: EuropeCountry[]; languages: string[] = [ "Arabic: Right-to-Left direction", "English: Left-to-Right direction" ]; rtlEnabled = false; constructor(service: Service) { this.continents = service.getContinents(); this.europeCountries = service.getEuropeCountries(); } selectLanguage(e) { this.rtlEnabled = e.value === this.languages[0]; } } @NgModule({ imports: [ BrowserModule, DxAccordionModule, DxSelectBoxModule, DxMenuModule, DxTreeViewModule, DxTemplateModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
sup { font-size: 0.8em; vertical-align: super; line-height: 0; } ::ng-deep .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); margin-bottom: 20px; } ::ng-deep .options .dx-fieldset { margin: 0; } ::ng-deep .caption { font-size: 18px; font-weight: 500; padding-right: 15px; } ::ng-deep .dx-theme-material .dx-accordion .dx-accordion-item-opened .dx-accordion-item-title { padding-top: 20px; }
import { Injectable } from '@angular/core'; export class Continent { id: string; text: string; textAr: string; items?: Continent[]; } export class EuropeCountry { nameAr: string; nameEn: string; population: number; area: number; capitalAr: string; capitalEn: string; } let continents: Continent[] = [{ id: "1", text: "Africa", textAr: "أفريقيا", items: [ { id: "1_2", text: "Ethiopia", textAr: "أثيوبيا", items: [{ id: "1_2_1", text: "Addis Ababa", textAr: "أديس أبابا" }, { id: "1_2_2", text: "Dire Dawa", textAr: "دير داوا" }] }, { id: "1_1", text: "Nigeria", textAr: "نيجيريا", items: [{ id: "1_1_1", text: "Lagos", textAr: "لاغوس" }, { id: "1_1_2", text: "Kano", textAr: "كانو" }] } ] }, { id: "2", text: "Asia", textAr: "آسيا", items: [{ id: "2_1", text: "China", textAr: "الصين", items: [{ id: "2_1_1", text: "Beijing", textAr: "بكين" }, { id: "2_1_2", text: "Shanghai", textAr: "شنغهاي" }] }, { id: "2_2", text: "India", textAr: "الهند", items: [{ id: "2_2_1", text: "Indianapolis", textAr: "انديانابوليس" }, { id: "2_2_2", text: "New Delhi", textAr: "نيودلهي" }] }] }, { id: "3", text: "Australia", textAr: "أستراليا", items: [{ id: "3_1", text: "Australia", textAr: "أستراليا", items: [{ id: "3_1_1", text: "Canberra", textAr: "كانبيرا" }, { id: "3_1_2", text: "Melbourne", textAr: "ملبورن" }, { id: "3_1_3", text: "Sydney", textAr: "سيدني" }] }] }, { id: "4", text: "Europe", textAr: "أوروبا", items: [{ id: "4_1", text: "Germany", textAr: "ألمانيا", items: [{ id: "4_1_1", text: "Berlin", textAr: "البرلينية" }, { id: "4_1_2", text: "Hamburg", textAr: "هامبورغ" }] }, { id: "4_2", text: "Russia", textAr: "روسيا", items: [{ id: "4_2_1", text: "Moscow", textAr: "موسكو" }, { id: "4_2_2", text: "Saint Petersburg", textAr: "سانت بطرسبرغ" }] }] }, { id: "5", text: "North America", textAr: "أمريكا الشمالية", items: [{ id: "5_2", text: "Mexico", textAr: "المكسيك", items: [{ id: "5_2_1", text: "Mexico City", textAr: "مكسيكو سيتي" }, { id: "5_2_2", text: "Guadalajara", textAr: "غوادالاخارا" }] }, { id: "5_1", text: "United States", textAr: "الولايات المتحدة الأمريكية", items: [{ id: "5_1_1", text: "New York", textAr: "نيويورك" }, { id: "5_1_2", text: "Washington", textAr: "واشنطن" }] }] }, { id: "6", text: "South America", textAr: "أمريكا الجنوبية", items: [{ id: "6_1", text: "Brazil", textAr: "البرازيل", items: [{ id: "6_1_1", text: "Brasilia", textAr: "برازيليا" }, { id: "6_1_2", text: "Sao Paulo", textAr: "ساو باولو" }] }, { id: "6_2", text: "Colombia", textAr: "كولومبيا", items: [{ id: "6_2_1", text: "Bogota", textAr: "بوغوتا" }, { id: "6_2_2", text: "Medellin", textAr: "ميديلين" }] }] }]; let europeCountries: EuropeCountry[] = [{ nameAr : "النمسا", nameEn : "Austria", population : 8451900, area : 83855.0, capitalEn : "Vienna", capitalAr : "فيينا" }, { nameAr : "بلجيكا", nameEn : "Belgium", population : 11161600, area : 30528.0, capitalEn : "Brussels", capitalAr : "بروكسل" }, { nameAr : "بلغاريا", nameEn : "Bulgaria", population : 7284600, area : 110994.0, capitalEn : "Sofia", capitalAr : "صوفيا" }, { nameAr : "كرواتيا", nameEn : "Croatia", population : 4262100, area : 56594.0, capitalEn : "Zagreb", capitalAr : "زغرب" }]; @Injectable() export class Service { getContinents(): Continent[] { return continents; } getEuropeCountries(): EuropeCountry[] { return europeCountries; } }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular and DevExtreme here: // https://github.com/DevExpress/devextreme-angular/blob/master/README.md System.config({ transpiler: 'ts', typescriptOptions: { module: "commonjs", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.4.5/lib/typescript.js', '@angular/core': 'npm:@angular/core@8.0.0/bundles/core.umd.js', '@angular/common': 'npm:@angular/common@8.0.0/bundles/common.umd.js', '@angular/compiler': 'npm:@angular/compiler@8.0.0/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser@8.0.0/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@8.0.0/bundles/platform-browser-dynamic.umd.js', '@angular/router': 'npm:@angular/router@8.0.0/bundles/router.umd.js', '@angular/forms': 'npm:@angular/forms@8.0.0/bundles/forms.umd.js', '@angular/common/http': 'npm:@angular/common@8.0.0/bundles/common-http.umd.js', 'tslib': 'npm:tslib/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'rxjs/operators': 'npm:rxjs@6.3.3/operators', 'devextreme': 'npm:devextreme@19.1', 'jquery': 'npm:jquery@3.4.1/dist/jquery.min.js', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.6/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devextreme-angular': 'npm:devextreme-angular@19.1' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'rxjs': { main: 'index.js', defaultExtension: 'js' }, 'rxjs/operators': { main: 'index.js', defaultExtension: 'js' }, 'devextreme-angular': { main: 'index.js', defaultExtension: 'js' } } });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.6/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.6/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.6.25/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>