Hi, I'm Tom DeMour. Come in. Great to be at Fasnem Sunday morning, 11 o'clock and we are talking about translations. I'm a long time open source contributor and in the past four years I've been contributing to Mattermost. I started contributing with translations and then I did write some blog posts, did some quality assurance as well, and did some programming in the meantime. In that time, I became the unofficial self-declared translation community manager. I want to talk about the lessons I have learned. For the people who are not familiar with the Mattermost project, Mattermost is a chat-centered platform with a lot of possibilities for integrations. It's very versatile. It's not only for DevOps. From the beginning from the project, the translations were a community effort. We are now shipping Mattermost in 21 languages. Each language contains about 9,500 strings that are 6,500 words. That's about 150 pages of text. In total, we have more than 1.6 million words translated. In this talk, I want to focus on the following topics. I want to give you an overview of our translation community and how we try to nurture them. Further, I want to tell how developers have an impact on translations. I want to share some good practices on how we try to improve the quality of translations during time. We have 680 active translators in the past three years. I must say there is a very high turnaround of translators. When we take a deeper look at the numbers, we see that only 15% of the translators is making 75% of the translations. From that small group, most of them are long-term contributors. But we do have also translators that come in, do an amazing amount of work in a very short time for a specific language, and then they disappear. These numbers are not based on survey. This is what my experience is telling. When we look at a large group of the 85% translators that doesn't do that much of translation work, when we are looking at what is motivating them to do that, we often see it's fixing an annoying error. They see an error in the translations, it bothers them, they come in, they fix it and they leave. That's perfectly fine, that's great because it was an annoying bug for someone and it got fixed. Others just want to give it a try. They say, okay, I've heard about it, I want to give it a try. But translation work is work that's not very visible. You're doing it alone, you're not getting real feedback and people give up on that. Others start translating because they love the product and they want to contribute to it. When we look at the 15% translators that do a lot of work, of translation work, why are they doing that? We see that very often their peers are using Mattermost, their company, their friends, their community, and they want to give them the best user experience. Also, we see that they like to keep the translations up to date. They love it when they see 100% translated. They would actually go in, log in at night to get that last string finished so that before we ship the next release, they still get a 100% feeling. Another nice thing is they become experts in the product because by translating, you get to know the product very well. You see new features that are not yet in the product, but you are already translating the strings, or you see features that you are not using, but that you are translating. Oh, I wasn't aware that we can do that also with the product. And they often become ambassadors of the product and like to contribute to the product. Look at me, I'm standing here. Now that we know what is motivating translators, we also know what scares translators away. One of the things is there is some frustration when they don't feel hurt or when they give feedback to developers. It's like mostly it's about style or sometimes the direction the program of the project is following. And yeah, I've said it a few times and it still hasn't changed and people sometimes leave for that. Things that are broken. We had some issues in the past when where translations didn't get into the product. And people, yeah, we are putting time in this and we don't see it in the product. That's also something that people don't like. They want to see the result of their work. We do reach out to new translators or to translators who are really on fire and are doing a great job. And we have noticed that sometimes reaching out to them is also giving them pressure to keep contributing. And they are saying, yeah, but I don't want that. I'm just doing this in my spare time. I love doing it, but I don't want that you have got expectations that I will not be able to fulfill. So we have to be very careful with that. We do our very best to be a very warm and open, welcoming community. This means that we had to remove a long-time translator for a shit language after we made some posts in a channel that violated our code of conduct. That action was took place immediately. It was no big deal. It's hard losing a long-time contributor, but community comes first. And I'm still grateful that how they handled that situation. And that's something I... Yeah, when you are doing translations, it's working with a lot of different nationalities, with a lot of different cultural backgrounds, and that's great. I still learn every day from it, and it opens your view on the world and stuff like that. And we have to make it happen. Like, we don't talk about politics. There are a lot of ongoing issues in the world. We don't talk about politics. I don't take a stand in them. I look at the people. And yeah, I want every conflict to be ended as soon as possible, of course, but I will not take a position in it, because I don't... Yeah, I can't. It's too complicated. OK, communication is key for us to keep our translators together and to move forward with them. We have a dedicated channel on our community server, and I will tell you about what's happening over there in the channel. Monthly, we welcome our new translators. We name them and say, hi, welcome. It's reaching out. It's saying, OK, we see that you have started translating rather most, and you don't see your translations yet in the product, but we have seen your effort and we are saying hi to you. What else do we do? The community channel is also a place where translators ask questions to the developers, but also developers ask questions to the translators from, hey, we are having an issue with this. Is it right that in your language this will do that, or... and stuff like that? Or we can simply ask, like, I don't know, oh yeah, it's readable, like, oh yeah, there is a new term in the product. Does it mean what I think it is, or is it something different? We are very open about ongoing issues as well. We had some much conflicts and we are open about it. People like it because they know that we care about these issues and that we want to solve them and that we are working on it, and that it makes them feeling at ease, like, OK, we are important, we do matter and they are working on it, and when they see your effort of getting things fixed, they have a little bit more patience and a little bit more love. Yeah, we also set up some webhooks, like we get notified when the translations are locked or being unlocked, because people are doing the translations very often in their spare time, and nothing is as frustrating as planning, like, OK, it's Friday evening, I have some time to work on the translations, and then, oh yeah, it's still locked. But if people know, OK, it's still locked, I don't have to check in to see if I can do my translations, it's just, yeah, being user-friendly. We have a weekly update as well, it's running for about three years now. It contains roughly the following information, it depends from week to week, but we have some topics that always come back, the current workload. It's very nice to know that, OK, the current workload for the next release is low, it only are about 40 strings or so, then you know, OK, I'm still at ease, but there are times that we have a very high workload for the next release, and that you have about 200, 250 strings, and if you are one of those guys that says, I want a 100% fully translated product for each release, then it's important to know, OK, I have to make some more time for this week, of this month. We also put in the deadline for the next release. I know myself, if I don't have a deadline, I will keep, I will do it, I will do it, but when I see the deadline facing, oh yes, here I am. We also ask feedback to the community, when we are changing things, stuff like that. Yeah, it's working well. Yeah, what else do we do? Swag, we often make a joke that, matter most, is a swag driven company. That's not always true, but as you can see, to prove my point, I've got socks with me, people who want socks or stickers after the talk, please, come over, we do ship some swag to our translators as well. What else do we do? In each release, with the release notes of each release, we add the names of our translators. They are contributors like everyone else. Each release has most valued professional elected translators, do get elected as well and get that reward as well. We reach out to new translators, I already said that, but we actively are reaching out by mail as well, sending them an email, but we only get a 2% response rate, so it's not really high, and we are not really sure if it's working, but it's still saying, we are seeing that you are doing something that we really like, and we want to say thank you. And we had our first virtual meetup. It seemed fun to me to bring all the translators together and to have a nice chat. We were actually with three people the first time. Okay, translating is something that you do alone, but we want to give it a try and we will make it grow. It's also hard to find the good moment, because we are spreading it all over the world and the time zones are not really working with us. But we're going to keep it, we're going to see how it continues. Maybe I would be happy if there was about 7 to 10 people, right Luri, on the Rhyler base, but we'll see how it goes. Okay, time for the next part. Our developers can help translators, because developers have a positive or a negative impact. Yep, use variables for everything that doesn't need to be translated. That's a lesson we learned a little bit of the hard way. We have about 200 references in the product to our documentation site. And then we had a great idea, we're going to reorganize the documentation site. What meant that we had to change 200 strings in the product and we had to ask each translator, can you copy paste that URL to that one? And that's of course quite some work. And then we decided we're not going to do that way. We must find another way. And then we replaced all our links to the documentation site by a variable. I scripted that. Yeah, that was something. I can script, but I couldn't do React and stuff like that, so it was flying blind. But I got good support from the developers from Mattermost and we made it. Another example is the minimum requirement for the browser you're supporting. That changes also very often. If you put that in a variable, Firefox is Firefox and the number will change, then you have the benefit that when a translation is lagging for whatever reason, your product information is still up to date. Okay, a classical one. Don't split sentences across multiple strings. Mostly done for formatting. But grammar is different in every language and you will end up with a Yoda-style translation. So don't. A question we are asking ourselves as well. Everything needs to be translated. Mattermost is a quite large project. If you have to start from scratch for adding a new language to the product, then you can wonder, should I prioritize translations? Like feedback from an API. Does it need to be translated? Who sees the feedback from an API? A developer. We sometimes think that developers know a little more English than most of our end users. Strings that are not visible for end users like the system console. We think system administrators, most of them will speak a little bit of English. If you have to make priorities, maybe that is not a priority. We have been struggling with plugins as well. What do we do with plugins? It is very nice if they are translated. Because within the product everything is in the same language. That is great. On the other hand, it is also quite some work for the translators to do all the plugins as well. You have to set up a translation server for that as well. So that is not as easy as well. Some plugins come with a lot of enthusiasm and they start translating. These translations were in a language that we are not shipping. What do you do with these translations? These people did a lot of work for the translation of that plugin, but we are not shipping it. Think about it. It is a great policy. Another thing, provide context. If you want to make your translators really hard, remove all context. This is an example where we have to translate the word add. Add can be used in very different meanings and translated in very different words. It turned out that it was add to a clock. It was a reference to time. In an ideal scenario, we would like to add screenshots to the translations, but we have not found a sustainable way of doing this. We do have a dedicated playground cloud server for translators. If they are an admin on their local instance, they can be an admin in our cloud server and they can go to the system console and they can play with all the settings and see, oh, that's what that string is really doing or is meant for. That is a way we are trying to help them as well. Prepare for the unexpected. One bloke came in and said, okay, I'm going to translate to Australian English. Okay, cool. Do. Then we found out when we shipped it that it wasn't showing up in our mobile app, because our mobile app was programmed to detect the language, but not the regional variant, so we had to do some code changes to change that. Another great one was we have support in beta at this moment for Persian. That's right to left language. That's something you have to check with your layout as well, because that's something, whoa, also not really what we were expecting, but it works. A classical one, some languages are more verbose or less verbose, like the previous speaker you mentioned, his translation narrowed down with one third of the document. Other languages like French, Portuguese are more verbose, and you can get in trouble with your placeholders or your buttons when we are putting quite some text over there. Now I'm going to be a little bit unsure. I think that some languages don't use spaces, and I'm going to see what people like Chinese, Japanese don't use spaces, right? And if you want to split sentences that are very long or translations, and we're going to split it on the second of the fourth space, and you're not using spaces, yep, you run into trouble. Yep, all those nice things you learn from working with people. Last thing, some people are evil. If you haven't noticed yet, they are. Our translations have been an attack factor of, they tried to, and you have to check your translations. They tried to put some nasty stuff in there. Also check, very often you can already see the username tells a lot. If you are evil-devil 666, then you are probably not up for something good, and you want to really contribute to the product. I'm not giving a hint to the evil hackers, change their username. Nope. But of course we want to be as open as possible to our contributors. We like contributors, the more the better. But we want to keep our product safe as well. So we have set up a permission scheme. For our work in progress languages that are not shipped and not visible, everybody can contribute. You comment, create an account on the web plate, and you can contribute. For the shipped languages, everyone can make suggestions. I don't like, this translation is faulty, I would change it like that. It's only a suggestion. Our shipped languages, for translating these, you have to get an extra permission. And we are just doing a small check, who are you, welcome to the community. Why are you wanting to translate, no matter most, and here you are. But it keeps the bad guys away. Okay, we are almost there. How do we try to increase the quality of our translations? I mentioned already that we have a very high turnaround of translators. And translating is an ongoing effort that never ends. And we recommend translators to create a stylite for their language, that they use the same phrase every time for the same English phrase. Because, yeah, you can translate it in many ways, but try to be consistent through time and through the product. This is something that we are recommending. Some languages do have it, some others don't have it. Translators are language experts. At matter most, we use an informal, friendly tone in our products. And we ask our translators to follow that tone. But it's very language specific. And I learned that in some languages, people say, yeah, but if we are going to use that tone, it will sound childish or even offending. So how can we find a solution to be friendly and open and a little bit more informal, but still correct in our language? Another issue we ran into was that people were translating product names. We have channels, calls, playbooks as product names within the product. And of course, people say, oh, I'm going to translate it. But we don't want to have our product names translated. And so we made an agreement if they are written with a capital, they start with a capital, they don't have to be translated. So that, of course, if they are in the beginning of a sentence, then you still have to check. But it's something that we had to train some translators like, OK, it's not what we expect that you translate product names. OK. That was it. Do you have some great questions? How do you decide which languages are shipped? Oh, very good question. The question is just for the people on the live stream, how do you decide when a language is shipped or not? When 85% of the languages, of the strings is translated, then it becomes a beta language. And it has to be 85% for three months. Then it goes into the product as beta language. And if we see an increasing, then it goes to really in production after three months when it's about 90%, 95% translated. That means also that when a translation is lagging and is not longer being maintained, that it goes to beta again. But we keep them in the product, even if they are about 60%, because a faulty translation is sometimes a way to get new translators. How fine-grained is the permission schema, especially for languages you are already shipping, like there is a very active translator, how and when do you decide if the casual contributor becomes someone who can write translation? By reaching out to the translator. We reach out to the translator and first we watch. If you create an account, Lozen makes three suggestions for a new, for a shipped language, and then we don't see him anymore. Okay, thank you for the suggestions. We will take a look at it. But if you see that he's making suggestions on a regular base, and yeah, then we contact the person and we say, okay, we see that you are doing, you're making suggestions. We like them. Don't you want to be translating the product? And if the person says yes, we elevate them in the permission. Do you don't interact with the UTS team? Yes, yeah, we will, yeah. We're looking for a style, especially. Yeah, but then we say we have some localization channels for each language as well. We have a channel for German and we join the channel and have a conversation. And we do have some, yeah. I implement encodings a lot. There's no white space and no points and whatever. But I have a big problem with translations always with German, English, French and Dutch, for example. So in English you just have you. And in German you have this formal and informal, do and see or... And it's very funny, it doesn't matter which software I use. It's always, however, even when I translate from German to French, I say the German informal do and in French it's translated Brazil. And do you have anything to present because you said just take places always and take always the same places. But I think... The style guide. Like an open discussions. We have open discussions about it, like one of our French contributors is in the back of the room. And he decided, we decided, OK, we are not going to try a... And in German we decided to have do. And we let the... They are created by the community. I got a very good French contributor who made a very nice format. And I'm happy to share it with you. It's open source guidelines and after the talk I will share it with you. And people who want the style guide ping me and I will share it. No problem. Last year, distribution had an evil contributor, an evil translator who translated two-thirds of the job perfectly. And in the last third of the file they used swear words and bad words. The distribution had to pull down their ISO files and to re-release everything. And all this in the timeframe of two weeks or so. Do you have an idea how this can generally be prevented? It could be an issue at Mattermost as well. We try to have two translators, a maintainer and a reviewer. But actually that is quite informal and we are actually not really checking it. So we... I don't want to bring people on bad ideas but it's a risk. Yeah, that's a good idea. You can easily script it if you have a list with all the swear words. The good part is that we do a check-up on our translators for the shipped languages. It's not that everybody just comes in and we do... And especially the new translators, we do some Google Translate checks on their strings to be sure before we merge them. Yeah, the long-time contributors, I don't check them because I'm quite sure about it. It's an answer. LNMs are very good at that. It's not as comfortable as free, it's slow, but it's a long way. The other is using the distance from machine translation to try to understand how far, like the distribution case would have been called by distance between the machine translation and the existing swear words. But yeah, nothing comes from this. Yep. All your translations in the language, are they all community-provided? Is all community-provided. Sometimes for a specific language, a company pays someone or says to someone of the staff, please translate it, but we are not actually paying our translators. What's the answer using AI for translation? AI for translation. We tried it and we found the results not good enough. You notice that it's AI. I'm going to take him first. Can you welcome translators who don't have technical knowledge in the community? Because it's sometimes difficult for them to understand how to do translation. Yeah, we have a very user-friendly, web-late environment and we made a video recording where we go through the product and show how do you translate and web-late. That's something we use indeed because you have to be as user-friendly as possible. Some people come in and try to translate and make a pull request and then we have to say, no, you have to go through web-late. How do you deal with partial localizations? You mentioned that you have limits like 60% to 85% above which you are shipping a product with this localization, but that clearly means that there are some messages that are on-day in that locale. How do you present these to the user? In English. English is the default. If we don't find the translation, it shows up in English. You mentioned that you don't actually know any card using AI, but I do think you mentioned that when you can just use machine translation and you can learn the translation language, and then perhaps you can also re-edit language and use the cultural language. And therefore, you can use the power of that and with this long-term, would this long-term, would actually reach the up-stay level? In web-late, we do use D-Pill to make suggestions, but I noticed myself that for Dutch it's quite good, for German it's quite good as well, but sometimes you have to change it. Often the do-and-see problem and the two... On the left, and not in left, instead of why did you left it because of loss or so? So, it increases the performance of your translations a lot, but you have to manually go over them because you can't press the AI enough yet. How many translations per language do you have? Mostly one, sometimes two. In German, it's only allowed to add documents in passive form, and in English, you usually have reactive form with you. Do you also have an automatic form? I should ask the German translator what he does for me. Okay, thank you. Don't forget the socks.