# Translation
The ng-admin interface uses English as the default language, but supports switching to another language, thanks to [angular-translate](https://angular-translate.github.io/). You just need to provide a dictionary translating the following terms:
```js
{
'BACK': 'Back',
'DELETE': 'Delete',
'CREATE': 'Create',
'EDIT': 'Edit',
'EXPORT': 'Export',
'ADD_FILTER': 'Add filter',
'SEE_RELATED': 'See all related {{ entityName }}',
'LIST': 'List',
'SHOW': 'Show',
'SAVE': 'Save',
'N_SELECTED': '{{ length }} Selected',
'ARE_YOU_SURE': 'Are you sure?',
'YES': 'Yes',
'NO': 'No',
'FILTER_VALUES': 'Filter values',
'CLOSE': 'Close',
'CLEAR': 'Clear',
'CURRENT': 'Current',
'REMOVE': 'Remove',
'ADD_NEW': 'Add new {{ name }}',
'BROWSE': 'Browse',
'N_COMPLETE': '{{ progress }}% Complete',
'CREATE_NEW': 'Create new',
'SUBMIT': 'Submit',
'SAVE_CHANGES': 'Save changes',
'BATCH_DELETE_SUCCESS': 'Elements successfully deleted',
'DELETE_SUCCESS': 'Element successfully deleted',
'ERROR_MESSAGE': 'Oops, an error occurred (code: {{ status }})',
'INVALID_FORM': 'Invalid form',
'CREATION_SUCCESS': 'Element successfully created',
'EDITION_SUCCESS': 'Changes successfully saved',
'ACTIONS': 'Actions',
'PAGINATION': '{{ begin }} - {{ end }} of {{ total }}',
'NO_PAGINATION': 'No record found',
'PREVIOUS': '« Prev',
'NEXT': 'Next »',
'DETAIL': 'Detail',
'STATE_CHANGE_ERROR': 'State change error: {{ message }}',
'NOT_FOUND': 'Not Found',
'NOT_FOUND_DETAILS': 'The page you are looking for cannot be found. Take a break before trying again.',
}
```
*Tip*: For an always up-to-date list of terms to translate, check out [translate.js](https://github.com/marmelab/ng-admin/blob/master/src/javascripts/ng-admin/Main/config/translate.js) in ng-admin source.
For instance, here is how to display all labels in French:
```js
myApp.config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('fr', {
'BACK': 'Retour',
'DELETE': 'Supprimer',
'CREATE': 'Ajouter',
'EDIT': 'Modifier',
'EXPORT': 'Exporter',
'ADD_FILTER': 'Filtrer',
'SEE_RELATED': 'Voir les {{ entityName }} liés',
'LIST': 'Liste',
'SHOW': 'Détails',
'SAVE': 'Enregistrer',
'N_SELECTED': '{{ length }} sélectionnés',
'ARE_YOU_SURE': 'Cette modification est définitive. Confirmez-vous ?',
'YES': 'Oui',
'NO': 'Non',
'FILTER_VALUES': 'Filtrer',
'CLOSE': 'Fermer',
'CLEAR': 'Vider',
'CURRENT': 'Aujourd\'hui',
'REMOVE': 'Retirer',
'ADD_NEW': 'Ajouter un nouveau {{ name }}',
'BROWSE': 'Parcourir',
'N_COMPLETE': '{{ progress }}% terminé',
'CREATE_NEW': 'Créer',
'SUBMIT': 'Valider',
'SAVE_CHANGES': 'Enregistrer',
'BATCH_DELETE_SUCCESS': 'Suppression enregistrée',
'DELETE_SUCCESS': 'Suppression enregistrée',
'ERROR_MESSAGE': 'Erreur serveur (code: {{ status }})',
'INVALID_FORM': 'Formulaire invalide',
'CREATION_SUCCESS': 'Création enregistrée',
'EDITION_SUCCESS': 'Modifications enregistrées',
'ACTIONS': 'Actions',
'PAGINATION': '{{ begin }} - {{ end }} sur {{ total }}',
'NO_PAGINATION': 'Aucun résultat',
'PREVIOUS': '« Précédent',
'NEXT': 'Suivant »',
'DETAIL': 'Détail',
'STATE_CHANGE_ERROR': 'Erreur de routage: {{ message }}',
'NOT_FOUND': 'Page non trouvée',
'NOT_FOUND_DETAILS': 'La page demandée n\'existe pas. Revenez à la page précédente et essayez autre chose.',
});
$translateProvider.preferredLanguage('fr');
}]);
```
All labels and titles are translatable too. By default, ng-admin will appy the translation filter on all of them. For example, if you have a `users` entity, ng-admin generate a `Users` title for the menu if you add one with:
```js
admin.menu(nga.menu()
.addChild(nga
.menu(admin.getEntity('users'))
.icon('')
)
);
```
You can then supply a translation with the key `Users`. If you'd like that key to have the same case as the others, just call the `title` method with the desired key and supply a translation with the same key:
```js
admin.menu(nga.menu()
.addChild(nga
.menu(admin.getEntity('users'))
.icon('')
.title('USERS')
)
);
```
The same principle can be applied to fields labels, choices labels and entities labels:
```js
nga.field('email'); // translation key will be 'Email'
nga.field('email').label('EMAIL'); // translation key will be 'EMAIL'
nga.field('role', 'choice')
.validation({ required: true })
.choices([
{ label: 'ADMIN', value: 'admin' }, // translation key will be 'ADMIN'
{ label: 'USER', value: 'user' }, // translation key will be 'USER'
]);
admin.addEntity(nga.entity('users')); // translation key will be 'Users' (for list view and menus) and 'user' (for creation and edition views)
admin.addEntity(nga.entity('users').title('USERS')); // translation key will be 'USERS' (for list view and menus) and 'USER' (for creation and edition views)
```
If you need to translate the views titles and descriptions, just use the translate filter yourself in the template you supply. For example:
```js
// In your entity configuration file
users.listView()
.title('"USER_LIST" | translate');
users.creationView()
.title('{{ "USER_CREATE" | translate }}')
users.editView()
.title('{{ "USER_EDIT" | translate }}{{ entry.values["email"] }}');
users.deletionView()
.title('{{ "USER_DELETE" | translate }}{{ entry.values["email"] }}');
// In your translations file
myApp.config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('fr', {
USER_LIST: 'Liste des utilisateurs',
USER_CREATE: 'Création d\'un utilisateur: ',
USER_EDIT: 'Edition de l\'utilisateur: ',
USER_DELETE: 'Suppression de l\'utilisateur: ',
});
}
```
To enable runtime language switch, or other options, refer to the [angular-translate documentation](http://angular-translate.github.io/docs/#/guide).