AS
1. В одной стране может быть (а скорее и очень быстро потребуется) более одного языка. Например, в России потребуется русский и английский.
2. Перевод одного и того же языка для разных стран будет разным. Например, переводы маркетинговых текстов на английский для России и Великобритании будут отличаться.
3. Если у Тебя хоть сколько-нибудь нормальный клиент-сайд интерфейс, то переводы потребуется и для него на стороне клиента.
4. Тебе потребуется хранить переводы двух типов - короткие фразы (используются для интерфейсов и поясняющих подписей) и длинные тексты (маркетинг, faq, юридическая документация типа оферты и др).
5. Тебе потребуется перевод картинок на языки (причём для разных стран, опять-таки разные). Причём есть картинки как интерфейсного плана, так и тупо скриншоты. Причём совершенно точно известно, что не все картинки поддадутся автоматизированном наложению генерящихся надписей. И, кстати, для некоторых языков потребуется отдельно доставлять шрифтовые пекеджи.
6. Когда Ты соберёшься передавать тексты в перевод, то для каждого короткого текста потребуется комментарий, который описывает контекст, в котором нужен перевод (одно и тоже слов, как Ты знаешь, может иметь несколько значений). Более того, в такой комментарий потребуется точный перечень мест в интерфейс (и как до него добраться), где оно используется.
7. Во всех переводах (коротких и длинных) надо не забыть проставить макросы для вставки как минимум доменных имён и валют, если они отличаются.
8. Таймзона в БД имеет значение. И вывод времени в нужной таймзоне тоже. В отдельных сложных случаях без костылей не обойтись. Например, по тайландскому летоисчислению, сейчас 2563 год.
9. Проект must be in UTF-8. Иначе вымрешь сразу же.
Вывод чисел с десятичной точкой в разных странах отличается. Будь готов.
10. Поиск по сайту. Каким бы ты не пользовался движком, важно знать, - все европейские языки, включая русский, процессятся специальным стеммером Snowball. Это такая штука, без которой орфография не будет работать вообще. НО для некоторых языков Snowball-а не хватит и движок заточенный под работу с ним станет бесполезной обузой. Чтобы решить проблему поройся по интернету и разберись, какие бывают стеммеры. Да, кстати, для некоторых языков символ пробела (" ") не является разделителем слов (сюрприз!).
11. Никогда не храни исходники текстов в html, - Ты его тупо не сможешь отдать на перевод, который тарифицируется по-символьно. Используй форматы типа wiki-markup или markdown.
12. Никогда не храни в .po файлах (это способ хранения коротких фраз для переводов с использование упомянутого тут всеми gettext) в лексемах что-либо кроме самого текста.
13. Для gettext-а НЕ ИСПОЛЬЗУЙ в качестве идентификаторов лексем русскую фразу, - ты не сможешь такой набор экспортировать на client-side.
UPDATE: Фил Д. просит добавить про RTL, про учёт разной плотности на разных языках, про разные сочетания календаря и отображения цифр на разных языках, про сложность выбора формата перевода (.po не очень удобен), про переводческие системы и так далее..
UPDATE2: Андрей Б. просит добавить про sjw
UPDATE3: Сергей В.: Время в базе всегда должно быть в UTC. А таймзоны — настройка рендеринга. Как темная и светлая тема, например.