PodSearch

Under the Radar

41: Internationalization

 

00:00:00 ◼   ► Welcome to Under the Radar, a show about independent iOS app development.

00:00:03 ◼   ► I'm Marco Arment.

00:00:04 ◼   ► And I'm David Smith.

00:00:05 ◼   ► Under the Radar is never longer than 30 minutes, so let's get started.

00:00:10 ◼   ► So today we wanted to dive into the topic of localization, or some people call it internationalization,

00:00:17 ◼   ► and some people think those are different.

00:00:18 ◼   ► I don't really know, I just call it all localization, and that works for me.

00:00:22 ◼   ► But more generally, we're talking about the concept of taking your application and making

00:00:25 ◼   ► it, having its appearance and its strings and the things in it be adaptive based on

00:00:32 ◼   ► where in the world your user is and what language they're speaking, and being adaptive in those

00:00:37 ◼   ► kinds of ways.

00:00:39 ◼   ► And generally this is kind of one of those things that I feel like it's a lot of times

00:00:46 ◼   ► viewed as kind of like a hygiene thing, like in the sense of it's this thing that maybe

00:00:51 ◼   ► you think you should do, but often you don't.

00:00:56 ◼   ► For a long time, I had none of my applications localized at all, and it was always this thing

00:01:00 ◼   ► that I'd go to the session at WWDC and kind of feel bad about myself and say, "Oh, this

00:01:04 ◼   ► year I'll do it," and then I'd go back and I wouldn't actually do it.

00:01:08 ◼   ► And I think it's a tricky one because unless you live in a multilingual or international

00:01:14 ◼   ► life, you know, where if you speak two languages at home or you live abroad from where your

00:01:20 ◼   ► native language is or something like that, it's not something that you would necessarily

00:01:25 ◼   ► come across in your day-to-day life.

00:01:28 ◼   ► And it's always hard, I think, to write features for an application that you yourself won't

00:01:34 ◼   ► benefit from in using it.

00:01:36 ◼   ► So when I make my app display all of its strings in German, that's great, but I don't speak

00:01:45 ◼   ► German, so I have no idea if, A, if they're right, which we'll get into a bit later, and

00:01:51 ◼   ► B, I don't feel that benefit.

00:01:54 ◼   ► And so I've struggled for a long time to do it.

00:01:56 ◼   ► And I'll certainly say it's a bit of a pain to do because if you want to do this, you

00:02:02 ◼   ► have to structure a lot of the visual components of your application very differently.

00:02:07 ◼   ► You have to make things very flexible, you can't hard-code a lot of values, everything

00:02:11 ◼   ► has to be able to be switched in and out and adaptable depending on what language and locale

00:02:18 ◼   ► your app is being used.

00:02:19 ◼   ► But one day, I bit the bullet, and the first app I ever localized was Pedometer++, and

00:02:27 ◼   ► I localized it and had a pretty impactful change as a result.

00:02:31 ◼   ► I found that my downloads outside of English-speaking countries, so outside of the United States,

00:02:37 ◼   ► Great Britain, Australia, New Zealand, Canada, Canada with an asterisk, because obviously

00:02:42 ◼   ► they speak French there too, but outside of those countries, I found that my downloads

00:02:48 ◼   ► went up by about three times.

00:02:51 ◼   ► And overall, that meant that my overall sales didn't go up by three times, because most

00:02:55 ◼   ► of my sales were still coming from English-speaking countries, but overall my sales did go up.

00:03:00 ◼   ► I think it went up by about 50%, which was encouraging.

00:03:08 ◼   ► And the effort it took to get there has certainly--it's debatable overall whether it was the right

00:03:15 ◼   ► tradeoff, but I think in general it taught me the lesson that there is an impact to this,

00:03:18 ◼   ► and it is something that we at least all need to consider.

00:03:22 ◼   ► Because I've also had the flip side, where I've localized some of my other applications,

00:03:26 ◼   ► and I've had essentially no increase.

00:03:28 ◼   ► And so it's not like a silver bullet, it's not like if you localized your app, your sales

00:03:31 ◼   ► would go up three times.

00:03:33 ◼   ► That's definitely not the case.

00:03:35 ◼   ► The experience I had in Podometer++ was by far the best I've had, but it's somewhat distinct

00:03:42 ◼   ► from some of my other experiences.

00:03:45 ◼   ► Have you ever localized any of your applications?

00:03:48 ◼   ► >>

00:03:58 ◼   ► I've had a lot of great jobs, and so I kind of know what's involved.

