Multi-language support, also known as internationalization, is a key feature of modern web applications. Most full-stack PHP frameworks have multilingual support, allowing us to dynamically present the application's interface in different languages without having to copy existing source code for each language. Today, we will discuss how to enable multiple languages in CodeIgniter, and some tips for customizing core features.
Key Points
Configure multilingual support
Before starting to use language support, we need to configure the necessary folders first. The CodeIgniter configuration file located in the application/config directory contains an option named language that defines the default language of the application.
<?php $config['language'] = 'english';
We also need to create actual files containing messages in different languages. These files need to be placed in the application/language directory, each language has a separate directory. For example, the English language file should be in the application/language/english directory and the French language file should be in the application/language/french directory. Let's create some language files that contain error messages for the sample application. Create the file english/message_lang.php (it is important that all language files end with _lang.php). The following code contains some example entries for the content of our language file:
<?php $lang["msg_first_name"] = "First Name"; $lang["msg_last_name"] = "Last Name"; $lang["msg_dob"] = "Date of Birth"; $lang["msg_address"] = "Address";
Of course, you can have multiple language files in a single language directory. It is recommended to group messages into different files based on the context and purpose of the message and prefix the message keys with file-specific keywords for consistency. Another way is to create a separate message file for each controller. The advantage of this technique is that only the required messages are loaded, rather than the entire language file, which can improve some performance.
Loading language file
Even though we created the language files, they are invalid until they are loaded in the controller. The following code shows how to load these files in the controller:
<?php $config['language'] = 'english';
We usually use language files in controllers and views (using language files in models is not a good thing). Here we use the controller's constructor to load the language file so that we can use it throughout the class, and then we reference it in the index() method of the class. The first parameter of the lang->load() method is the language file name without the _lang suffix. The second parameter is optional and is the language directory. If not provided here, it will point to the default language in your configuration. We can use the lang->line() method to directly reference the entry of the language file and assign its return value to the data passed into the view template. Then, in the view, we can use the above language message as $language_msg. Sometimes we also need to load language files directly from the view. For example, using language items for form tags may be considered a good reason to load and access messages directly in the view. These files can be accessed in the view using the same access method as in the controller.
<?php $lang["msg_first_name"] = "First Name"; $lang["msg_last_name"] = "Last Name"; $lang["msg_dob"] = "Date of Birth"; $lang["msg_address"] = "Address";
While it works fine, using $this can be confusing when our view template code is not an actual class. We can also use the following code and the language assistant to load language entries in the view, which makes our code more concise.
<?php class TestLanguage extends CI_Controller { public function __construct() { parent::__construct(); $this->lang->load("message","english"); } function index() { $data["language_msg"] = $this->lang->line("msg_hello_english"); $this->load->view('language_view', $data); } }
This is basically everything you need to know when you get started with CodeIgniter language files. But even if this is simple, loading the necessary language files in each controller is unnecessary duplication, especially if your project contains hundreds of classes. Fortunately, we can use the CodeIgniter hook to build a fast and efficient solution for automatically loading language files for each controller.
Assign language loading responsibilities to hooks
CodeIgniter calls some built-in hooks during its execution. You can find a complete list of hooks in the user guide. We will use the post_controller_constructor hook, which is called immediately after the controller is instantiated and before any other method calls. We enable hooks in the application by setting the enable_hooks parameter in the main configuration file.
<?php $this->lang->line("msg_hello_english");
Then, we can open the hooks.php file in the config directory and create a custom hook, as shown in the following code:
<?php lang("msg_view_english");
This defines the hook and provides the information needed to execute it. The actual implementation will be created in a custom class in the application/hooks directory.
<?php $config['enable_hooks'] = TRUE;
Here, we cannot access the language library using $this->lang, so we need to use the get_instance() function to get the CI object instance and then load the language as before. The language file will now be available for every controller of our application without manually loading it in the controller.
Switch between different languages
Once we have established support for multiple languages, we can provide a link to each language to the user, usually in one of our application menus, where users can click and switch languages. You can use session or cookie values to track active languages. Let's see how we manage language switching using the hook class we generated earlier. First, we need to create a class to switch languages; we will use a separate controller for this as follows:
<?php $config['language'] = 'english';
Then we need to define the link to switch each available language.
<?php $lang["msg_first_name"] = "First Name"; $lang["msg_last_name"] = "Last Name"; $lang["msg_dob"] = "Date of Birth"; $lang["msg_address"] = "Address";
Whenever a user selects a specific language, the switchLangSwitch class's switchLanguage() method assigns the selected language to the session and redirects the user to the home page. Now the active language will change in the session, but it will still not be affected until we load the specific language file for the active language. We also need to modify our hook class to load the language dynamically from the session.
<?php class TestLanguage extends CI_Controller { public function __construct() { parent::__construct(); $this->lang->load("message","english"); } function index() { $data["language_msg"] = $this->lang->line("msg_hello_english"); $this->load->view('language_view', $data); } }
In the LanguageLoader class, we get the active language and load the necessary language files, or load the default language if the session key does not exist. We can load multiple language files for a single language in this class.
Conclusion
Most full-stack PHP frameworks have multilingual support, allowing us to easily present the application's interface in different languages. In this article, we have seen how to offer multiple languages in CodeIgniter. Of course, there are other ways to build multilingual solutions, so feel free to discuss your best practices and experiences in implementing multilingual support in CodeIgniter and even other frameworks. Looking forward to your feedback! Pictures from Fotolia
CodeIgniter Multilingual Support FAQ (FAQ)
(The FAQ part mentioned in the original document should be included here, because the content is long, so it is omitted here. Please add it in full according to the original document.)
The above is the detailed content of PHP Master | Multi-Language Support in CodeIgniter. For more information, please follow other related articles on the PHP Chinese website!