{"id":60,"date":"2009-08-06T18:46:47","date_gmt":"2009-08-06T18:46:47","guid":{"rendered":"http:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/"},"modified":"2009-08-06T18:46:47","modified_gmt":"2009-08-06T18:46:47","slug":"developing-multilingual-websites-using-php-part-1","status":"publish","type":"post","link":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/","title":{"rendered":"Developing multilingual websites using PHP, part 1"},"content":{"rendered":"<p><font size=\"3\" face=\"Calibri\">In today&rsquo;s World Wide Web, people expect to read websites in their own language.<span>&nbsp; <\/span>Many Israeli websites now appear in Hebrew for Israelis, in English for the international community, and in other languages, such as Russian or Arabic.<span>&nbsp; <\/span>To make a website work properly in many languages, one must take care of a few issues.<span>&nbsp; <\/span>This article will deal with the general issues of making a website multilingual, and the next week&rsquo;s article should discuss the specific issues of left-to-right vs. right-to-left.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><b><span style=\"font-size: 14pt; line-height: 115%\"><font face=\"Calibri\">Character Sets <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">Consistent use of character sets will make sure that the local-language letters are displayed correctly.<span>&nbsp; <\/span>Inconsistent use of character sets will cause the browser to display question marks or gibberish instead.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">One character set for displaying Hebrew and English characters is ISO 8859-8.<span>&nbsp; <\/span>This standard is the same as ASCII for the first 127 characters, and uses some of the remaining 127 characters for Hebrew.<span>&nbsp; <\/span>Most older Hebrew\/English websites use this standard, and it is still considered an official ISO standard.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">Another option is UTF-8 (Unicode). This standard uses one byte for Latin characters and two bytes for international characters, such as Hebrew or Russian.<span>&nbsp; <\/span>This is the recommended character set because it allows one to have a single database that stores data for most common languages.<span>&nbsp; <\/span>To define a file as a UTF-8 file, one must define the character set in the editor.<span>&nbsp; <\/span>When a file is saved as UTF-8, it will contain the <\/font><a href=\"http:\/\/en.wikipedia.org\/wiki\/Byte-order_mark\"><font size=\"3\" color=\"#800080\" face=\"Calibri\">Byte Order Mark (BOM)<\/font><\/a><font size=\"3\" face=\"Calibri\">, so that editors will identify it as a UTF-8 file.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">For the browser to identify the character set, it should be defined in the header.<span>&nbsp; <\/span>In PHP, it can be defined by adding the following line at the beginning of the page:<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><!--p header('Content-Type: text\/html; charset=utf-8')--><\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">Alternatively, one may use the following line within the html section:<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">Pages loaded by AJAX must also have a character set header to make sure the section dynamically produced is rendered correctly.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Additionally, it is important to make sure the database and administration software are also set up for the correct character set, and any third party code generator <span>&nbsp;<\/span>needs to be configured for the character set as well.<span style=\"font-family: 'Courier New'\"> <\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/font><\/font><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; tab-stops: 296.25pt\" class=\"MsoNormal\"><b><span style=\"font-size: 14pt; line-height: 115%\"><font face=\"Calibri\">Dictionary for texts <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">When the same site is rendered in several languages, it is important that every text display appears in the selected language.<span>&nbsp; <\/span>This includes regular texts, buttons, popup messages, emails, and everything else.<span>&nbsp; <\/span>This requires that every text display retrieve the text from a data dictionary.<span>&nbsp; <\/span>There are a few possible ways of storing a text dictionary.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpFirst\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">In the database <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">The advantage is that the data dictionary is completely separated from the code, so it is easier to have non-programmers manage the text dictionary.<span>&nbsp; <\/span>The disadvantage is that database data is not generally treated as static, and a database administrator could accidently erase the dictionary when erasing the test data.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">A formatted text file <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">This takes some extra work in setting up a format and developing functionality to read the file.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">A PHP file containing define statements <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">If one is doing it this way, it is advisable to have a naming convention to make it clear what is a language-dependent constant.<span>&nbsp; <\/span>Some frameworks, such as Smarty, use this method.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">A PHP file containing an array of definitions <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt 0.5in\" class=\"MsoListParagraphCxSpLast\"><font size=\"3\" face=\"Calibri\">The file would look something like this:<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><!--p\n\n<p mce_keep=\"true\" mce_keep=\"true\" mce_keep=\"tru-->&nbsp;<\/font><\/span><\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">$dictionary_array=array <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">( <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;<\/span>&lsquo;definition1&rsquo;=&gt;&rsquo;text1&rsquo;, <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;<\/span>&lsquo;definition2&rsquo;=&gt;&rsquo;text2&rsquo;, <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">&hellip; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">); <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt; line-height: normal\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">?&gt; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt 0.5in\" class=\"MsoListParagraph\"><font size=\"3\" face=\"Calibri\">Every text display would then need to check for the value in the array.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><b><span style=\"font-size: 14pt; line-height: 115%\"><font face=\"Calibri\">Database data in multiple languages <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">There are two possibilities in making the data in the database work with multiple languages.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpFirst\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">Extra fields in tables with multilingual data <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">For example, if there is a field &ldquo;city&rdquo; which needs to be rendered in both Hebrew and English, the table would have a field &ldquo;city_he&rdquo; and another field &ldquo;city_en&rdquo;.<span>&nbsp; <\/span>This solution works well if the site has only two or three languages and there is no need to add more languages.<span>&nbsp; <\/span>It is much easier managing all the data within one table with a fixed number of fields.<span>&nbsp; <\/span>However, if one wants to add morel languages, it would require modification of the database, and this means the site can never be left permanently to non-DBA&rsquo;s to manage.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">An additional table for each table that has multilingual data <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">For example, if the table &ldquo;cities&rdquo; has the field &ldquo;latitude&rdquo; which is not language dependent and the field &ldquo;name&rdquo; which is different for each language, there would be 2 tables &ndash; &ldquo;cities&rdquo; and &ldquo;cities_lang&rdquo;.<span>&nbsp; <\/span>&ldquo;cities&rdquo; would contain the fields &ldquo;id&rdquo; and &ldquo;latitude&rdquo;, and &ldquo;cities_lang&rdquo; would contain the fields &ldquo;id&rdquo;, &ldquo;city_id&rdquo;, &ldquo;lang&rdquo;, and &ldquo;name&rdquo;.<span>&nbsp; <\/span>If the site is displayed in 5 languages, for each record in &ldquo;cities&rdquo;, there would be 5 records in &ldquo;cities_lang&rdquo;.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt 0.5in\" class=\"MsoListParagraphCxSpLast\"><font size=\"3\" face=\"Calibri\">This makes queries more complicated, as an additional join is required, and it also makes more work each time one adds a record to &ldquo;cities&rdquo;.<span>&nbsp; <\/span>The advantage is that, when one adds more languages, there is no need to change the database structure or queries.<\/font><\/p>\n<p><font size=\"3\" face=\"Calibri\"><\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><b><span style=\"font-size: 14pt; line-height: 115%\"><font face=\"Calibri\">Defining current language <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpFirst\"><font size=\"3\" face=\"Calibri\">Another issue in multilingual websites is defining the current language.<span>&nbsp; <\/span>Here are some possibilities to determine in what language to display the content.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">Selected language <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">If the user selects a language to view the website, that&rsquo;s what language it should be viewed in.<span>&nbsp; <\/span>To keep this language when traversing pages in the website, the programmer should store the current language either in the &ldquo;session&rdquo; or in a cookie.<\/font><\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpMiddle\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">The language of the browser.<span>&nbsp; <\/span><\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">Usually, the settings of the browser contain one or more preferred languages.<span>&nbsp; <\/span>Below is some PHP code to detect if one of the browser&rsquo;s languages is a language that the website may be displayed in.<span>&nbsp; <\/span>This code uses the international 2-letter code standard.<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt 0.5in\" class=\"MsoListParagraphCxSpLast\"><font size=\"3\" face=\"Calibri\">(Adapted from sample code in php.net)<\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><!--p\n\n<p mce_keep=\"true\" mce_keep=\"true\" mce_keep=\"tru-->&nbsp;<\/font><\/span><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">if(isset($_SERVER[&#8216;HTTP_ACCEPT_LANGUAGE&#8217;])) <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;<\/span>{ <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>$lang_list=$_SERVER[&#8216;HTTP_ACCEPT_LANGUAGE&#8217;]; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>$lang_list=split(&#8216;;&#8217;, $lang_list); <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>$lang_list=$lang_list[0]; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>$lang_list=split(&#8216;,&#8217;,$lang_list); <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>foreach($lang_list as $lang) <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>{ <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp; <\/span>$lang_parts=split(&#8216;-&#8216;,$lang); \/\/ treat en-us as &ldquo;en&rdquo; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp; <\/span>if (language_exists($lang_parts[0])) <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp; <\/span>{ <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>$selected_language=$lang_parts[0]; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>break; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;&nbsp; <\/span>} <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp; <\/span>} <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\"><span>&nbsp;<\/span>} <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><span style=\"font-family: 'Courier New'\"><font size=\"3\">?&gt; <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in; text-indent: -0.25in\" class=\"MsoListParagraphCxSpFirst\"><span style=\"font-family: Symbol\"><span><font size=\"3\">&middot;<\/font><span style=\"font: 7pt 'Times New Roman'\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span dir=\"ltr\"><\/span><b><font size=\"3\"><font face=\"Calibri\">Default language <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 0pt 0.5in\" class=\"MsoListParagraphCxSpMiddle\"><font size=\"3\" face=\"Calibri\">When all else fails, there needs to be a default language to display the content in.<span>&nbsp; <\/span>If there is a large international audience, it will usually be English.<span>&nbsp; <\/span>If the site is intended for use within Israel only, it will usually be Hebrew.<\/font><\/p>\n<p><font size=\"3\" face=\"Calibri\"><\/font><\/p>\n<p style=\"margin: 0in 0in 10pt\" class=\"MsoNormal\"><b><span style=\"font-size: 14pt; line-height: 115%\"><font face=\"Calibri\">Conclusion <\/p>\n<p>&nbsp;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p style=\"margin: 0in 0in 10pt 0.5in\" class=\"MsoListParagraph\"><font size=\"3\" face=\"Calibri\">We see here that, while it is much more work having one dynamic website displayed in many languages, if one follows these steps, one can have a website rendered in an unlimited number of languages.<span>&nbsp; <\/span><\/font><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>In today&rsquo;s World Wide Web, people expect to read websites in their own language.&nbsp; Many Israeli websites now appear in Hebrew for Israelis, in English for the international community, and in other languages, such as Russian or Arabic.&nbsp; To make a website work properly in many languages, one must take care of a few issues.&nbsp; &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Developing multilingual websites using PHP, part 1&#8221;<\/span><\/a><\/p>\n\n\n","protected":false},"author":375,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[39,19,40,41,25,42,5,13,20,43,47,44,6,45,48,46,23,49,8],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-bom","tag-8859-8","tag-arabic","tag-byte","tag-character","tag-english","tag-fischer","tag-hebrew","tag-iso","tag-mark","tag-multilingual","tag-order","tag-php","tag-russian","tag-sets","tag-sql","tag-utf-8","tag-websites","tag-yirmiyahu","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer\" \/>\n<meta property=\"og:description\" content=\"In today&rsquo;s World Wide Web, people expect to read websites in their own language.&nbsp; Many Israeli websites now appear in Hebrew for Israelis, in English for the international community, and in other languages, such as Russian or Arabic.&nbsp; To make a website work properly in many languages, one must take care of a few issues.&nbsp; &hellip; Continue reading &quot;Developing multilingual websites using PHP, part 1&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer\" \/>\n<meta property=\"article:published_time\" content=\"2009-08-06T18:46:47+00:00\" \/>\n<meta name=\"author\" content=\"yirmi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"yirmi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/\"},\"author\":{\"name\":\"yirmi\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/#\\\/schema\\\/person\\\/3ad2fc75c4041622134d8f0f14a2102e\"},\"headline\":\"Developing multilingual websites using PHP, part 1\",\"datePublished\":\"2009-08-06T18:46:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/\"},\"wordCount\":1490,\"commentCount\":0,\"keywords\":[\"(BOM)\",\"8859-8\",\"Arabic\",\"Byte\",\"character\",\"English\",\"Fischer\",\"Hebrew\",\"ISO\",\"Mark\",\"multilingual\",\"Order\",\"PHP\",\"Russian\",\"sets\",\"SQL\",\"UTF-8\",\"websites\",\"Yirmiyahu\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/\",\"url\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/\",\"name\":\"Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/#website\"},\"datePublished\":\"2009-08-06T18:46:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/#\\\/schema\\\/person\\\/3ad2fc75c4041622134d8f0f14a2102e\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/2009\\\/08\\\/06\\\/developing-multilingual-websites-using-php-part-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developing multilingual websites using PHP, part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/#website\",\"url\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/\",\"name\":\"Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer\",\"description\":\"Blog of a PHP Web Programmer\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/#\\\/schema\\\/person\\\/3ad2fc75c4041622134d8f0f14a2102e\",\"name\":\"yirmi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/wp-content\\\/uploads\\\/avatars\\\/375\\\/8c2adaf748317e659d83f249c32af044-bpfull.jpg\",\"url\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/wp-content\\\/uploads\\\/avatars\\\/375\\\/8c2adaf748317e659d83f249c32af044-bpfull.jpg\",\"contentUrl\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/wp-content\\\/uploads\\\/avatars\\\/375\\\/8c2adaf748317e659d83f249c32af044-bpfull.jpg\",\"caption\":\"yirmi\"},\"url\":\"https:\\\/\\\/jobshuk.com\\\/yirmi\\\/author\\\/yirmi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer","og_description":"In today&rsquo;s World Wide Web, people expect to read websites in their own language.&nbsp; Many Israeli websites now appear in Hebrew for Israelis, in English for the international community, and in other languages, such as Russian or Arabic.&nbsp; To make a website work properly in many languages, one must take care of a few issues.&nbsp; &hellip; Continue reading \"Developing multilingual websites using PHP, part 1\"","og_url":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/","og_site_name":"Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer","article_published_time":"2009-08-06T18:46:47+00:00","author":"yirmi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"yirmi","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/#article","isPartOf":{"@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/"},"author":{"name":"yirmi","@id":"https:\/\/jobshuk.com\/yirmi\/#\/schema\/person\/3ad2fc75c4041622134d8f0f14a2102e"},"headline":"Developing multilingual websites using PHP, part 1","datePublished":"2009-08-06T18:46:47+00:00","mainEntityOfPage":{"@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/"},"wordCount":1490,"commentCount":0,"keywords":["(BOM)","8859-8","Arabic","Byte","character","English","Fischer","Hebrew","ISO","Mark","multilingual","Order","PHP","Russian","sets","SQL","UTF-8","websites","Yirmiyahu"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/","url":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/","name":"Developing multilingual websites using PHP, part 1 - Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer","isPartOf":{"@id":"https:\/\/jobshuk.com\/yirmi\/#website"},"datePublished":"2009-08-06T18:46:47+00:00","author":{"@id":"https:\/\/jobshuk.com\/yirmi\/#\/schema\/person\/3ad2fc75c4041622134d8f0f14a2102e"},"breadcrumb":{"@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jobshuk.com\/yirmi\/2009\/08\/06\/developing-multilingual-websites-using-php-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jobshuk.com\/yirmi\/"},{"@type":"ListItem","position":2,"name":"Developing multilingual websites using PHP, part 1"}]},{"@type":"WebSite","@id":"https:\/\/jobshuk.com\/yirmi\/#website","url":"https:\/\/jobshuk.com\/yirmi\/","name":"Yirmi&#039;s World of Web Widgets by Yirmiyahu Fischer","description":"Blog of a PHP Web Programmer","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jobshuk.com\/yirmi\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/jobshuk.com\/yirmi\/#\/schema\/person\/3ad2fc75c4041622134d8f0f14a2102e","name":"yirmi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jobshuk.com\/yirmi\/wp-content\/uploads\/avatars\/375\/8c2adaf748317e659d83f249c32af044-bpfull.jpg","url":"https:\/\/jobshuk.com\/yirmi\/wp-content\/uploads\/avatars\/375\/8c2adaf748317e659d83f249c32af044-bpfull.jpg","contentUrl":"https:\/\/jobshuk.com\/yirmi\/wp-content\/uploads\/avatars\/375\/8c2adaf748317e659d83f249c32af044-bpfull.jpg","caption":"yirmi"},"url":"https:\/\/jobshuk.com\/yirmi\/author\/yirmi\/"}]}},"_links":{"self":[{"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/users\/375"}],"replies":[{"embeddable":true,"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":0,"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"wp:attachment":[{"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/categories?post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jobshuk.com\/yirmi\/wp-json\/wp\/v2\/tags?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}