00:04:01 ◼   ► And I know--I too have gone every year to the WWDC sessions about localization, and I

00:04:07 ◼   ► too have sat there feeling bad about myself, thinking, "Why don't I just do this already?

00:04:11 ◼   ► Let's just do it."

00:04:13 ◼   ► But as you mentioned, it is not easy to do.

00:04:16 ◼   ► And one of the biggest questions in my mind, which I hear people ask me all the time, is

00:04:22 ◼   ► will this actually increase sales, and by how much?

00:04:24 ◼   ► And as you said, a big increase for you in non-English speaking countries, that's great.

00:04:30 ◼   ► However, it's hard to know.

00:04:32 ◼   ► As you said, it's hard to know whether that will apply to my app or not.

00:04:36 ◼   ► And it's hard to know how big the increase will be and then whether it will be worth

00:04:38 ◼   ► the cost.

00:04:39 ◼   ► But to me, I kind of see internationalization and localization--I also don't know the difference.

00:04:45 ◼   ► I know there is one, and people get mad at us for not knowing it, but I don't know what

00:04:48 ◼   ► it is.

00:04:50 ◼   ► I see them too as kind of a code hygiene thing, and it's kind of similar to accessibility

00:04:55 ◼   ► in some ways, where if you make an interface accessible via the iOS accessibility mechanisms

00:05:02 ◼   ► for things like voiceover and other assistive technologies, sometimes it takes a little

00:05:08 ◼   ► bit more work in the coding and design stage, but it usually isn't that much more work to

00:05:13 ◼   ► make it possible and to do it well.

00:05:18 ◼   ► Usually it's actually very little work because Apple's stuff is so good.

00:05:20 ◼   ► You just kind of have to be aware of it as you're coding.

00:05:23 ◼   ► And there are certain aspects of internationalization that are that easy.

00:05:29 ◼   ► Things like date formatting and stuff like that, like number formatting, currency formatting.

00:05:34 ◼   ► In those kind of areas, Apple provides really easy APIs, date formatters, that kind of stuff,

00:05:40 ◼   ► that if you just use them correctly at all, then you will just get nicely formatted things.

00:05:47 ◼   ► Your strings won't be automatically translated to different languages, but things like displaying

00:05:52 ◼   ► numbers and things like that, that's very easy to get right and to have kind of done

00:05:58 ◼   ► for you automatically.

00:06:01 ◼   ► In Overcast, I make extensive use of that kind of thing, and for the strings, I do wrap

00:06:07 ◼   ► all of my UI strings in NSLocalizedString, which is this macro that you should look up

00:06:13 ◼   ► NSLocalizedString if you don't know what it is.

00:06:14 ◼   ► You should be using it.

00:06:16 ◼   ► I do that for preparation for potential future internationalization efforts so that it's

00:06:23 ◼   ► easy to see all my UI strings and easy to pull them out and have them translated in

00:06:29 ◼   ► an automated kind of way if I ever need that.

00:06:33 ◼   ► But I don't actually do that.

00:06:34 ◼   ► I haven't actually translated it.

00:06:36 ◼   ► So I have a few instances where I'm kind of abusing the formatters.

00:06:41 ◼   ► In my list of episodes, I omit the year from the date from an episode's release date if

00:06:49 ◼   ► it's the current year because I think that's just a nice little thing to get a little bit

00:06:53 ◼   ► less clutter.

00:06:54 ◼   ► If your episode was released on August 1st and that was two weeks ago, I don't need

00:06:59 ◼   ► to know that it was 2016 because I already know it's 2016, thank you.

00:07:04 ◼   ► And this works.

00:07:05 ◼   ► There's no built-in function that I know of to do this very well.

00:07:10 ◼   ► So I do kind of a hack which is I get the localized version of the current year and

00:07:15 ◼   ► just remove that substring from the date string.

00:07:18 ◼   ► And this turns out to be a really dumb implementation because in certain countries, there's a -- I

00:07:23 ◼   ► forget exactly where it was.

00:07:24 ◼   ► I think it was -- it might have been in a Portuguese-speaking country or a Spanish-speaking

00:07:28 ◼   ► country but there was something where I got an email from users saying this is kind of

00:07:32 ◼   ► weird looking because there's like -- there's a word between the day or the month and the

00:07:38 ◼   ► year in the way it's formatted where it's like of or the.

00:07:42 ◼   ► So it's like, you know, July of 2016, you know, whatever the translated version of that

00:07:47 ◼   ► is.

00:07:48 ◼   ► And so in my version of this, it just says, you know, 16th July of.

