Internationalization comes down to a few basic points, and the most important one is this: don't think you know where the user is. This applies to address formats, measurement units, decimal separators and even icon design.
1. Don't Make Location-related Assumptions
Never force the US address format onto users. Many countries have no states. It will bug the heck out of your users if they must enter some imaginary state identifier into a form just to use the software. If you can't support international address formats in your application, then substitute the traditional address form with a single text area. Your users are probably smart enough to know their own address and how to format it.
The same applies to decimal separators, measurement systems, currency symbols and so forth. Have these values as user-defineable preferences. Or better yet, check the user's operating system localization code and autopick settings based on that information. Even in that case the values should be user-settable, in case a Finnish person is temporarily staying in Britain, for instance.
2. Consider Cultural Differences
When preparing to internationalize your product, think about what elements in your interface could be misunderstood in different cultural contexts. Cultural differences can range from different colors having different meanings to expressions or gestures being interpreted in completely opposite ways. For example, in the western world, nodding means acceptance, but in certain Asian countries nodding is a way of expressing denial.
When making localized versions of their software products, developers often make the mistake of making only text strings localizable. Instead of localizing text only, make images, animations, etc. localizable, too. For example, a Swedish localization of a mail reader shouldn't use the image of a US-style mailbox for its mailbox icon. Also note that some symbols or other visual items can be considered offensive in the context of another culture. The cross often used by disk first utilities is a good example. To the developer the cross might represent healing and restoration, but to a user it might seem like a pro-Christian statement.
3. Use Proper Language Names
When possible, refer to languages by their actual names instead of the English translations of those names when giving the user a choice of interface language, or in any other contexts where you might need to know the user's or customer's native language. It makes much more sense to the user to pick his/her language from a list in which the language itself appears in the user's language. It not only makes finding and selecting the language name much easier but also much quicker, especially if the language doesn't use the Latin alphabet but instead some other system (e.g. Japanese or Chinese). You may want to display the English name of the language as a secondary label of some sort - for example, Apple has used tooltips in Mac OS X's languages selector to display the English names, though a display method not relying on mouse-over might be preferable.