The CiviLingua project was an attempt to build i18n/l10n into CiviCRM core in the late 1.6 / early 1.7 release era. Details are available on the CiviCRM wiki:
It was ultimately unsuccessful, defeated by the large number of CiviCRM queries that pass pre-composed SQL to the query() DAO function. There was no practical way to add i18n table contraints to arbitrary, complex queries. Some discussion of those difficulties can be found in the CiviCRM forums:
Many things work: inserts, deletes, updates, and selects that use the query-building built into the DAO object can be constrained on the new i18n table. And the CiviLingua module successfully translates the CiviCRM UI according to Drupal's language settings. Unfortunately, this was not enough to do what we wanted.
This blog post is occassioned by my realization that none of the code ever saw the light of day. I am posting it here more or less on principle, as an incomplete project for an old release is not likely to be useful to anyone. So, for posterity, I attach a file containing my CiviLingua component code; Joe Murray's xml schema changes; my revised version of the CiviCRM Core/DAO.php file, which is where the heavy lifting takes place; and the revised Utils/SystemDrupal.php, which has been hacked to respect the i18n module.
Oh, and another caveat: nothing in the attached file has been tested in the months since we stopped work on the project, and may contain grievous parse errors, etc.
I did learn quite a lot about the architecture of CiviCRM and its components over the course of this effort, and must compliment the CiviCRM developers for their amazing availability and willingness to help newcomers with its intricacies.