00:07:52 ◼   ► >> That's not great.

00:07:53 ◼   ► >> No, it's not great.

00:07:54 ◼   ► So I have to probably revisit this strategy.

00:07:58 ◼   ► But for the most part, everything else has been done only in the ways of like using the

00:08:04 ◼   ► built-in formatters for numbers and dates and currencies and things but not actually

00:08:08 ◼   ► translating the strings but making it easy to do so in the future if I want to.

00:08:11 ◼   ► >> Yeah.

00:08:12 ◼   ► And I think the approach you're taking is certainly the one that is at the very least

00:08:17 ◼   ► the right approach.

00:08:18 ◼   ► That making -- as you're going -- as you're building an app, being aware that this might

00:08:23 ◼   ► be something you want to do later, I think will certainly increase the likelihood that

00:08:26 ◼   ► one day you will actually get to it rather than hitting the point where it's like, okay,

00:08:31 ◼   ► I need to now like search in my app for every string that is being displayed and then add

00:08:39 ◼   ► the NS localized string macro to it.

00:08:42 ◼   ► Or I need to now go and switch everything over to using formatters.

00:08:47 ◼   ► And I'm an iOS 10.

00:08:50 ◼   ► I think there's the new units formatters, which are even -- take this even farther that

00:08:53 ◼   ► you can now -- it's not even just dates and currency that you can do in numbers.

00:08:59 ◼   ► You could -- you can even do clever things about speeds or distances.

00:09:03 ◼   ► So like I run into this with a couple of my workout apps where, you know, it's how far

00:09:07 ◼   ► did you run.

00:09:08 ◼   ► And right now I do some things like where I need to be clever about which unit to use

00:09:14 ◼   ► and have options in the application for switching that.

00:09:17 ◼   ► You know, on first launch I'll see what country you're in.

00:09:22 ◼   ► And I assume that if you're not in the United States you're probably going to use metric

00:09:26 ◼   ► units, which in general I think is pretty much the case.

00:09:30 ◼   ► And so I do those switches manually.

00:09:32 ◼   ► And then, you know, iOS 10 I can do this automatically.

00:09:34 ◼   ► But by and large it seems like in general a good idea to keep this as something that

00:09:39 ◼   ► -- it's part of building an app properly.

00:09:42 ◼   ► And just like you were saying with accessibility.

00:09:44 ◼   ► Like if you build an app to do this, you're probably ultimately also going to be a better

00:09:48 ◼   ► app because you're being thoughtful about what you're displaying to your user at a different

00:09:54 ◼   ► level.

00:09:55 ◼   ► And sometimes I run into situations where I'm just being lazy.

00:09:59 ◼   ► And so I'll add some words of explanation for something.

00:10:04 ◼   ► And in that case it's probably symptomatic of my app actually being too confusing and

00:10:11 ◼   ► not obvious enough about how to operate it if I have to sort of build instructions into

00:10:15 ◼   ► it.

00:10:16 ◼   ► And if you're in a localization mindset, there's a cost to adding that string because now that

00:10:21 ◼   ► gets added to your list of things that you need to translate and have localized.

00:10:26 ◼   ► And so it's -- in some ways it helps you think about your application in a constructive way

00:10:31 ◼   ► to make sure that if you couldn't read anything in this application, could you still use it?

00:10:37 ◼   ► And if you can, that's probably a good indication that even if you can read the strings and

00:10:43 ◼   ► the labels and things in your application, you know, it's still going to be a good experience.

00:10:48 ◼   ► But by and large it's a funny thing because I think doing localizing just to have more

00:10:53 ◼   ► downloads is I think a good reason.

00:10:55 ◼   ► And I think in general for most people there is going to be -- it's very unlikely that

00:10:59 ◼   ► you're going to have a negative correlation there.

00:11:02 ◼   ► It would only be if you had a terrible translation and the app was actually worse after localizing

00:11:08 ◼   ► it.

00:11:09 ◼   ► But generally speaking I think, you know, having something that's more relevant to a

00:11:12 ◼   ► customer by nature should increase that somewhat.

00:11:16 ◼   ► But the other reason that I think is good to keep in mind when you're thinking about

00:11:20 ◼   ► whether you should or shouldn't localize your application is in general I think Apple tends

00:11:25 ◼   ► to only feature applications that are localized in the country's app store that they're doing

00:11:32 ◼   ► the feature in.

00:11:34 ◼   ► And so if you want to be featured in the Japanese app store, in the German app store, in the

