I am fetching JSON data for use in my website and I need to echo it, like this:
<?php
$json = file_get_contents("/lang/translator.php"); // uses preg_replace to remove whitespace/newlines from my actual json file and then echo's it
$i18n = json_decode($json, true);
if (htmlentities($_GET['lang'], ENT_QUOTES) == 'en')
{
$arr = 'i18n_en';
}
else if (htmlentities($_GET['lang'], ENT_QUOTES) == 'ru')
{
$arr = 'i18n_ru';
}
?>
And I use it like this:
<?php echo $i18n[$arr]['string_key']; ?>
The string_key holds in its value either a English or a Russian translation of my site, depending in which JSON array it is.
The problem:
When I upload my JSON file which holds Cyrillic characters (Russian) this happens:
хорошо --> хорошо
Every single Cyrillic character gets converted to HTML entities. So I found out I could use html_entity_decode() to counter that but imagine how time-consuming it is to do this for every single <?php echo $i18n[$arr]['string_key']; ?> call I have in my code. Isn’t there any way around that? I tried passing $i18n to html_entity_decode() but it expects a string, not an array of strings. Any ideas?
My JSON example:
{
"i18n_en":
{
"key0": "value0",
"key1": "value1"
},
"i18n_ru":
{
"key0": "value0",
"key1": "value1"
}
}
Advertisement
Answer
Once you have set $arr, you could apply html_entities_decode() to every string in the specified language with a foreach loop.
Something like this:
if (htmlentities($_GET['lang'], ENT_QUOTES) == 'en')
{
$arr = 'i18n_en';
}
else if (htmlentities($_GET['lang'], ENT_QUOTES) == 'ru')
{
$arr = 'i18n_ru';
}
foreach ($i18n[$arr] as &$myString) {
$myString = html_entity_decode($myString);
}
Edit. Two posible solutions to fix Warning: Illegal string offset 'i18n_en'.
1:
foreach ($i18n[$arr] as &$myString) {
if(isset($myString)){
$myString = html_entity_decode($myString);
}
}
foreach ($i18n[$arr] as &$myString) {
$myString = html_entity_decode($myString, ENT_COMPAT, 'UTF-8');
}
Or maybe, both combined. Let me know if this works please.