Независимо от того, используете ли вы базу данных или файловую систему для хранения переводов, вам следует загрузить текст сразу и затем отправить его из памяти. У большинства приложений обычно не так много текста, что становится проблемой. В Java или .Net это может быть достигнуто путем хранения текста в одноэлементном или статическом объекте. Тогда все строки находятся в оперативной памяти и не должны быть загружены или проанализированы. Если на вашей платформе нет удобного способа хранения данных в оперативной памяти, вы можете запустить отдельное приложение для кэширования, например memcached.
Остальные проблемы могут быть смягчены путем скрытия деталей. Создайте или найдите структуру, которая позволяет загружать переводы, а затем искать их по некоторому ключу. Если вы решите переключиться на файлы или базу данных позже, остальная часть вашего кода не пострадает. В краткосрочной перспективе сделайте то, что легче для вас. Я обнаружил, что лучше иметь смесь: легче управлять текстом приложения вместе с исходным кодом в системе контроля версий. Но некоторые тексты часто изменяются или должны меняться, не требуя цикла сборки + развертывания, и этот текст должен находиться в БД.
Наконец, не создавайте строки с подстановками в них. Используйте какую-то строку формата, потому что иначе ваши переводчики сойдут с ума, пытаясь перевести фрагменты предложения.
(Предупреждение: пример кода Java)
//WRONG
String msg = "Hello, " + username + ", welcome back.";
//RIGHT
String fmt = "Hello, %s, welcome back."; // in real code: load this string from a file or the db
String msg = fmt.format(username);
Другой человек упомянул кодировку языка в URL. Это предпочтительный способ сделать это, если вам важно, что поисковая система думает о вашем сайте. Google рекомендует использовать разные имена хостов или другой подкаталог. Это означает, что языковые заголовки, отправленные пользователем, не могут быть использованы ни для чего, кроме, возможно, первоначальной отправки их на одну или другую целевую страницу. Вам нужно будет определить язык для каждого запроса на основе входящего URL (на самом деле это значительно упростит ваш код позже). В Java я сохранял код языка в Запросе и просто брал его всякий раз, когда мне это нужно.
Самый простой способ обработки языковых кодов в URL - это переписать. Клиент отправляет запрос на www.yoursite.com/de/somepage
, и вы внутренне переписываете запрос на www.yoursite.com/somepage
и где-то сохраняете идентификатор языка. В Java каждый запрос имеет объект HttpServletRequest
, в котором вы можете хранить атрибуты для жизненного цикла запроса. Если ваш фреймворк не имеет ничего подобного, вы можете просто добавить параметр в URL: www.yoursite.com/de/somepage => www.yoursite.com/somepage?lang=de
. Если вы используете языки на основе имени хоста, вы можете использовать имена хостов, такие как de.yoursite.com или www.yoursite.de. Есть плюсы и минусы использования этого подхода. Во-первых, использование ДВУ с кодом страны означает регистрацию новых ДВУ и попытку выяснить, подходит ли код страны для представления языка (часто это не так). Использование различных имен хостов / доменов означает, что вы должны учитывать, в каких доменах хранятся файлы cookie. Если вам нужен поддомен без файлов cookie, вам необходимо тщательно спланировать это. Но со стороны кодирования имя хоста на основе языка не требует дополнительной переписывания; вы можете прочитать имя хоста (это заголовок хоста в HTTP-запросе) и проанализировать его, чтобы определить язык.