00:11:38 ◼   ► French app store, in the Spanish app store, you probably need to be localized into that

00:11:44 ◼   ► country and probably at the very least have your screenshots and app store description

00:11:49 ◼   ► localized and probably even your app as well.

00:11:53 ◼   ► And that certainly is, again, it's just one of these opportunities that, you know, in

00:11:57 ◼   ► -- as cutthroat of a market as the app store is, those little edges, those little things

00:12:03 ◼   ► that in general localization isn't a mountain of work.

00:12:08 ◼   ► It's something that you have to work on and it will lose you a day out of a point release

00:12:14 ◼   ► kind of work.

00:12:16 ◼   ► You will make -- it's hard to put your finger on exactly the impact that it's having, but

00:12:21 ◼   ► I think it'll have an impact.

00:12:22 ◼   ► And the reality is it's like it's a little advantage that you may as well take, that

00:12:28 ◼   ► you may -- you know, it's something you can do directly and it's not like you have to

00:12:32 ◼   ► think of this grand new innovative vision for something where you've come up with something

00:12:38 ◼   ► totally new.

00:12:39 ◼   ► Like you're just doing the basics better and maybe if your competitors aren't localized

00:12:44 ◼   ► then you'll have that little edge on them.

00:12:46 ◼   ► And especially I think a lot of app store algorithms, as best I can tell, have this

00:12:51 ◼   ► kind of -- this built-in sense of as you get a little bit better there's a stronger benefit

00:12:58 ◼   ► to the person in front, which is problematic in some ways, but in this case can be beneficial

00:13:03 ◼   ► that if you can do lots of little things to be slightly better than your competitor, you're

00:13:07 ◼   ► showing up higher in charts, you're more likely to be featured, you may show up higher in

00:13:11 ◼   ► search.

00:13:12 ◼   ► There's all these little things that can add up and this is just one of them.

00:13:14 ◼   ► And so in general I'd say you should localize your app.

00:13:17 ◼   ► And I mean I was actually looking at Overcast before your recording and it's a funny app

00:13:23 ◼   ► because I think most of the app you could localize very easily because most of it is

00:13:28 ◼   ► not -- it's content that's relevant to the user already.

00:13:31 ◼   ► It's like it's self-localizing.

00:13:33 ◼   ► If I'm in France listening to French podcasts you don't have to like translate the time

00:13:37 ◼   ► title of the podcasts.

00:13:40 ◼   ► All that is already there.

00:13:41 ◼   ► It's just the surrounding infrastructure around it and even the names of the -- the name of

00:13:45 ◼   ► the playlist, they're going to name the playlist whatever they want to name it.

00:13:49 ◼   ► It's not like you have to do something clever there.

00:13:51 ◼   ► It's just some other labels.

00:13:52 ◼   ► And so it's probably something worth doing.

00:13:55 ◼   ► >> KEVIN: Yeah, I mean, and also beyond like selfish reasons of this will get more downloads,

00:14:01 ◼   ► which are very important, beyond that though a lot of people -- if you don't localize,

00:14:07 ◼   ► and I know this from the experience of having apps that I haven't localized, if you don't

00:14:11 ◼   ► localize a lot of people who don't speak your language will still use the app anyway.

00:14:16 ◼   ► They'll just fumble through.

00:14:17 ◼   ► Like they'll just -- you know, because like a lot of times like there might not be any

00:14:20 ◼   ► other apps to do the thing or they might have heard about yours and yours might be the best

00:14:24 ◼   ► one or they just might want to try yours or whatever the reason.

00:14:27 ◼   ► A lot of people who don't speak the language of your app will try to use it regardless.

00:14:32 ◼   ► And so it's really a design question of like do you want the experience of using your app

00:14:38 ◼   ► to be better for people who don't speak the language that it's in?

00:14:40 ◼   ► Do you want them to be able to use it?

00:14:44 ◼   ► Do you want to be able to provide value to people who don't speak your language?

00:14:46 ◼   ► And to some degree, as you said, if you look at Overcast, I've taken a lot of this to heart

00:14:51 ◼   ► where I try to basically avoid a lot of text where possible.

00:14:56 ◼   ► But just avoiding the need for text and translation will get you a lot of the way there and will

00:15:02 ◼   ► let people try to kind of figure out and fumble through more easily.

00:15:07 ◼   ► Like I mean I see even like with games, like my four-year-old son can't read yet but he

00:15:12 ◼   ► knows how to play a lot of games on his iPad because they don't rely so much on text.

00:15:16 ◼   ► They just have buttons and icons and things and he's able to figure those out.

