Stanislas Signoud (Signez) 0:03 Okay, thank you everyone for being here. 0:11 Hi everyone, thanks for joining me today. 0:15 My name is Stanislas Signeux, but call me Stan. 0:20 I'm also called Signeux on the internet, so it's pronounced like this, but Of course, nobody besides language nerds knows how to pronounce those letters. 0:30 So you can simply remember "see-nee-hey," and you correctly pronounce it. 0:37 But call me Stan, it's easier and nobody cares. 0:41 My internet handle, or my AT protocol nickname, is senior.fr, and I'm senior everywhere else. 0:48 And there are a lot of key facts about me, but honestly, Everything that you will see on this slide doesn't matter because I'm French. 0:57 And this is the main thing that you will have to remember about me here. 1:02 And that is also why I won't do that much of eye contact because I will have to follow my notes because it's a very dense presentation. 1:12 I will try to respect the timing. 1:15 And also, I have a weird accent that you may have noticed that. 1:20 And I will be talking a lot about French from France, which is FRFR, for real, for real. 1:27 And that is key because— I'm sorry for all the Québécois and also the Belgian and Switzerland guys and also all the people from Africa that speak French, a lot of people over there. 1:39 I will not focus about that because I had to crunch it down to only 25, 30, 35 minutes. 1:47 So let's go on. 1:49 I'm here because I'm the main volunteer translator of BlueSky's UI in French. 1:55 Everything on the website, besides user-generated content, of course, is translated in French. 2:00 And that's partly because of my volunteer job that I do early in the morning before taking my croissant with a breakfast and my favorite boulangerie. 2:09 And that is not a joke. 2:10 I actually do that. 2:13 So maybe you are thinking right now that what I do is particularly this— taking BlueSky source code, translating things, and ta-da, BlueSky is available in French. 2:23 Surprise! 2:24 That's not that simple. 2:25 I encountered a lot of little problems, a bunch of anecdotes that can actually help you design better products, I think. 2:34 And simply, if you are just curious about it, learn a little bit of, you know, behind the curtain things about how to actually internationalize and localize such a complex app. 2:48 So Here is our roadmap for today. 2:51 And as you can see, I've used some examples of real case that I've faced besides the joke of the beginning. 2:59 And each time we'll get back to this roadmap, you will learn something that will replace those cases. 3:07 So let's start with the first one. 3:09 It's not poster, it's poster. 3:14 The verb. 3:17 So here is the UI of Bluesky with an equivalent of the example.com situation, a Jerry post. 3:24 And as you may notice on the top of the screen, there is a header that says "post" because what you just have seen is a post. 3:35 Signature is not really— it's sometimes redundant, but it's useful to know. 3:39 And let's say that this very funny post inspired me to write Another funny post. 3:44 So I open up the PostComposer. 3:49 And look here on the top right corner. 3:53 A post button. 3:55 Of course, in this context, you know that it's not some header. 3:58 It's just a button. 4:00 And post is written here because we write infinitive form of verbs on top of buttons. 4:08 Or maybe it's imperative form? 4:10 Yeah, you say post. 4:11 Yeah, make it obvious, whatever. 4:15 So to recap, in English, US, you have those two posts, but it doesn't actually mean the same. 4:25 They are broadly the same, but they are not the same. 4:27 One is a verb, one is a noun. 4:31 Let's say that I want to translate that in French. 4:34 Now I think that you are coming to what I'm going to. 4:39 So I want to change this to poster, which is the French for to post. 4:45 So I open up Crowdin, and I can see this. 4:49 Of course, it's a very simplified version. 4:51 Oh, there is post, so I will change it to poster. 4:56 When I get back, oh, perfect, poster. 4:59 But as you may have did this yourself, here is poster, and that It doesn't make any sense. 5:07 So something is broken. 5:09 And to explain why this is happening, I have to talk about internationalization. 5:16 By the way, did you ever notice that there were 18 characters? 5:19 [LAUGHTER] That's why we write it like that everywhere. 5:26 Actually, lots of people don't know that. 5:28 And it's a weird way of doing an acronym. 5:30 But yeah. 5:32 There are two main ways of organizing strings, translations. 5:38 In a project, you can either decide on a reference language— not surprisingly, most of the time it's English— and every word that is shown to the users is directly written in that reference language in the source code. 5:54 And then internationalization libraries and checkout if there are any translations for those words in the translation file, and swap those. 6:02 But you have also another strategy that is the article— idictum fire. 6:09 You got it. 6:11 And basically, you treat all the words shown on the screen as external data that you reference using symbolic keys like those. 6:22 The benefit of this approach is that those identifier are clear for translators because we have context. 6:30 And you can edit the text shown to users even in your own language. 6:36 So if you want to change what we also call macrocopy, you know, the word that you use for the users, even in English, you can do so without changing the source code, which is something kind of nice. 6:52 And it's also cool because in a thinking way, English is just another language. 6:57 It's not the reference language. 6:59 So that's a cool way to do that. 7:01 But Blue Sky chose the former. 7:04 And honestly, I do understand that because let's be honest, most English-speaking developers just want to iterate very quickly. 7:12 And they just slap the translation after the fact. 7:17 And so— Yeah, they should choose the first strategy. 7:20 And it's very common, and obviously it works. 7:25 So— and this is one of the two slides with code on it— we just slap the trans tag into that. 7:35 And like lives, these trans tags matter a lot. 7:40 It's a way for the international library to do its job and go fetch the actual translation for that string here, post. 7:49 So now that you know a little bit more about internationalization, how can we fix this problem? 7:55 Well, actually, it's quite simple. 7:58 And even if we have to do something on the source code, of course. 8:04 We just have to add context tags, basically attaching some context to each of these strings. 8:12 The first one is basically, you know, a standalone noun. 8:15 The second one, an action verb. 8:18 And in the code— the second slide— we simply have to add context equal description, because post is a description of the thing, not an action. 8:28 As soon as we do that, the localization catalog updates, and we have two separate entries. 8:34 And I can simply translate the second one and not the first one. 8:37 And ta-da! 8:39 Everything is translated correctly. 8:42 Success. 8:43 So the things that I want you to remember for this first example is context is everything. 8:48 Something that we know, but it's important to say again. 8:54 And you have to be ready to hear the demands of your translators to add context tags if you use the first strategy. 9:00 If you use the second, normally you shouldn't have to do that because it's already in the identifier. 9:07 And to their credit, the Bluesky team always accepted our pull requests very quickly to add context tags. 9:15 So that's awesome, and I thank them for that. 9:20 So context is everything. 9:22 Let's get to the next one, abonné, with those weird points. 9:29 And you will understand why they are there, the weird dots. 9:36 But first, let me tell you a story that starts with a GitHub issue. 9:43 This GitHub issue created by Fénarin Arsard is quite simple: make the French translation gender-neutral. 9:50 And as I said, the current French translation does not follow the current recommendation for non-sexist and more inclusive French forms. 10:00 To explain what he's talking about, I have to explain a few things about French. 10:05 So please bear with me while I will try to offer you some French 101 lesson. 10:10 I know you understand why it may take a long time. 10:14 This is a hat. 10:18 In French, we would translate it as un chapeau. 10:22 This is a tulip. 10:25 In French, une tulipe. 10:27 Une tulipe. 10:28 Yeah, did you notice? 10:30 Une tulipe, it's a feminine word. 10:34 In French, everything is gendered. 10:36 We chose a gender for everything, and there is an asterisk here, but honestly, nearly everything has a gender in French, even for brand new words. 10:46 So some examples of gendered things so you understand the mess that it can become. 10:51 This is a chair. 10:53 It's feminine. 10:55 Une chaise. 10:56 This is a seat. 10:59 It's masculine. 11:00 Un siège. 11:02 This is a shoe. 11:04 It's feminine. 11:06 Une chaussure. 11:07 This is a finger. 11:09 It's masculine. 11:10 It's a finger. 11:11 But it gets even weirder because here is Canada. 11:15 It's masculine for some reason. 11:17 But here is Poland. 11:19 It's feminine for some reason. 11:21 Strength is feminine. 11:26 La force. 11:27 Love is masculine. 11:30 Un amour. 11:30 Ooh la la. 11:32 When I say nearly everything, really I mean it. 11:36 So gendering is not optional. 11:39 This is a key thing that you have to remember. 11:42 If you say un tulipe inside a sentence and you are not a beginner or a tourist, that means that we have not switched to the quirks mode, that we will do some extra mile, or extra kilometer, as we say, we will offer to correct you, even verbally, because we will assume that you made an error, or we didn't understand you. 12:03 It's like a checksum, or CRC. 12:07 So that's not the end of it. 12:11 Here is a big hat. 12:13 A grand chapeau. 12:15 Here is a big tulip. 12:19 Une grande tulipe. 12:23 In French, we do un accord. 12:26 This. 12:27 That means that we do change the form of the adjectives that come with the noun. 12:32 By the way, I learned that it was called a cocorde in English, but nobody says that, so we don't care. 12:38 'Here are two tulips.' Actually, you do accord in English, but only for the noun. 12:44 And we do it, of course, in French. 12:47 'Here is two big tulips.' So of course, 'deux grandes tulipes.' Both gender and number are used in this accord. 12:58 And it also works with people. 13:01 So we talked a lot about gender of stuff, but of course gender of people also affects the language. 13:07 An old man, un vieil homme. 13:09 Two old men. 13:10 Oh, did you notice you also do an accord with a weird thing? 13:14 It's not only about other languages. 13:16 Deux vieux hommes. 13:19 Two old women, deux vieilles femmes. 13:24 Now that you have all that in mind, let's take a more complex example so you understand the problem that is coming. 13:35 Here is a detective. 13:37 In French, we can translate that to un inspecteur, and the gender is visible because it's un inspecteur. 13:43 Because if it was a female detective, it will be une inspectrice. 13:49 As you can see, une changed, but also inspectrice. 13:54 And that means— oh, by the way, we don't know the gender of the user, so maybe you can deduce the problem that we can have at some point. 14:03 But actually, it's not the actual problem that I'm talking about right now. 14:06 But of course, it happens. 14:08 It also happens. 14:10 When you have two detectives, a duo of detectives, one male detective and a female detective, together we call them two detectives. 14:19 Which gender should we use in French for this group? 14:24 Well, you will have to use the masculine form, "2 inspecteurs." I know. 14:29 But here's a team with 5 detectives, and 4 of them are female detectives. 14:35 How should you translate "5 detectives" in that case? 14:39 Masculine again, "5 inspecteurs." This comes from an old rule we even learn in school, "Le masculin l'emporte." So masculine takes it all. 14:49 As soon as there is one noun, subject, or part of a group that is masculine, we should use the masculine group for the whole group. 14:56 And let's be honest, this rule sucks. 14:59 People try to reason about it, saying that in French, masculine is a neutral form. 15:04 It's a cop-out. 15:06 Always gendering in masculine— in the masculine form, sorry. 15:10 The masculine form blocks some young women from projecting themselves to rule domains, can make them feel non-represented, and moreover, that's just unfair in a lot of ways. 15:22 At some point in the 21st century, some people got fed up with that and tried to change things by using something that they called "écriture inclusive," inclusive writing. 15:33 Basically, it's just voluntary using some word, piece of sentences, and tricks to make sure that we stop excluding women from the language. 15:41 So here are two main strategies that we can use to implement écriture inclusive. 15:47 Either write both masculine and feminine forms every time, in whatever order, by the way, or merge both forms into a same word like this. 16:00 And to do that, you use some points médians, which are basically your interpuncts, but nobody says that even in English, which are basically dots that you place in the middle of the vertical height of the line. 16:12 Of course, we could use parentheses, but then you put 50% of the population inside parentheses. 16:17 And so yeah, that's weird. 16:19 So we tend not to do that. 16:23 Écriture inclusive as a linguistic innovation was fringe at first, but as time goes by, it became more and more common use, especially from companies and agencies, because it was easy and an efficient way to making clear that you wanted the situation improving, showing that you cared about the subject of gender inclusivity. 16:42 But then After a few years, I'd say 5 or 6 years of widespread usage, some right-wing people started to ask themselves, you know, this whole culture inclusive thing, isn't this woke? 16:59 I mean, they focused a lot about those points médians form. 17:02 They call it something ugly, weird, decadent, or whatever, and basically created an equal sign between using the points médians and being woke. 17:12 It was bullshit, you know, but it's like that kind of stuff— it's not like this kind of stuff would stop them. 17:18 It's a perfect scapegoat for them. 17:21 So of course they started coming to the Blue Sky repository complaining about using politically-sided language just because we followed a somewhat common new practice of caring about inclusivity. 17:35 So from there, what should we do? 17:37 Well, actually, I thought about that before they even complained, and I strained myself to mainly use the long way of doing écriture inclusive by both writing the feminine and masculine forms. 17:53 And then if and only if we have very little room for the transliteration, then at the last resort, using point médian short form. 18:02 And it's what we did for abonné, by the way, the example, the title example that I used. 18:07 But we have some trick up our sleeves to make it better. 18:12 And to be fair, I lied to you. 18:13 I'm sorry. 18:14 By omission, let's say. 18:17 What if there were words that shared the same form in both genders? 18:23 That's why I used detective as an example. 18:26 A detective can also be translated in French as as a detective, and a female detective as une détective. 18:35 Perfect. 18:37 Those words that can be written the same in both masculine and feminine form are called episen words, and they are awesome for us because they basically solve the problem in a very nice way. 18:48 However, they don't always exist. 18:50 There are not always synonyms that have this property of being episen. 18:55 Including abonné, by the way. 18:57 That's why I have to use that. 19:00 So to recap, going forward, when I face this kind of puzzle in my translation work, my policy is to try to find an epicene word. 19:07 And if I can't find one, then to use expanded version with both masculine and feminine form. 19:11 And then, and only when space is missing as a last resort, using the point médian. 19:17 And here we have it. 19:20 And by the way, and this as a conclusion for this part, here is what Dan Abramoff, that at that time part of the Blue Sky team posted before closing that pull request that wanted to revert the work that we did on gender-neutral language. 19:34 It was very validating to see part of the Blue Sky team officially recognizing the work we did, the balance we tried to find by not using the somewhat controversial to the far right new forms where we could, and more of the pragmatic approach I tried to follow. 19:51 So thank you again, Dan, and the Blue Sky team for your support. 19:54 Builders, please support your translators if you are agreeing with their choices. 20:01 OK. 20:05 Let's get to the fourth point. 20:07 And we have some short time to go on. 20:09 So it's going way easier now. 20:14 But not easier, but quicker to understand. 20:18 So this, traduit, langue d'origine. 20:23 English. 20:23 A very quick, only one side, a short French 102 session. 20:29 I assure you it's very, very quick. 20:32 This is the cat. 20:33 It's the cat. 20:35 You would agree, I think. 20:37 It's beautiful. 20:38 And in French, we would say le chat. 20:41 And this is the tree. 20:41 It's such a beautiful tree. 20:43 It's the tree. 20:44 And we would say l'arbre. 20:47 Not "le arbre," "l'arbre." Because "le arbre" would sound weird, we get rid of the "e" and we replace it with a little apostrophe. 21:01 Elision is not optional. 21:02 If you don't do it, we will get back to the same— we'll crash in a way and we'll ask you, "What did you just say?" because we will assume that something went wrong. 21:13 It's like a checksum again. 21:16 So when we get back to translating software, for example, if you have a message like, "New message from Alexandre," in English, it will be translated as "Nouveau message d'Alexandre" in French, and not "Nouveau message de Alexandre." That wouldn't work. 21:34 We are used to software not doing the elision stuff because it's hard to do it properly. 21:43 There are some letters that only triggers the lesion in some cases. 21:46 The H aspiré, if you know French. 21:49 And there are a lot of hard-coded exceptions in the language, too. 21:53 So yeah, we love exceptions in French. 21:57 So because of that, internationalization libraries just don't care. 22:02 And there is no standard way of doing it, like with pool or genders. 22:09 So yeah, it's perceived as too hard and it's not done. 22:13 So what can we do? 22:14 Well, if I take this actual example from the BlueSky app to translate a string like "translated from English," ideally we would write "traduit depuis l'anglais," but we can't because it's hard to encode that in a translation system. 22:30 So we can't do "traduit depuis le anglais" because it will sound like that, and we can't do "traduit depuis anglais" either. 22:38 So we have to do workarounds like traduit originel en anglais, literally translated originally in English. 22:46 Or, because en doesn't have this elision stuff, so we don't care, it works. 22:54 Actually, I didn't use that one, but an even clearer one, because in that context it could be a little bit complex. 23:01 So I used traduit langue originelle English, translated source language English. 23:07 Fun fact from this morning, it's an exclusive. 23:11 I wanted to make sure that I quoted my translation correctly. 23:14 And this morning, I tried to find it on Quodin. 23:16 And no, there weren't any translations about that. 23:20 So I took my phone, got one of my English shitposts from a day ago, hit Translate. 23:27 And yeah, in the meantime, Eric, one of the designers of Blue Sky, changed actually all the wall design, and this string It doesn't exist anymore. 23:34 There is a nice arrow that conveys the message even easier over there. 23:40 So yeah, better. 23:42 Sometimes, you know, design can solve this kind of thing. 23:45 But honestly, I prefer this anyway. 23:46 So it's a good ending in my books. 23:50 Sometimes there are no perfect solutions, only workarounds. 23:52 This is the key thing that I want you to remember. 23:54 We try to do our best, but sometimes, yeah, you know. 23:59 But we can do what we can do. 24:03 OK, my last point is about following, Discover, and For You, et cetera. 24:13 As you may— oh, here is the UI in French. 24:16 So I will dim out all the user-generated content. 24:19 So you can see that nearly everything is translated in French, nearly everything. 24:26 Is translated in French, not those. 24:31 Why? 24:32 Well, because feed names are not part of our language catalog. 24:37 And you could say, oh, but feed names are user-generated. 24:42 Yeah, but you may have noticed that I said before, maybe not if I wasn't following my notes, perceived as user-generated, because users don't always perceive those words as provided by users but part of the product. 24:59 So it's weird that they are not translated. 25:03 We can't translate those ahead of time, and we could use some hacks to find and replace the most popular ones. 25:10 That's something that actually there is an open pull request from SurfDude29 to do exactly that, but it's not a very foolproof way of fixing this problem in my opinion. 25:21 So how should we proceed? 25:24 Well, I don't know. 25:27 No, honestly, I don't know. 25:29 Please, dear AT Proton nerds, this is a mission I give you, your homework. 25:34 Please figure this out. 25:36 We have to figure out a solution to that. 25:39 Actually, we were able to do that with labels, moderation labels. 25:43 I've just learned that from Travis from Cartridge that explained that to me yesterday. 25:48 But it wasn't done for feed name. 25:51 It's so frustrating because they are the very prominent part of the UI for good reasons. 25:55 It's a very good feature. 25:57 And yeah, it's very frustrating that it's not translatable right now. 26:02 So here we have it. 26:05 Context is everything. 26:06 Support genders and translators. 26:08 Workarounds may be required. 26:09 User content should be translatable as soon as they are not perceived as user content. 26:14 Is that it? 26:17 No, of course not. 26:18 It's not the end of it. 26:19 Translating stuff is only a small part. 26:21 Of the equation. 26:22 You should think about localization holistically. 26:26 That's because as an integrated experience, language and region-specific stuff are everywhere. 26:34 And again, we don't expect you to figure it out from day one or to figure it out by yourself. 26:40 You can't know everything. 26:42 But even— I would say that every given will provide tremendous value to users around the world. 26:53 We talked a lot about what could also be translated in the previous panel, but just to recap, terms and conditions are not translated right now for BlueSky. 27:04 Community guidelines are not translated right now for BlueSky. 27:07 It's kind of weird in a way that we expect users to respect rules they can't even read. 27:12 Training topics are not localized, and one key message that I want to give you is we We don't care about the NFL. 27:19 Stop trying to tell us about the NFL. 27:22 We don't care. 27:22 It's just a weird thing. 27:24 You don't even use football correctly. 27:25 Weird. 27:27 And also blog posts and help pages are not translated right now. 27:32 You know, Discover Feed algorithms— Night Heaven did a great leaflet about that— are not localized. 27:39 So you will encounter a lot of content that is not in your language, and you can There are some other list systems that are in place, but that's not very— that's a hack, not a proper localization. 27:53 And of course, announcements right now, Blue Sky do not do announcements in any other language than Japanese and English. 28:01 And that's it. 28:02 That's weird. 28:04 But we talked a little bit about that in the previous panel. 28:07 And here we are. 28:09 Thank you for listening. 28:13 To see my work in action— thanks. 28:20 As a guy said at some point, please clap. 28:23 To see my work in action, you can just go to the settings and change the language to French. 28:28 I also want to thank surfdude29 because this guy simply is an informal translation manager for the whole Bluesky open source project. 28:38 He do it in his spare time. 28:40 And that's awesome that he do that. 28:42 And also thanks Pippo Montis that helped me figure it out, some stuff on those slides. 28:47 And of course, a big shout out to all the other fellow translators. 28:50 I hope that I didn't say anything weird about your work too. 28:56 And as Stanley Parul said, "The end, even ever the end, is never the end," about all the things related to translation. 29:06 Do you have any questions? 29:07 Do we have time for questions? 29:09 Oh, there's no time. 29:10 Ah, sorry. 29:11 So yeah. 29:12 Yeah. 29:13 And feel free to follow me to know more about that. 29:17 Thanks. 29:18 Thanks so much, Stan.