|
|
|
| РНР установлен в качестве модуля Apache.
Сайт мультиязычный. Для вывода языков используется gettext().
Переводы лежат в файлах ru.mo, en.mo и тд.
При обновлении файла .mo не происходит ровным счетом ничего, так как РНР кэширует эти файлы при первом обращении к ним и сбрасывает кэш только при перезапуске сервера.
Собственно, вопрос, как сбросить кэш не прибегая к перезагрузке сервера?
Пока сделал так:
<?php
// Перевод при помощи gettext
putenv('LANG='.$cfg['langs'][$lng]['locale']);
setlocale(LC_ALL, $cfg['langs'][$lng]['locale']);
// домен по умолчанию
$domain = 'messages_'.$lng;
// Полный путь к переводу
$filename = "{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}.mo";
// Есть ли файл с переводом
if (file_exists($filename)) {
// Последняя правка этого файла
$mtime = filemtime($filename);
// Новое имя файла
$filename_new = "{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}_{$mtime}.mo";
// Если такого файла пока нет
if (!file_exists($filename_new)) {
// Удалить старые ревизии
array_map("unlink", glob("{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}_*.mo"));
// Создать новыую ревизию
copy($filename,$filename_new);
}
// Новый домен
$domain_new = "{$domain}_{$mtime}";
bindtextdomain($domain_new, "./locales");
textdomain($domain_new);
bind_textdomain_codeset($domain_new, $cfg['langs'][$lng]['charset']);
//echo '<!--'._('test').'-->';
}
?>
|
Структура папок такова
locales
----ru_RU
--------LC_MESSAGES
------------messages_ru.mo
----en_US
--------LC_MESSAGES
------------messages_en.mo
|
| |
|
|
|
|
|
|
|
для: mihdan
(20.01.2011 в 12:10)
| | up | |
|
|
|
|
|
|
|
для: mihdan
(21.01.2011 в 18:42)
| | Сброс кэша
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Expires: '.date('r'));
|
| |
|
|
|
|
|
|
|
для: Косорылый
(22.01.2011 в 12:21)
| | наверное всё же mihdan спрашивал не о браузерном кэше? | |
|
|
|
|
|
|
|
для: Косорылый
(22.01.2011 в 12:21)
| | Trianon прав: речь идет о серверном кэшировании, где сам сервер кэширует mo-файлы | |
|
|
|
|
|
|
|
для: mihdan
(20.01.2011 в 12:10)
| | Попутный вопрос, почему может не работать перевод на английский язык (локаль en_SU.utf-8)? | |
|
|
|
|
|
|
|
для: mihdan
(24.01.2011 в 17:10)
| | А разве так локаль пишется? Не en_US случайно? | |
|
|
|
|
|
|
|
для: sim5
(24.01.2011 в 17:14)
| | Очепятка на форуме. В реальном проекте все указано правильно, но не работает английская версия
| |
|
|
|