00:15:22 ◼   ► The more your app cannot rely on text, the better.

00:15:24 ◼   ► But for the text that it does rely on, you're doing a great service to the design and experience

00:15:31 ◼   ► of a lot of real-world users by localizing because people who don't speak your language

00:15:36 ◼   ► are going to try to use it anyway.

00:15:38 ◼   ► But anyway, in the case of Overcast though, I am also a little bit scared of a number

00:15:43 ◼   ► of issues that we'll probably get to in the second half of the show.

00:15:44 ◼   ► But like I mean little things like what you mentioned, the UI design, like there are so

00:15:49 ◼   ► many features and labels in the interface where like I've chosen the words extremely

00:15:55 ◼   ► carefully and like I will choose the name of a feature based on what will fit in the

00:16:02 ◼   ► table view cell in the settings screen.

00:16:04 ◼   ► Like I will often like make decisions about like exactly what words this has to be based

00:16:10 ◼   ► on like what will fit.

00:16:11 ◼   ► And I know that if I localize everything, it will add a lot of overhead to a lot of

00:16:18 ◼   ► the testing and the validation of the UI and everything on different sized devices especially

00:16:23 ◼   ► and some of that we can automate, some of it we can't.

00:16:26 ◼   ► But also it will be very easy for my app to be misunderstood.

00:16:32 ◼   ► But I guess this is kind of the perfect being the enemy of the good.

00:16:34 ◼   ► Like right now my app is being understood even worse by people who don't speak my language.

00:16:39 ◼   ► So I guess maybe that's just a cost I'd have to bear.

00:16:43 ◼   ► Yeah well before we continue on that front, we are brought to you this week by Cococonf.

00:16:49 ◼   ► Now this upcoming March 20th through 23rd, Cococonf is returning to Yosemite National

00:16:54 ◼   ► Park for its third Yosemite event and let me tell you people, I have heard so many great

00:16:59 ◼   ► things about this.

00:17:00 ◼   ► I'm going to try to go this year I think because I've heard so many great things about it and

00:17:02 ◼   ► I keep having scheduling problems and I can't go but I wish I can go to this event.

00:17:06 ◼   ► I think I'm going to try to make it work this year, we'll see.

00:17:08 ◼   ► Anyway this event, March 20th through 23rd, held again at the Yosemite Lodge at the Falls

00:17:14 ◼   ► in Yosemite National Park.

00:17:15 ◼   ► Speakers include Ashley Nelson Hornstein, friend of the show David Smith, Andy Anako, Matt

00:17:20 ◼   ► Drance, Jamie Newberry, Brent Simmons and Daniel Steinberg.

00:17:23 ◼   ► Sessions run in the mornings and evenings and afternoons are spent exploring Yosemite

00:17:27 ◼   ► National Park with activities including ranger led hikes, a bus tour of the valley, a photo

00:17:33 ◼   ► walk by TED photographer James Duncan Davidson.

00:17:35 ◼   ► These are all great options for you to choose if you want to.

00:17:37 ◼   ► There's also music by James Dempsey and the Breakpoints and by Jonathan "Songaday" Mann

00:17:43 ◼   ► and you can use code "under theradar" to save 20% on your tickets to Yosemite.

00:17:47 ◼   ► So head on over to cococonf.com/yosemite to register.

00:17:51 ◼   ► David you'll be there obviously because you're speaking, I really hope to be there, looks

00:17:54 ◼   ► to be a great conference and thanks a lot to CocoConf for sponsoring our show once again.

00:17:59 ◼   ► So to pick back up what you were talking about, I think there is a fundamental thing and I

00:18:04 ◼   ► think for the rest of the show we'll kind of dive into a bit of the mechanics of what

00:18:08 ◼   ► localization is, that once you finally decide it's something that you're going to do.

00:18:13 ◼   ► I think you kind of have to let go a little bit on perfection in order to approach this

00:18:21 ◼   ► because just fundamentally the width of words in languages is just mind-bendingly different

00:18:31 ◼   ► between languages.

00:18:32 ◼   ► The classic example is something like German which tends to have these very long words

00:18:37 ◼   ► for relatively simple concepts.

00:18:40 ◼   ► You go all the way to some of the more Asian languages where you'll have a single one-character

00:18:45 ◼   ► symbol as the equivalent of what's being said there.

00:18:48 ◼   ► And so you'll never have, I know the feeling of what you're talking about where you want

00:18:52 ◼   ► to have just that perfect word that makes everything line up nicely or it gives you

