Locale.module in Drupal 7 does at least these 4 main tasks (besides some smaller ones):
- Lets you set up languages and configure them.
- Lets you configure how Drupal selects form those languages for certain things (UI, content, etc).
- Offers a backend and an interface to translate the UI of code-supplied interface text. (It does provide a half-baked attempt at providing a generic translation storage backend too which is about to be removed in Drupal 8: http://drupal.org/node/1188430)
- Lets you import and export Gettext .po files with these translations
Now this is a lot of stuff, and I did not even mention some smaller pieces like supporting node languages and other small bits. One thing locale.module does not actually do is setting up locales. Yeah. If you read up locales at wikipedia (let's say), you'll see that locales in their complete sense are things like string ordering rules, currency formats and decimal separator configuration. Well, Drupal does not do that. In the "industry accepted understanding" of the terminology, Drupal does not support locales, it supports languages and localization (UI translation), but not locales.
Why I'm going into theoretic details is that as part of the Drupal 8 multilingual initiative, we need to take a long hard look at poor old locale.module (even though I did not mention this much yet in my posts, I did work on several issues related to it). Let's see the plans we have issues for so far.
- Removing textgroups support to avoid providing a broken half-baked feature for configuration translation making space for a real one (http://drupal.org/node/1188430)
- Provide a real CRUD API for languages so you can save/update/delete/load languages properly with APIs to react to changes or affect the language before saved (http://drupal.org/node/1215716)
- Same for UI translation source and target strings (http://drupal.org/node/361597), which will remove *huge* amounts of duplicate code that is now in l10n_client, l10n_update, i18n, etc.
- Refactor the gettext handling code to serve as a generic API so modules like potx, l10n_update, i18n or their core equivalent features can use it (http://drupal.org/node/1189184)
- Integrate l10n_update functionality in core (http://drupal.org/node/1191488)
Now this last point will actually add one more big subsystem to the set, and if we think about it, it really makes sense to rethink how we organize this and also be honest to world with our naming and move language configuration and language selection configuration to a language.module while the rest can be in a translation.module (name to be decided, thanks Sun for the tips).
So this would get us come to terms with our misuse of "locale" and name our language functionality properly after all. To gradually ease us into this in Drupal 8, I've started an issue about naming conventions for language related things at http://drupal.org/node/1216094 Here is the problem in short.
Locale module's language handling now supports setting up languages with langauge codes, which can then be used to load full language objects, as done with the global $language object by default. However, both the language code, the local loaded objects in functions and the global is called $language at places. The schema almost exclusively uses "language" to identify languages. If you look into the node table, url_alias, the field system tables, etc. All are called "language". However, these are just language codes. When you have such a "language" value, you still need to load in a "language" object, which then contains the language code in its ->language property (logically as used in other places in the schema). However, if you name your object $language, you might be in for some trouble if your code also uses global $language. You might be aware of the same problem for users.
So the main problem is that we call everything $language. The language codes in the database tables, sometimes language codes in variables (which are other times called $langcode), then typically local objects in functions and finally the global $language. Telling what $language is at any place is not really simple.
Compare this to users. You have $uid for the user identifier, $user for the global user and $account used for local users loaded. The equivalent for $uid, $user and $account for languages is $language, $language and $language. Yeah. In fact the $uid equivalent is in many places called $langcode, but this is far from universal. Also, langcode is pretty much against the Drupal coding standards, we don't do "ntype" for node types or "usrname" for usernames. But there is "langcode", which however is universally "language" in the schema.
This all might sound like nitpicky thinking and obsessing with small details, but that we did not get this right before resulted in APIs very incosistent and developers highly confused (including myself). If we'd have clear rules like developers have with $uid, $user and $account, that would be part of our ideal API for language handling. Because langauge support is now all around in Drupal from url aliases all through date formats and field API, it is important to get it right and consistent.
If you'd like to help wordsmithing definitions for languages, please follow up at http://drupal.org/node/1216094. For the more over-arching locale module plans and the eventual language.module, pick the relevant issue as applicable or in other cases comment here.
Thanks for all your feedback, it has been very valuable so far!

Comments
Why not a single module?
If I understand the OP proposal right, we would end up with a Language module which provides the language CRUD API and the negotiation API and UI and a Translation module providing translation capabilities for content (including the TF UI, I guess) and UI strings altogether.
In the past two years I often considered a similar scenario (Language module, Locale module and Translation module), my only objection to it (or the OP one, which perhaps I like more, I ain't sure) is: which use cases do we have for enabling just the Language module? Wouldn't it be confusing for the average user to enable it and then discover that she is able to add languages but she cannot do anything with them? The only feature that comes to my mind is being able to assign a language to nodes (entities?), which I think is a pretty rare (although sensible) use case. Unless perhaps Language would enable providing per-language site configurations (site name, blocks, menus) but also this I think is not a very common scenario.
My gut feeling is that most users enable languages mainly to get translation (UI and content), so perhaps we should instead have a unique i18n core module (put your favorite name here), whose internal architecture should be designed to provide the features listed in the OP as separate and self-contained subsystems. Since we already have to bake into the drupal low-level subsystems concepts like language, which now lives in bootstrap.inc, without impacting monolingual english sites performance, it should not be a huge problem to come up with a file layout allowing us to include only the features actually needed by a particular multilingual site configuration.
include translation? don't think so.
Well, sounds like you say we should have translation for all kinds of things as well as part of this monstrous module, right? I think there are at least two main use cases from a users point of view to consider. The monolingual foreign language site and the multilingual site. For monolingual sites, language configuration and UI translation should be all required because all the rest is user provided and can therefore be in any single language. For multilingual sites, the translation functionality for anything user provided (anything beyond the UI) comes into play. So in terms of use case I think it makes sense to keep this separation at least.
But that is the current separation in Drupal 7. Why would it make sense to separate language setup and UI translation as well? Honestly I agree that it could make for user confusion, and that the language module in itself will have little use. It would make lots of sense from a code organization POV. If we keep all of the current locale module together and try to make it sane, we'll have several API sections for languages, ui translation, .po file read/write, .po file download from remote services. Then we'll have UIs for all of these as well. Obviously most of the APIs are not needed on every page load, so we can either couple them with the UI include files (think locale.languages.inc, locale.negotiation.inc, locale.translation.inc, locale.gettext.inc, locale.update.inc, etc if it keeps being called locale), or start with UI and API includes. There are now about 4000 LOC inbetween locale.inc and locale.admin.inc only, and with the refactoring and addition of remote update functionality, it will be a lot more. I think it is increasingly growing to a size where sites will not need major chunks of it. Serious production sites might not use the gettext and update portions in any way (and probably UI translation will also be blocked to be edited). Basically they might push updates from staging and then not edit/import/export stuff on live in a dev-staging-live scenario. (I do realize that when disabling such a module the UI translation feature might not in fact work). I agree a site starting out will not make sense to use only language functionality without UI translation, just thinking about making the logical distinction instead of keeping piling on to an already crowded module :)
Monster modules
Correct me if I'm wrong but it seems to me that in your proposal the Translation module would be just a little less monstrous than in mine :)
well
Well, I've suggested to separate the two components of monolingual foreign language sites needed for setup: language list and selection configuration and interface translation. No translation functionality is required beyond UI translation on a monolingual site, because you don't translate stuff. So I'm not seeing how this would end up in big modules, we'd have more smaller ones.
Jose has this use case that the "system" should have better monolingual support with an option to use a foreign language, and the ability to turn off the UI translation module when you consider your UI translation done. That would be moving things like a simple language setup and utilities like JS translation regeneration more to the system (or move multilingual parts of the locale module farther into another module).
I think we are talking about several interesting concepts here, and all seem to have some merit (In light of these other interesting ideas I'm not sure anymore my original separation idea is that good for example :).
Erase & rewind
Ok, it seems I misunderstood your proposal, then forget my post above, it was written on a flawed ipothesis.
In a broader scope however, the discussion above seems to outline that we lack a reliable way to split and/or modularize our code without resorting to modules (pun not intended :), which IMHO should be user-oriented groups of features, not developer-oriented portions of code. These two often overlap, but here we have an example where they don't and IMHO users should take precedence in this case.
I think language should be a
I think language should be a 'core' concept somehow independent of localization or translation. In the same way you select a Country and a Timezone for your site you should be able to select also a language. Then you would have a single language site that may have the UI in English but that may only be seen by the site administrator.
(Whether locale is enabled automatically after you select a language for your site is a question of the install profile. Entry level install profiles should do that.)
One more step would be having a 'multilingual' site. Then you need a list of languages (current locale language configuration) a default one, etc. With our current set-up, by enabling locale, just because you want a single (non English) language site, the user runs into language lists, default language, etc, which are things we could save. Actually you have a bilingual site when all you want is a single language site but not an English site.
So language and language list should be built into system module. And then we could have two more:
- Translation or localization, more like current locale, just translates the UI.
- Multilanguage, which would be the one enabling a 'language list', like for having a UI in either English or another language, language selection for users, language negotiation (maybe current node translation features, just maybe), etc...
In any case we should hide 'language lists' from users unless they really want to have a site in two languages. Right now we push the user into a bilingual site, that can then be trimmed down to a monolingual one by disabling English. This is not the best way IMO.
Does this make sense?
agreed on some :)
I don't agree that a single language non-English site will have English UI as a good default. The user registration screen, errors, messages, etc. will all be English even if you enter all your config (menus, taxonomy, etc) in a single language. You can avoid some stuff if your site is only a brochure site, but not using UI localization still sounds like a bad suggestion there.
I do agree that making the single language experience simpler should be ideal, that we can already do by adapting the installer to add a foreign language and drop English if you do a foreign language install. Also, if/once we integrate l10n_update, the best default would be to try to put the UI translation editing and import/export screens out of the default flow, and focus on pulling translations from the community (which is what most people want instead of doing it on their own).
Right, but that's what I mean
Right, but that's what I mean when I said the install profile can take care of that. Just let me disable locale module later if I don't need it but still keep my site in a different language. (I haven't checked it lately but locale used to be a resource-hungry module).
Having a language defined for the site is important as it is added to HTML headers to inform search engines which language my site is in. Assuming English unless you take additional steps is a legacy idea from the old times of the web.
The idea though is that locale kind of forces your site to be multilingual and adds configuration complexity by that. Both concepts, 'localized' and 'multilingual' should be as separate as possible and thus live in different modules.
Forget System, please.
System module will die in D8. Its existence is the #1 cause for all kind of low-level nightmares currently. So everyone, please pretend that System module does not exist.
Daniel F. Kudwien
netzstrategen
let's start with the less controversial
Let's start with the less controversial and at least split the module by functionality to include files. There is really a huge mess to deal with here. Really no naming standards here, very rarely used yet enourmous functionality included on each page load, etc. There is just too much to do here, that I'm trying to go the least resistence route and go in smaller steps.
I've opened http://drupal.org/node/1219196 for moving the negotiation settings to their own include file and http://drupal.org/node/1219236 for moving the gettext API and the import-export screens to their own include files respectively. I think we do agree we need some kind of organization here, and this is really still only the first steps. Let's get these through! (I've started a 'locale-split' tag for these issues if you want to follow them or tag others specifically - http://drupal.org/project/issues/search/drupal?issue_tags=locale-split).
mo-files and php_gettext
Is there a plans to use native php-extension as one of pluggable import backends?
discussion
There is/was an issue at [#1187084], you can read up on the background there.
move to the issue queue
While the original discussion above was not focused on splitting locale module, a lots of the discussions evolved around that. To keep that within the core developer area, I'm trying to move this discussion to the issue queue. More and more issues look ugly or look like possibly being blocked for this indecision. And I'm not sure we can reach a decision without more broader feedback. Please participate with your current thinking on the topic at http://drupal.org/node/1293304