
On Tue, Feb 22, 2011 at 5:27 AM, Helgi Kristvin Sigurbjarnarson
On Mon, Feb 21, 2011 at 09:20:29AM +0200, Michael Snoyman wrote:
Let's look at a more concrete example: you have an online store selling male dogs and female cats. So you would have:
data Basket = Basket { maleDogs :: Int, femaleCats :: Int }
What you need is a function such as:
renderBasket :: Basket -> String
for each language. In English, this could be something like:
pluralize :: Int -> (String, String) -> String pluralize 1 (x, _) = x pluralize _ (_, x) = x
renderBasket (Basket dogs cats) = concat [ "You have decided to purchase " , show dogs , pluralize dogs ("dog", "dogs") , " and " , show cats , pluralize cats ("cat", "cats") ]
How would you handle declensions and conjugations? Create a new datatype for every context? For (a silly) example the online store list nicely what's in your basket in a sidebar like so:
In your cart: * 3 dogs
and later, after you purchased they can say "You just bought 3 dogs", now, in english the "3 dogs" translation can be shared, but in some languages (e.g. Icelandic) they can not ("3 hundar" and "þú varst að kaupa 3 hunda"). The former is nominative and the latter is dative. But then again, creating a datatype and translating the same words again and again is really repetative.
Unfortunately, such is the nature of the beast. People sent some good links after my i18n blog post, and the recurring theme is you can *never* translate a fragment of a phrase, only an entire phrase. So yes, there will be some repetition, but at least we'll be correct. Personally, I don't have a huge amount of experience with i18n, but in the one project that I *do* deal with it regularly (the DITA-OT[1]), this is the approach taken as well. Michael [1] http://sourceforge.net/projects/dita-ot/