00:18:59 ◼   ► a good balance to the screen.

00:19:03 ◼   ► And when you're localizing, you just at a certain point have to say, "It's going to

00:19:07 ◼   ► be impossible."

00:19:08 ◼   ► And I'd rather it be understandable than visually perfect.

00:19:16 ◼   ► And maybe there's a way that if you were really a linguistic genius that you could find different

00:19:20 ◼   ► words that are more appropriate or might convey the same meaning but have a more similar length,

00:19:27 ◼   ► maybe that's possible.

00:19:28 ◼   ► But I think I've just had to accept that going down this road is probably better because

00:19:34 ◼   ► not doing it, it's like having something that looks visually slightly less balanced perhaps

00:19:40 ◼   ► is going to be better than something that looks balanced but is unintelligible.

00:19:46 ◼   ► So when you're localizing something, I think there's probably, I think briefly I'll just

00:19:51 ◼   ► say there's two things that you're sort of typically doing.

00:19:53 ◼   ► You're localizing the language, so I'm an English speaker, that's the only language that

00:19:59 ◼   ► I really can speak with any fluency, and so I write my applications in English as a result.

00:20:07 ◼   ► And I can take all the English words and translate them into another language.

00:20:13 ◼   ► And then there's the more cultural differences, and this can both be things like we were saying

00:20:18 ◼   ► with units, so metric versus imperial units or date formats, or even getting into differences

00:20:25 ◼   ► within a language.

00:20:26 ◼   ► So for example, we spell the word "color" differently in the United States than they

00:20:30 ◼   ► do in Great Britain.

00:20:32 ◼   ► And so you can get into those kind of cultural differences.

00:20:34 ◼   ► But we're right.

00:20:35 ◼   ► Of course we are.

00:20:36 ◼   ► You don't need that U. That U is completely unnecessary.

00:20:40 ◼   ► And that's the way it is.

00:20:41 ◼   ► UIColor doesn't have a U in it, so for the way I'm working on iOS.

00:20:44 ◼   ► UIColor.

00:20:45 ◼   ► UIColor.

00:20:46 ◼   ► UIColor.

00:20:47 ◼   ► So you can do those two different things that you can be localizing.

00:20:51 ◼   ► And in general, the more cultural ones are a lot of the things that you're probably going

00:20:56 ◼   ► to want to lean on Apple for, for their date formatters and unit formatters and number

00:21:02 ◼   ► formatters.

00:21:03 ◼   ► And the language ones is probably what I'll talk mostly about now, because that's what

00:21:06 ◼   ► most people think of localization.

00:21:07 ◼   ► I think that's what we think of.

00:21:08 ◼   ► And that's taking all of the strings that are displayed in your application and wrapping

00:21:13 ◼   ► them up in NSLocalizedString macros.

00:21:17 ◼   ► And I don't actually know how you do this in Swift, but I'm sure there's something similar

00:21:22 ◼   ► to it.

00:21:23 ◼   ► But it's probably not called NSLocalizedString.

00:21:26 ◼   ► But there's something I'm sure that can translate back and forth.

00:21:29 ◼   ► And you run a little script that pulls all those out of your application.

00:21:33 ◼   ► And you end up with this little configuration file that's basically just a string and then

00:21:38 ◼   ► a translation.

00:21:40 ◼   ► And you can take that file and send it to a translation service.

00:21:44 ◼   ► There's many of these.

00:21:45 ◼   ► I've used a bunch of them.

00:21:46 ◼   ► In general, I'm sure there maybe are some differences, but by and large, I've used a

00:21:51 ◼   ► couple and they've all been about the same.

00:21:53 ◼   ► At this point in iOS development, I think the tools are mature enough that any of these

00:22:00 ◼   ► -- and I think Apple even has a website where they recommend a bunch of them -- you just

00:22:04 ◼   ► take your strings file, you send it to them, and they'll have a translator translate it

00:22:08 ◼   ► back.

00:22:09 ◼   ► One thing you want to do there is in NSLocalizedString, you give both the string you want to translate

00:22:13 ◼   ► and you can have a little comments field.

00:22:16 ◼   ► And it's very strongly recommended that you put something useful in that comments field,

00:22:19 ◼   ► not just the same string again or leaving it blank.

00:22:22 ◼   ► Because you want to give the translator a sense of what the string actually means in

00:22:28 ◼   ► context.

00:22:29 ◼   ► I know some translation services also even request that you send screenshots of your

00:22:33 ◼   ► application to the translator so they can see what it looks like in context.

