# Internationalization See the [internationalization' concepts](../concepts/concepts.md#internationalization-and-localization) for details. Because an API may need to send different data based on the language of the user, Strapi provides a built-in strategy to handle the internationalization (i18n). ## Usage The `i18n` method that will allow you to retrieve the right string based on the language is accessible through the request's context. There are many strategies to define the language that the server should use to return the correct translation. It can be based on the `locale` query parameter, the `cookie` or the `Accept-Language` header. - Query: Add the `locale` parameter in the URL `GET /hello/John?locale=en_US`. - Cookie: Set the `locale` field in the cookie `locale=en\-US;`. - Header: Set the `Accept-Language` header with the value `en_US`. ::: tip Please refer to the [language configuration](../configurations/configurations.md#language) ::: #### Example Let's say we want to say `Hello John` in english and `Bonjour Tom` in french. We need to use the built-in `i18n` feature and replace the string based on the received name. **Path —** `./api/hello/config/routes.json`. ```json { "routes": [ { "method": "GET", "path": "/hello/:name", "handler": "Hello.sayHello" } ] } ``` **Path —** `./api/hello/controllers/Hello.js`. ```js module.exports = { // GET /hello/:name sayHello: async ctx => { ctx.send(ctx.i18n.__('Hello %s', ctx.params.name)); }, }; ``` You need to define the english and french translation for this key. **Path —** `./config/locales/en_US.json`. ```json { "Hello %s": "Hello %s" } ``` **Path —** `./config/locales/fr_FR.json`. ```json { "Hello %s": "Bonjour %s" } ``` That's all! The request `GET /hello/John?locale=en_US` will return `Hello John` and `GET /hello/Tom?locale=fr_FR` will return `Bonjour Tom`.