00:22:37 ◼   ► So they're going to translate it and send it back to you.

00:22:39 ◼   ► Or something you can also do is ask a friend or a colleague.

00:22:42 ◼   ► I've started actually doing this a few times, especially when I'm doing small translation

00:22:46 ◼   ► batches.

00:22:47 ◼   ► I'll just ask on Twitter, "Hey..."

00:22:49 ◼   ► I'll make a little Google form and say, "Hey, here's this one string that I need for a point

00:22:53 ◼   ► release."

00:22:55 ◼   ► If you speak any of the languages that my app's translated in, which I think right now

00:22:59 ◼   ► is German, Spanish, French, Russian, Chinese, Japanese, and Korean, I think are the ones

00:23:05 ◼   ► that I use typically, maybe Portuguese.

00:23:09 ◼   ► If you speak any of those languages, translate it.

00:23:11 ◼   ► Obviously that's nice for me because I have a large enough audience that I can find someone

00:23:16 ◼   ► who speaks one of those languages.

00:23:19 ◼   ► But otherwise just use a translation service and it's the same.

00:23:21 ◼   ► I will say generally what you want is somebody who is native to the target language but fluent

00:23:29 ◼   ► in yours, not vice versa.

00:23:32 ◼   ► If you come up with somebody who grew up speaking English but learned a bit of French in high

00:23:37 ◼   ► school, ideally you want a French person to do the translation for you instead who just

00:23:43 ◼   ► knows enough English to understand what you're trying to say.

00:23:48 ◼   ► Because a native speaker, there's a lot of differences and nuance to these languages,

00:23:52 ◼   ► to any language, and ideally you want a native speaker.

00:23:57 ◼   ► And I've run into this a few times with translation services in an ideal way, and this is why

00:24:03 ◼   ► I've actually started leaning more on asking friends and people I know who speak the languages

00:24:08 ◼   ► that I'm translating into, is if someone who actually uses your application on a regular

00:24:13 ◼   ► basis will have a better translation.

00:24:16 ◼   ► Because I've definitely had a thing where they say the word you're using here is the

00:24:20 ◼   ► right word.

00:24:21 ◼   ► It's not like you messed up the translation.

00:24:24 ◼   ► But the way in which they're using it is different than what a typical person would expect it

00:24:29 ◼   ► to be said as.

00:24:32 ◼   ► And I will raise my hand and confess that I have used Google Translate a few times.

00:24:39 ◼   ► >> COREY: Oh, don't do that.

00:24:40 ◼   ► >> BRIAN: When I was trying to rush out an update, and I didn't--usually this is the

00:24:44 ◼   ► problem with localization, is once you do it, you kind of have to keep doing it.

00:24:47 ◼   ► If you make a small change that adds a string or changes a string, it's like, "Oh, I don't

00:24:51 ◼   ► want to have to go through a translation service or go through a big process."

00:24:54 ◼   ► So I always just go to Google Translate and did a few translations.

00:24:58 ◼   ► And it's a train wreck.

00:25:00 ◼   ► I've done it, and I've lived to tell the tale, but I would not recommend it.

00:25:05 ◼   ► It is definitely not something--you'll get some very strange customer support emails

00:25:10 ◼   ► where they're just like, "So, I don't know how to say this best, but the person who did

00:25:17 ◼   ► your translation didn't really translate it so much as turned it into unintelligible gibberish."

00:25:24 ◼   ► And so, avoid that.

00:25:27 ◼   ► If you're just wanting to have a placeholder there, a much better placeholder is in Xcode,

00:25:32 ◼   ► you can launch your application with a pseudo-language, which is designed to test your layout, and

00:25:38 ◼   ► so things are really long and have to use different character sets and things.

00:25:42 ◼   ► If you want to just have something there to test, validate your layout with, use that.

00:25:49 ◼   ► Don't use Google Translate.

00:25:50 ◼   ► I made a mistake.

00:25:51 ◼   ► But then, yeah, you just go through that, you end up with the strings back, you put

00:25:54 ◼   ► them back into your application, and now your application, when you launch it, will be in

00:25:58 ◼   ► the new language.

00:25:59 ◼   ► And it's kind of cool the first time you launch your application and you don't understand

00:26:03 ◼   ► any of the text.

00:26:06 ◼   ► It's kind of a strange feeling, but it's kind of cool.

00:26:08 ◼   ► And then you have an app that is localized.

00:26:10 ◼   ► And as you go, as you make changes, you just need to keep track of the differences, the

00:26:15 ◼   ► new strings, or if you make changes to strings.

00:26:20 ◼   ► And your app's localized.

00:26:21 ◼   ► And I don't know if that's anything more on that process.

00:26:24 ◼   ► Apple has gotten the toolset to, at this point, be pretty good.

00:26:30 ◼   ► There was a time, I think earlier, when I looked into localization back in iOS 3 or

00:26:36 ◼   ► 4 days, and it was much more manual and much more cumbersome.

00:26:40 ◼   ► But in general now, you just kind of run the few scripts, it pulls it out, you send those

00:26:44 ◼   ► off-shore translation service, you get them back, you put them back in, and you're up

00:26:50 ◼   ► and running.

00:26:51 ◼   ► - So, how do you handle the issue of other language support?

00:26:56 ◼   ► If people who don't speak your language email you for technical support.

00:27:00 ◼   ► 'Cause that's always been my concern with localizing my stuff, is like, well, even if

00:27:03 ◼   ► I localized the whole app, am I also gonna localize the whole website, the content I'm

00:27:08 ◼   ► showing in the app, the podcast storefronts, all that stuff, and then also my support,

00:27:13 ◼   ► which I'm a bad example, 'cause I don't really provide support, I guess.

00:27:17 ◼   ► But for people who are better people than me, who provide support, how do you handle

00:27:21 ◼   ► that question?

00:27:22 ◼   ► - Yeah, and so this is something that actually was the last topic I wanted to touch on, because

00:27:25 ◼   ► I feel like it's easy to think, oh, well, then I have to provide support in these languages,

00:27:29 ◼   ► and I don't speak those languages.

00:27:31 ◼   ► And A, you'll get support in the native language of your users, either way.

00:27:37 ◼   ► And so sometimes people who know who I am and know that I'm based in the US and that

00:27:43 ◼   ► I speak English will email me in English, even though I know they're German or they're

00:27:49 ◼   ► French or they're Spanish.

00:27:50 ◼   ► But generally, you'll just get emails from people who found your app on the app store,

00:27:54 ◼   ► downloaded it, and have a question, and they'll hit the contact button if they can find it.

00:27:59 ◼   ► Because obviously it may, if it's email us is the button label, they may not actually

00:28:04 ◼   ► know what that means, but maybe email is a fairly good term, but maybe as a side point,

00:28:09 ◼   ► it's a good idea to put an icon on that button, either way.

00:28:14 ◼   ► But you get an email, and those will happen either way.

00:28:17 ◼   ► And so I really wouldn't worry about it too much.

00:28:20 ◼   ► And my experience is I take that, and this is an example where Google Translate is your

00:28:25 ◼   ► friend rather than in your in-app translations.

00:28:29 ◼   ► If you take what they sent you and run it through Google Translate, it's usually good

00:28:32 ◼   ► enough that you can understand what the intent is, especially because customer support by

00:28:40 ◼   ► its nature is somewhat repetitive.

00:28:42 ◼   ► There tend to be certain issues that come up over and over again.

00:28:45 ◼   ► And so you'll get an email and you run it through Google Translate, you'll get a sense

00:28:49 ◼   ► of what they're saying.

00:28:51 ◼   ► And then what I typically do is I'll respond in English, because I can't write in a new

00:28:59 ◼   ► language, so that's all I can do.

00:29:01 ◼   ► And then I'll take that and run my response through Google Translate into whatever language

00:29:07 ◼   ► they emailed me in, and I put that underneath my English text and send it back, in the hopes

00:29:14 ◼   ► that the combination of if they speak some English and then having the Google Translate

00:29:19 ◼   ► rough translation, they'll be able to understand.

00:29:22 ◼   ► And I would say by and large, that works.

00:29:24 ◼   ► That people understand that I don't speak their language, that I don't get a lot of

00:29:29 ◼   ► people upset about that or have issues with that.

00:29:31 ◼   ► There's this natural thing that I'm an American company, I speak English, and I'm

00:29:36 ◼   ► just doing the best I can.

00:29:38 ◼   ► And I think I wouldn't worry about it beyond that.

00:29:40 ◼   ► I think you might have converted me.

00:29:42 ◼   ► Let's see it.

00:29:43 ◼   ► I look forward to launching Overcast in German and seeing all those nice big long strings.

00:29:48 ◼   ► Oh man, I'm not looking forward to testing that.

00:29:50 ◼   ► All right, thanks for listening everybody, and we will talk to you next week.

00:29:54 ◼   ► Bye.

00:29:55 ◼   ► [BLANK_AUDIO]