[00:00.000 --> 00:08.520] Thank you everybody for joining. [00:08.520 --> 00:13.440] I'm going to talk about the KDE Translations project. [00:13.440 --> 00:18.580] I kind of made a clickbait subline trying to get more people. [00:18.580 --> 00:21.600] I would be the biggest Flows Translations project or not. [00:21.600 --> 00:24.480] Maybe we're going to see some stats later. [00:24.480 --> 00:27.360] First of all, I'm Albert. [00:27.360 --> 00:29.760] I've been doing KDE since 2003, [00:29.760 --> 00:32.160] so like a long, long time ago, [00:32.160 --> 00:33.680] and since it was a long, long time ago, [00:33.680 --> 00:34.680] I've done lots of things. [00:34.680 --> 00:35.960] I did translations. [00:35.960 --> 00:38.800] First, I started doing translations for Catalan, [00:38.800 --> 00:41.200] and then I got bored and I just started coordination, [00:41.200 --> 00:43.440] the whole KDE thingy. [00:43.440 --> 00:46.240] I've been doing lots of apps, [00:46.240 --> 00:48.440] Oculus, which is this tool I'm using, [00:48.440 --> 00:49.920] like it's a PDF viewer. [00:49.920 --> 00:52.160] I manage the releases from time to time. [00:52.160 --> 00:54.960] I've worked with games, with the Edu. [00:54.960 --> 00:59.480] I've been a part of the board of KDE Germany and KDE Spain. [00:59.480 --> 01:01.600] Well, KDE International and KDE Spain, [01:01.600 --> 01:03.280] so yeah, I'm with everything. [01:03.280 --> 01:06.520] You have my e-mail there and my nickname. [01:06.520 --> 01:07.520] I use almost everywhere. [01:07.520 --> 01:10.840] It's TSDGios or whatever you want to pronounce it like. [01:10.840 --> 01:12.040] It's hard. [01:12.040 --> 01:14.680] I didn't think I would be pronouncing it when I chose it, [01:14.680 --> 01:19.320] when I was 10 because there's too many consonants together. [01:19.320 --> 01:21.120] But yeah, anyhow. [01:21.120 --> 01:22.840] What is KDE? [01:22.960 --> 01:26.720] This is the long buzzword description. [01:26.720 --> 01:28.160] We came up with KDE, [01:28.160 --> 01:31.080] which if you remove the last two or three words, [01:31.080 --> 01:32.520] it could be applied to [01:32.520 --> 01:34.480] every single project out there in POSDEM. [01:34.480 --> 01:38.200] It's like, we are a team of people that do things under free software. [01:38.200 --> 01:39.560] Okay, so we're cool. [01:39.560 --> 01:41.160] But what is KDE really? [01:41.160 --> 01:43.120] So we do software. [01:43.120 --> 01:45.000] So we do KDE Plasma, [01:45.000 --> 01:48.000] which is what people usually know as KDE. [01:48.000 --> 01:49.000] So it's the desktop. [01:49.000 --> 01:51.840] It's this thing where I do out top and I chose things. [01:51.840 --> 01:53.560] This is KDE Plasma. [01:53.560 --> 01:55.960] It's not called KDE anymore. [01:55.960 --> 01:58.320] Then we do frameworks, [01:58.320 --> 02:01.200] which are libraries that our software use, [02:01.200 --> 02:02.880] and there's like 80 of them. [02:02.880 --> 02:05.040] Then we have something called KDE Gear, [02:05.040 --> 02:09.040] which has like 200 applications that we release every month. [02:09.040 --> 02:10.520] Every month, a stable release, [02:10.520 --> 02:12.120] every four months, a new release. [02:12.120 --> 02:16.080] So we do releases too often. [02:16.080 --> 02:20.960] Then we have more apps like Krita and G-Compre and KDE Connect, [02:20.960 --> 02:24.040] and they get released when they feel like. [02:24.040 --> 02:29.360] These are less fixed schedule. [02:29.360 --> 02:34.120] One of the things I just added recently is that we are old. [02:34.120 --> 02:36.280] We started in 1996. [02:36.280 --> 02:39.840] So this will maybe explain later why [02:39.840 --> 02:44.400] some things are as messy as they are and we should improve them. [02:44.400 --> 02:48.880] So what do we translate? [02:49.380 --> 02:52.040] It seems like a very obvious question, [02:52.040 --> 02:55.320] but so obviously we translate the application. [02:55.320 --> 02:57.360] The application is what the user uses. [02:57.360 --> 03:00.000] If I want my father to use something I did, [03:00.000 --> 03:01.520] it needs to be in Catalan because [03:01.520 --> 03:03.600] otherwise he will not understand it. [03:03.600 --> 03:05.940] So yeah, user interface. [03:05.940 --> 03:08.240] Good. Now you have the user interface, [03:08.240 --> 03:09.840] and you have a problem. [03:09.840 --> 03:13.000] Sure, my father can come and ask me and I will solve the problem, [03:13.000 --> 03:15.200] but I'm not the children of everybody, [03:15.200 --> 03:17.640] so you will have to look at the documentation eventually. [03:17.680 --> 03:20.720] Documentation has also to be translated. [03:20.720 --> 03:24.160] It's very boring because the documentation is very long. [03:24.160 --> 03:28.120] Translating the application is usually easier because it's [03:28.120 --> 03:30.960] help or print or file or copy. [03:30.960 --> 03:33.360] Documentation is if this failed, [03:33.360 --> 03:34.720] do this and blah, blah, blah. [03:34.720 --> 03:36.600] It's a super long string, [03:36.600 --> 03:39.120] but it's interesting to translate it. [03:39.120 --> 03:42.760] People will eventually need the documentation. [03:42.760 --> 03:45.200] One thing we didn't use to translate, [03:45.240 --> 03:47.320] it's web pages. [03:47.320 --> 03:50.560] You really need to translate web pages. [03:50.560 --> 03:53.480] If you have the best app ever, [03:53.480 --> 03:57.040] but the web page of the application is only in English, [03:57.040 --> 03:59.720] people are not going to find it. [03:59.720 --> 04:03.000] Sure, how do they know the application exists? [04:03.000 --> 04:04.480] If I only speak Hindi, [04:04.480 --> 04:06.520] how do I know this application is amazing if [04:06.520 --> 04:07.880] your web page is only in English? [04:07.880 --> 04:09.920] It's like the first, [04:09.920 --> 04:12.640] the step zero is people need to install your app, [04:12.640 --> 04:13.520] they need to find it. [04:13.520 --> 04:17.240] So your web pages need to be translated. [04:17.240 --> 04:20.440] Then there's other things that we do translate, [04:20.440 --> 04:22.720] which are less obvious, like data. [04:22.720 --> 04:27.240] So we have a game which is the Hangman game. [04:27.240 --> 04:30.200] So you have to guess the letters of a word. [04:30.200 --> 04:33.440] Those words need to be translated, [04:33.440 --> 04:35.680] but they don't need to actually be translated. [04:35.680 --> 04:40.000] They need to be localized because what's an easy word in [04:40.000 --> 04:42.520] English when you translate it to German, [04:42.520 --> 04:44.800] it might be a super hard word to guess. [04:44.800 --> 04:47.280] So if you are in the easy mode, [04:47.280 --> 04:49.240] things don't translate one to one. [04:49.240 --> 04:52.640] You have to adapt what's an easy word in [04:52.640 --> 04:55.720] a language to an easy word in [04:55.720 --> 04:58.160] another language or hard words or something like that. [04:58.160 --> 05:02.520] So these are things that data not always is a one-to-one translation, [05:02.520 --> 05:05.520] it just needs to be localized. [05:05.520 --> 05:07.800] Then we also translate things like, [05:07.800 --> 05:09.720] well, translate, you don't translate. [05:09.720 --> 05:13.000] We localized things like icons. [05:13.000 --> 05:17.520] So icons are an image of [05:17.520 --> 05:22.080] a concept that you assimilate to an action. [05:22.080 --> 05:25.360] For example, the safe icon. [05:25.360 --> 05:27.240] We all go with floppy disks on [05:27.240 --> 05:29.760] the wall using the safe icon. [05:29.760 --> 05:32.680] That's about icon nowadays. [05:32.680 --> 05:34.080] Nobody wants to use a floppy icon. [05:34.080 --> 05:37.040] But so for example, what you would use to, [05:37.040 --> 05:40.120] I don't know, spell check in a language, [05:40.120 --> 05:42.320] maybe in another culture or something [05:42.320 --> 05:45.640] that iconography you created means nothing, right? [05:45.640 --> 05:48.840] So we have a few localization of icons. [05:48.840 --> 05:51.760] It's not very common but it's something we can do. [05:52.720 --> 05:57.600] Okay. So how are we structured? [05:57.600 --> 06:00.800] I think this is very common to all the projects. [06:00.800 --> 06:02.200] We're going to explain it anyway. [06:02.200 --> 06:04.920] So we have a global coordination team, [06:04.920 --> 06:10.080] which is in this weirdly named mailing list, [06:10.080 --> 06:11.880] because it has doc in there and it [06:11.880 --> 06:14.400] doesn't have anything to do with documentation. [06:14.400 --> 06:16.040] This predates me. [06:16.040 --> 06:18.680] So I don't really know why it's there. [06:18.680 --> 06:24.480] The I-89, this is a short way of writing [06:24.480 --> 06:30.440] internationalization, it's just geeky anyhow. [06:30.440 --> 06:40.160] Then every main person from a language has to be there. [06:40.160 --> 06:43.120] So I will write emails there saying, [06:43.120 --> 06:45.760] we're going to do this change or this has happened or, [06:45.760 --> 06:46.920] I don't know, if something breaks, [06:46.920 --> 06:48.360] it's like this broke, [06:48.360 --> 06:52.240] apologies don't do anything for today until we fix it. [06:52.240 --> 06:56.200] Then each language has their own coordination. [06:56.200 --> 06:58.680] It's like the Catalan team, [06:58.680 --> 07:00.680] we have a mailing list and the French team [07:00.680 --> 07:03.120] maybe has a forum or whatever. [07:03.120 --> 07:07.200] We don't really enter at that level of detail. [07:07.200 --> 07:10.720] We do offer mailing lists for everybody to use if they want to, [07:10.720 --> 07:14.400] but if they want to coordinate themselves in any other way, [07:14.400 --> 07:17.360] there, that's fine. [07:18.160 --> 07:21.960] That's on the people side. [07:21.960 --> 07:25.560] Like how do we structure on the files side, [07:25.560 --> 07:27.200] like on the things they have to translate. [07:28.200 --> 07:34.400] So what we have is three branches which are development, [07:34.400 --> 07:36.720] stable and Plasma LTS. [07:36.720 --> 07:41.280] Plasma LTS is a bit hidden because it's only for Plasma. [07:41.280 --> 07:43.720] It doesn't affect all our other products, [07:43.720 --> 07:47.360] but still we have three branches and in each of the branches, [07:47.360 --> 07:49.720] we have basically think as a folder. [07:49.720 --> 07:53.280] So there's a folder which is development and inside that folder, [07:53.280 --> 07:56.280] we have a folder for a team and inside that team, [07:56.320 --> 08:00.000] we have a folder for every application and inside of that application, [08:00.000 --> 08:02.720] we have a folder, sorry, no folder anymore. [08:02.720 --> 08:05.600] We have files for that application. [08:05.600 --> 08:07.200] I'll show it later. [08:07.200 --> 08:10.280] I can show it now maybe on the browser. [08:10.280 --> 08:13.080] So that's not this one. [08:13.080 --> 08:14.200] I have to make tabs open. [08:14.200 --> 08:16.800] Sorry. Where are you? [08:16.800 --> 08:20.440] Here. So this is like the development [08:20.440 --> 08:24.680] translation directory and then there's one directory for [08:24.680 --> 08:30.360] every single language that we have and then if you open the Catalan language. [08:30.360 --> 08:34.520] So we have separated in between documentation and messages, [08:34.520 --> 08:36.240] then if you open messages, [08:36.240 --> 08:40.600] you have all the applications that there's lots of applications. [08:40.600 --> 08:42.140] If we find for example, [08:42.140 --> 08:44.720] Ocular which is the PDF app, [08:44.720 --> 08:50.320] you will see there's a few sub files because things sometimes are split or not, [08:50.320 --> 08:52.760] but that's how it works. [08:52.760 --> 08:59.520] We have that replicated for development, stable, and Plasma. [08:59.520 --> 09:03.760] So one of the things that is annoying and better also from [09:03.760 --> 09:08.720] PostgreSQL mentioned is that managing branches is not great. [09:08.720 --> 09:13.320] People forget, they do go to one place and translate it, [09:13.320 --> 09:16.880] and they forget to go to the other place and translate it, [09:16.880 --> 09:21.080] and then when eventually development stops being [09:21.080 --> 09:23.200] development and becomes stable, [09:23.200 --> 09:26.520] so you have to copy translation from one place to another, [09:26.520 --> 09:29.400] and if they only translated to stable, you might lose them. [09:29.400 --> 09:34.040] So we have a semi-official workflow, [09:34.040 --> 09:39.920] which is like just put everything together and give it to the teams so they can translate that. [09:39.920 --> 09:44.600] We haven't made that official yet for two reasons. [09:44.600 --> 09:48.120] One is that it uses lots of CPU time. [09:48.120 --> 09:52.760] Peter also was mentioning that it took like 20 minutes for him. [09:52.760 --> 09:54.800] Well, yeah, it takes more for us. [09:54.800 --> 10:02.480] The other one is that development sometimes moves very fast. [10:02.480 --> 10:05.680] You don't like there's messages changing every day and it's like, [10:05.680 --> 10:10.200] if I change messages three times in a week, [10:10.200 --> 10:15.120] maybe not all the teams want to keep track of development. [10:15.120 --> 10:19.040] So they will only start translating when the release is close to it. [10:19.040 --> 10:21.280] It's like, if you merge everything together, [10:21.280 --> 10:23.800] they don't know that message that that's not translated. [10:23.800 --> 10:25.040] It's like, is it important? [10:25.040 --> 10:30.800] Is this actually being used today or might be used in three months future? [10:30.800 --> 10:35.600] So there's this reason we're not still sure it makes [10:35.600 --> 10:38.840] a sense to do the merge workflow, [10:38.840 --> 10:41.840] but we might be there sometime. [10:42.240 --> 10:48.360] So now some statistics of why I checked a few projects [10:48.360 --> 10:51.520] and I couldn't find anything that was as bigger as us. [10:51.520 --> 10:55.400] So over development, [10:55.400 --> 10:56.800] everything has stars. [10:56.800 --> 10:58.640] I will explain the stars later. [10:58.640 --> 11:03.960] Our development branch has almost 300,000 unique GUI strings. [11:03.960 --> 11:06.440] This is not adding up all the languages. [11:06.440 --> 11:07.720] This is per language. [11:07.720 --> 11:15.160] So we have almost 300,000 GUI strings and around 75,000 documentation strings. [11:15.560 --> 11:21.160] I checked Nome and I think Nome was around 100,000 for GUI. [11:21.160 --> 11:25.000] I checked LibreOffice and I think it was similar-ish. [11:25.000 --> 11:28.000] So yeah, we have lots of GUI strings. [11:28.000 --> 11:31.920] Now I'm going to explain the stars a bit. [11:31.920 --> 11:37.200] Not everything we do has development and stable branches. [11:37.200 --> 11:40.440] Some of the things are just they developed and they release and they [11:40.440 --> 11:43.480] don't create a stable branch at all and they develop again. [11:43.480 --> 11:47.480] So that's why there's so many more development strings than stable. [11:47.480 --> 11:49.160] For example, all the libraries, [11:49.160 --> 11:51.000] they don't have stable branches. [11:51.000 --> 11:55.680] We just every month we do a release and that's the stable release. [11:55.680 --> 11:59.440] Then on the GUI strings, [11:59.440 --> 12:02.000] some of them might be documentation strings. [12:02.000 --> 12:06.040] We have started changing workflows and we have not adapted yet, [12:06.040 --> 12:08.600] but yeah, not too bad. [12:08.600 --> 12:15.640] In terms of teams, we have 109 unique teams. [12:15.640 --> 12:18.960] At this moment or let's say the last year, [12:18.960 --> 12:21.200] there's only 57 of them active. [12:21.200 --> 12:22.480] So people come and go. [12:22.480 --> 12:30.040] We've been as I said, we've been around for 27 years or 28 years. [12:30.040 --> 12:32.360] So yeah, some of the teams are not active, [12:32.360 --> 12:40.880] but we still have them there in case someone wants to come later and recreate the team. [12:40.880 --> 12:51.320] Now, one thing that we decided and I think it's very important is everything goes to a PO file. [12:51.320 --> 12:56.200] Translators are not necessarily technical people, [12:56.200 --> 13:00.240] so they need an easy way to contribute. [13:00.240 --> 13:02.400] We translate lots of things that I said before. [13:02.400 --> 13:04.440] We translate C++ code, [13:04.440 --> 13:05.920] we translate desktop files, [13:05.920 --> 13:06.960] we translate JSON files, [13:06.960 --> 13:07.560] upstream files, [13:07.560 --> 13:08.360] doc files, [13:08.360 --> 13:09.680] web pages, [13:09.680 --> 13:12.160] the Android application, [13:12.160 --> 13:13.120] which is an Android application, [13:13.120 --> 13:17.680] and all of those do translations differently. [13:17.680 --> 13:19.120] So let me show an example. [13:19.120 --> 13:23.880] So C++ code, [13:23.880 --> 13:27.360] so the C++ code is the typical marker that [13:27.760 --> 13:31.520] Petter showed that the get-text marker uses only an underscore, [13:31.520 --> 13:33.680] but we decided to go with IATN, [13:33.680 --> 13:34.480] but it's the same thing. [13:34.480 --> 13:37.640] So you say we will translate this. [13:37.640 --> 13:41.320] It's similar. Now, for reasons, [13:41.320 --> 13:43.800] we also have support the Qt translation system, [13:43.800 --> 13:46.680] which is very similar, Qt translation, fair enough. [13:46.680 --> 13:52.160] But then we have desktop files. [13:52.560 --> 13:55.520] Also, it will be translated. [13:55.520 --> 13:58.800] So you have generic name and picture it. [13:58.800 --> 14:01.280] This needs to be translated and we don't want to, [14:01.280 --> 14:03.320] you see there's a translation here, [14:03.320 --> 14:06.160] we don't want the translator to have to do that. [14:06.160 --> 14:08.080] We don't have the translator to have to care [14:08.080 --> 14:10.840] about the specific syntax of this file. [14:10.840 --> 14:14.200] This is how all the translations here are auto-generated. [14:14.200 --> 14:18.800] They are injected later because it's very easy, [14:18.800 --> 14:21.840] but you can mess up relatively easy. [14:22.200 --> 14:25.600] You don't have to worry about the syntax. [14:25.600 --> 14:27.880] Same thing for the upstream files. [14:27.880 --> 14:29.520] The upstream files are something [14:29.520 --> 14:35.960] that software stores use for describing your application. [14:35.960 --> 14:40.120] So here you have a description of the app and you say description. [14:40.120 --> 14:44.160] Then you don't want the translator to have to worry, [14:44.160 --> 14:46.400] to come here, create a merge request [14:46.400 --> 14:50.040] against this file that it doesn't even know where the file is. [14:50.520 --> 14:54.160] Yeah, you have to know these syntax for XML lang. [14:54.160 --> 14:55.800] It's very complicated. [14:55.800 --> 14:57.680] That happens all the time. [14:57.680 --> 15:01.200] Docbook, we use docbook for translations. [15:01.200 --> 15:03.640] Yeah, I mean, if you're a developer, [15:03.640 --> 15:04.560] this seems very easy, [15:04.560 --> 15:08.800] like show this to someone that's not a geek and it will shout at you. [15:08.800 --> 15:10.480] This is not good. [15:10.480 --> 15:13.640] So we have a way for each of these formats, [15:13.640 --> 15:15.440] we extract that to a PO file, [15:15.440 --> 15:17.360] which at least it's not super useful, [15:17.480 --> 15:19.960] but it is a common format. [15:19.960 --> 15:24.720] More. This is like the KDE Connect for Android. [15:24.720 --> 15:28.840] For Android, you don't specify the translations in the code, [15:28.840 --> 15:30.120] you specify them on a file. [15:30.120 --> 15:33.240] So you would need to know that for these, [15:33.240 --> 15:34.560] the translation doesn't go here, [15:34.560 --> 15:36.200] you have to copy it to a different place. [15:36.200 --> 15:37.600] It's very annoying. [15:37.600 --> 15:44.680] So we decided we will have scripts that do [15:45.320 --> 15:50.520] the going from the origin, the source, [15:50.520 --> 15:54.000] whatever it's C++ or JSON or docbook or whatever, [15:54.000 --> 15:55.280] and we convert it to PO, [15:55.280 --> 15:57.000] and then we have the reverse one. [15:57.000 --> 15:59.040] So we have the one that once you have the PO, [15:59.040 --> 16:03.000] you have to bring it back to the source, [16:03.000 --> 16:05.440] because the Android application only understands about [16:05.440 --> 16:11.160] the Android world and it's things to be in Android. [16:11.160 --> 16:14.720] So one example of those scripts would be, [16:14.720 --> 16:17.320] this is the one that we use for Android. [16:17.320 --> 16:19.600] So we have one function in Bash that [16:19.600 --> 16:25.680] creates exports the template from the code, [16:25.680 --> 16:28.400] and then one that I will give you the PO file, [16:28.400 --> 16:30.280] and it will do the reverse. [16:30.280 --> 16:37.840] Okay. I'm going to spend one minute here, [16:37.840 --> 16:43.120] maybe not that much on the get text on steroids thing. [16:43.120 --> 16:45.760] Peter also mentioned before that there was [16:45.760 --> 16:48.160] this problem with when you want to substitute [16:48.160 --> 16:51.240] things on the grammar, on the grammar side, [16:51.240 --> 16:54.120] and that's because the person that [16:54.120 --> 16:57.480] made the decision to use English as a source language, [16:57.480 --> 16:59.360] that was the worst decision ever. [16:59.360 --> 17:01.960] English is a very simple language and you can [17:01.960 --> 17:04.400] use like concatenate all the strings and it will work, [17:04.400 --> 17:07.720] but any other language will be more complicated. [17:07.720 --> 17:11.680] For example, I had the terrible idea of making [17:11.680 --> 17:16.880] a game about guessing countries a few years ago. [17:17.200 --> 17:20.160] Terrible reason number one, [17:20.160 --> 17:24.000] I have gotten infinite emails about people complaining [17:24.000 --> 17:26.920] their country has two very few pixels on the map. [17:26.920 --> 17:28.880] It's like you don't know the number of [17:28.880 --> 17:30.320] Indians that complain that there's [17:30.320 --> 17:33.280] one pixel too much in Pakistan and the other way around, [17:33.280 --> 17:36.240] there's one too much pixel in Pakistan instead of India. [17:36.360 --> 17:39.920] Don't do things that are geography-based, bad idea. [17:40.200 --> 17:44.520] Second reason that was a problem is what [17:44.520 --> 17:47.200] the typical question my application that is, [17:47.200 --> 17:51.040] what is the capital of country, [17:51.040 --> 17:53.080] which works very well in English. [17:53.080 --> 17:56.480] You can substitute any country in there and it will work. [17:56.480 --> 18:01.400] But in French, the countries have gender and so you have to [18:01.400 --> 18:06.200] coordinate the of within the name of the language. [18:06.200 --> 18:10.760] So actually, K-18-N works very well for that. [18:10.760 --> 18:14.360] So we have a way that you can script translations. [18:14.360 --> 18:18.200] So you can say this country is [18:18.200 --> 18:21.040] feminine or masculine or whatever and [18:21.040 --> 18:25.360] then you can give two translations for the original string. [18:25.360 --> 18:28.360] So you can say if the language, [18:28.360 --> 18:31.520] if the word is form number one, [18:31.520 --> 18:35.440] use number one translation and if it's form number two, [18:35.440 --> 18:36.760] use number two translation. [18:36.760 --> 18:40.400] So immediately, you get all the combinations in [18:40.400 --> 18:43.040] much easier way than having to translate [18:43.040 --> 18:46.640] 600 times what is the capital of Spain, [18:46.640 --> 18:48.680] what is the capital of France. [18:48.680 --> 18:56.800] Not cool. Anyhow, that's a bit what I was describing before. [18:56.800 --> 19:02.260] So we have the code in C++ in this case. [19:02.300 --> 19:06.300] It needs to end up in a profile. [19:06.300 --> 19:08.020] So the translator translate it, [19:08.020 --> 19:10.260] they will translate it and eventually, [19:10.260 --> 19:12.660] we will want to bring it back to [19:12.660 --> 19:14.140] the original place where the code is. [19:14.140 --> 19:16.100] So if I just download the code, [19:16.100 --> 19:18.660] make install, everything works. [19:18.660 --> 19:21.300] I don't have to worry about where's the translations. [19:21.300 --> 19:22.300] I don't have translations anymore, [19:22.300 --> 19:24.540] but they told me there's 100 translations. [19:24.540 --> 19:26.140] No, not good. [19:26.140 --> 19:29.260] This process is done nightly. [19:29.260 --> 19:31.940] So that's done on a server. [19:32.940 --> 19:34.780] It takes a while. [19:34.780 --> 19:35.940] It doesn't take a lot of time. [19:35.940 --> 19:42.620] I checked. So we have the locks here, [19:42.620 --> 19:46.220] so that we'd run it for the three branches. [19:46.220 --> 19:48.780] It starts at one a.m. [19:48.780 --> 19:52.820] So it means that it takes one hour and a half [19:52.820 --> 19:55.780] for the development branch and then it [19:55.780 --> 19:58.300] takes one hour for the stable branch [19:58.300 --> 20:00.460] and the LTS branch is very small. [20:00.460 --> 20:02.540] So it only takes two minutes. [20:03.180 --> 20:05.820] But yeah, this is because we've [20:05.820 --> 20:07.900] spent a lot of time optimizing this thing. [20:07.900 --> 20:12.060] We made sure that we [20:12.060 --> 20:13.780] parallelize as much as we can. [20:13.780 --> 20:18.140] But still, we would like it not to take that much. [20:18.140 --> 20:21.020] Because sometimes, at the end of the day, [20:21.020 --> 20:23.580] it's like two hours of processing. [20:23.580 --> 20:28.860] So yeah. This is the same for everything. [20:28.860 --> 20:32.180] So basically, that's what I showed you before. [20:32.180 --> 20:37.340] The desktop file will go to a PO, [20:37.340 --> 20:38.540] the PO will be translated, [20:38.540 --> 20:40.580] and we will put it here. [20:40.580 --> 20:46.620] Now, what's the typical translator workflow? [20:46.620 --> 20:50.620] The typical translator workflow is not very modern. [20:50.620 --> 20:51.780] Let's put it this way. [20:51.780 --> 20:54.180] So we basically work with files. [20:54.220 --> 20:58.780] We use subversion, which is very old. [20:58.780 --> 21:01.180] So it's the thing I showed here. [21:01.180 --> 21:03.620] No, not here. What is it? [21:03.620 --> 21:06.060] Here. This is a subversion browser, [21:06.060 --> 21:09.180] but web browser, but you can do it from the command line. [21:09.180 --> 21:13.140] We use localize or any PO or text editor. [21:13.140 --> 21:15.460] We don't care about PO is a standard format. [21:15.460 --> 21:16.740] You can use whatever you want. [21:16.740 --> 21:19.100] So you basically use subversion to get the file [21:19.100 --> 21:20.740] and to put it back to subversion, [21:20.780 --> 21:24.620] localize or any PO editor to translate the file. [21:24.620 --> 21:26.220] Then we have something called [21:26.220 --> 21:28.340] apology, which is some kind of, [21:28.340 --> 21:30.220] if you're a developer, it's a linter. [21:30.220 --> 21:34.660] So it goes through the PO file and make sure [21:34.660 --> 21:37.660] it's well-formed knowing some more things. [21:37.660 --> 21:40.540] So if it realizes it's [21:40.540 --> 21:43.660] something that looks like XML, [21:43.660 --> 21:46.100] well, make sure that the opening and closing [21:46.100 --> 21:47.820] tags on the translation makes sense. [21:47.820 --> 21:50.540] So it not only make sure that [21:50.540 --> 21:55.260] the PO file is syntactically correct in [21:55.260 --> 21:57.700] its mother but on the translation itself. [21:57.700 --> 22:00.180] This works very well for our translators. [22:00.180 --> 22:02.020] Like our current translators are very [22:02.020 --> 22:04.300] happy about it because they're used to it. [22:04.300 --> 22:08.060] But it is true that when someone new comes and say, [22:08.060 --> 22:10.340] hey, this translation you had, [22:10.340 --> 22:11.700] that it's not translated anymore, [22:11.700 --> 22:13.620] I want to update it. [22:14.380 --> 22:17.860] Yeah, they get sometimes a bit of put by it. [22:17.860 --> 22:19.060] Like I have to tell them, yeah, [22:19.060 --> 22:21.700] you have to use this subversion tool, [22:21.700 --> 22:24.140] which if you're a developer, [22:24.140 --> 22:25.740] you know who to use Git and whatever, [22:25.740 --> 22:27.020] so subversion is very similar. [22:27.020 --> 22:28.780] But if you're a normal person, [22:28.780 --> 22:31.260] maybe you're not used to use the command line. [22:31.260 --> 22:33.180] Like you're telling me to use the command line now. [22:33.180 --> 22:34.140] I was like, I don't know. [22:34.140 --> 22:36.740] What's a server? [22:36.740 --> 22:42.140] So having some kind of web interface would be nice. [22:42.340 --> 22:45.100] We explored using web late and [22:45.100 --> 22:47.300] pontoon I think a few years ago. [22:47.300 --> 22:49.940] And the problem is that once you, [22:49.940 --> 22:51.020] for example, if you tried, [22:51.020 --> 22:52.460] at least when we tried, [22:52.460 --> 22:54.380] when you, if you use web late, [22:54.380 --> 22:55.500] you have to use web late. [22:55.500 --> 22:58.260] Like web late does all the managing from [22:58.260 --> 22:59.780] themselves and it has to be, [22:59.780 --> 23:01.340] things have to be their way. [23:01.340 --> 23:03.980] Like web late owns the file. [23:03.980 --> 23:06.780] And we want to own the file because we do all this magic. [23:06.780 --> 23:09.220] So we translate things here and put them there. [23:09.580 --> 23:14.140] So we didn't find something that worked for us. [23:14.140 --> 23:17.500] But it's still on our minds. [23:17.500 --> 23:19.740] We want to fix this eventually. [23:19.740 --> 23:22.740] Now, future work, [23:22.740 --> 23:24.700] we want more teams to be active. [23:24.700 --> 23:28.100] That is the perennial problem of open source. [23:28.100 --> 23:29.460] We want more contributors. [23:29.460 --> 23:31.660] Everyone wants more contributors. [23:31.660 --> 23:36.660] Our web page needs a rewrite and ideally, [23:36.940 --> 23:39.060] just throw it away and use something else. [23:39.060 --> 23:42.620] I'm going to show the web page to you now. [23:42.620 --> 23:44.740] That's our web page. [23:44.740 --> 23:48.820] It's HTML, somebody brought in 2000. [23:48.820 --> 23:52.900] And it's using like PHP 4 or 5, [23:52.900 --> 23:54.860] and it's just a hassle to support [23:54.860 --> 23:58.180] because you update the server and it doesn't work anymore. [24:00.220 --> 24:02.220] Yeah, I mean it works. [24:02.220 --> 24:05.060] So it lists all the teams and the translations, [24:05.180 --> 24:08.980] but it's just held by GAN at this point. [24:12.260 --> 24:16.100] At some point, we tried to steal the GNOME thingy [24:16.100 --> 24:19.060] because it looked good, but yeah, we got stuck somewhere. [24:19.060 --> 24:21.140] But we might do that. [24:22.460 --> 24:25.500] As I said, possibility of investigating [24:25.500 --> 24:27.340] a translation system, [24:27.340 --> 24:29.860] but without making the translator happy. [24:29.860 --> 24:32.020] Because one of the things everybody says is like, [24:32.020 --> 24:32.860] yeah, do that. [24:32.860 --> 24:35.500] And if the existence like translators get unhappy, [24:35.500 --> 24:38.820] they will use to it and use the web and whatever. [24:39.700 --> 24:41.900] Yeah, but what I don't want to do is, [24:41.900 --> 24:43.740] I mean, we have like, I don't know, [24:43.740 --> 24:45.860] hundreds of people using this workflow [24:45.860 --> 24:47.340] and they are happy with it, right? [24:47.340 --> 24:51.820] I don't want them to go away for a potential future [24:51.820 --> 24:54.540] new translator that might not appear, right? [24:54.540 --> 24:57.740] It's like, why do that? [24:57.740 --> 25:01.660] And we have to rewrite the pile of random scripts [25:01.660 --> 25:02.540] that we use, right? [25:02.540 --> 25:04.660] So I'm going to show them to you now. [25:04.660 --> 25:06.980] So this thing that runs nightly, [25:06.980 --> 25:10.460] this is a set of scripts and the problem [25:10.460 --> 25:12.460] with those sets of scripts is that, [25:12.460 --> 25:16.020] oops, sorry, they were written over 26 years [25:16.020 --> 25:18.940] by different people and we were not very [25:20.860 --> 25:23.300] well-mannered in creating scripts. [25:23.300 --> 25:28.300] So if I can figure out where it is, here, right? [25:28.380 --> 25:30.900] So this is a script, the script is the thing we call, [25:30.900 --> 25:34.900] but it has all our scripts to run that nightly thing. [25:34.900 --> 25:36.460] And you can see here, first thing, [25:36.460 --> 25:38.180] we have a C++ program, right? [25:38.180 --> 25:41.620] Good, don't write scripts in C++, that's a good idea. [25:42.580 --> 25:47.180] So we have some bash, next one is Perl. [25:48.980 --> 25:51.420] Around here, you have some Python. [25:52.300 --> 25:54.380] And I think we had some Ruby at some point, [25:54.380 --> 25:57.940] but I didn't like it and I managed to remove the Ruby one, [25:58.580 --> 26:02.460] so yeah, this needs to go away, right? [26:02.460 --> 26:07.060] We have to decide whether we use Perl or Bash or Python [26:07.060 --> 26:08.620] or whatever, right? [26:08.620 --> 26:10.540] Even if we want to do it all in C++, [26:10.540 --> 26:12.580] at least half a single language [26:12.580 --> 26:14.300] because this is not manageable, right? [26:14.300 --> 26:16.300] There's too many crap in here, right? [26:16.300 --> 26:18.060] But the thing is like, [26:18.060 --> 26:19.980] this has been working for so long time, right? [26:19.980 --> 26:23.940] Like if you go to the history of this file, for example, [26:23.940 --> 26:27.860] like it got created in 1999, right? [26:27.860 --> 26:29.860] And it hasn't almost changed since then. [26:29.860 --> 26:34.580] So yeah, it's a bit of work. [26:36.700 --> 26:38.980] So yeah, that was almost it. [26:38.980 --> 26:40.300] Some interesting links. [26:41.780 --> 26:43.740] Elton and Katie Torg, which is our webpage [26:43.740 --> 26:46.260] that we have to rewrite, but it's still there. [26:46.260 --> 26:48.340] The mailing list for coordinating the teams, [26:48.340 --> 26:51.660] it's the second one, we have a matrix channel, [26:51.660 --> 26:53.500] which if you want to go and chat, [26:53.500 --> 26:54.340] that'd be good. [26:54.340 --> 26:57.020] If you want to see the pile of crappy scripts, [26:57.020 --> 26:58.540] it's a scripty one. [26:58.540 --> 27:02.060] If you're interested in the linter, that's apology. [27:02.060 --> 27:07.060] And if you just want to see the subversion structure, [27:07.380 --> 27:09.140] it's in Elton N. [27:09.140 --> 27:11.420] And with that, thank you a lot. [27:11.420 --> 27:13.500] I think I have like a few minutes for questions. [27:13.500 --> 27:14.340] Yeah, cool. [27:14.340 --> 27:15.780] So yeah, any question? [27:17.100 --> 27:17.940] Thank you. [27:17.940 --> 27:19.780] Thank you. [27:19.780 --> 27:21.980] Thank you, does the question there? [27:22.980 --> 27:27.660] Yeah, you are a larger localization project. [27:27.660 --> 27:31.300] Do you have any advice for newcomers, [27:31.300 --> 27:34.780] which modules you start working on first? [27:34.780 --> 27:36.620] And do you have some levels, [27:36.620 --> 27:41.620] because like 300,000 strings is a lot like that? [27:44.340 --> 27:49.340] A single person will not finish that in less than three years. [27:49.340 --> 27:51.740] Yeah, it works almost full time. [27:51.740 --> 27:54.620] So do we have some sort of levels? [27:56.100 --> 27:58.220] Yeah, let me repeat the question for the people watching online. [27:58.220 --> 28:02.180] So he asked if we have any recommendation [28:02.180 --> 28:03.380] of which model to start, [28:03.380 --> 28:07.900] and we've got some level of what we ship applications, [28:07.900 --> 28:09.220] translations or not. [28:09.220 --> 28:13.220] So we do not officially have any recommendation [28:13.220 --> 28:14.420] of which models to start, [28:14.420 --> 28:18.460] but it's not written, [28:18.460 --> 28:19.860] but I will tell you when you start. [28:19.860 --> 28:24.340] So what we recommend are some of the base libraries, [28:24.340 --> 28:26.260] because all the applications, [28:26.260 --> 28:27.260] like the file menu, [28:27.260 --> 28:29.580] it's the same file menu in all the applications. [28:29.580 --> 28:30.900] So start translating there, [28:30.900 --> 28:32.500] at least the file menu is related. [28:32.500 --> 28:34.060] This is one. [28:34.060 --> 28:35.980] And then we think the desktop, [28:35.980 --> 28:38.380] like the main parts of the desktop are the most important, [28:38.380 --> 28:40.500] like the menu and all that. [28:41.780 --> 28:42.780] About levels, [28:44.020 --> 28:45.740] I think it was better that mentioned [28:45.740 --> 28:48.500] that they only ship things over 80 percent. [28:48.500 --> 28:50.820] We had that at some point, [28:50.820 --> 28:52.740] then we decided we don't care. [28:52.740 --> 28:56.380] We will ship like anything is better than nothing. [28:56.380 --> 28:59.420] Like if you only know Hungarian, [28:59.420 --> 29:01.540] if there's 10 words in Hungarian, [29:01.540 --> 29:03.900] you might manage to do things. [29:03.900 --> 29:06.420] If there's zero, you will not do nothing. [29:06.420 --> 29:11.460] So nowadays we're shipping all the translations that there are. [29:11.460 --> 29:14.500] If you switch to Hungarian and there's only, [29:14.500 --> 29:16.260] I mean, Hungarian is more translated. [29:16.260 --> 29:17.300] This is an example. [29:17.300 --> 29:20.260] But if you choose a language, [29:20.260 --> 29:22.140] this is only 10 things translated, [29:22.140 --> 29:25.260] well, it might actually encourage you to help. [29:25.260 --> 29:27.180] It's like, oh, there's something in it, [29:27.180 --> 29:28.820] so we don't have levels. [29:28.820 --> 29:30.180] I don't know if it's a good idea or not, [29:30.180 --> 29:33.460] but that's our current status quo. [29:34.460 --> 29:35.460] Yes? [29:35.460 --> 29:40.100] I thought I have your plans to integrate [29:40.100 --> 29:44.140] the things like re-translate so it's healthy. [29:44.140 --> 29:45.900] Right. So the question was, [29:45.900 --> 29:48.900] because I have a strong belief that this point [29:48.900 --> 29:50.900] should be a lot more complicated. [29:50.900 --> 29:55.820] If we have thought of integrating liberal translate, [29:55.820 --> 30:00.900] honestly, I didn't know liberal translate existed until three hours ago. [30:01.900 --> 30:07.580] No, but we will probably think it tomorrow. [30:07.580 --> 30:08.660] Yeah, it's a good idea. [30:08.660 --> 30:11.380] So for those that knew that we're not here at [30:11.380 --> 30:14.420] the first talk on the afternoon, [30:14.420 --> 30:18.020] liberal translate is like Google Translate but free. [30:18.020 --> 30:21.260] Basically, that's the definition and it works pretty well. [30:21.260 --> 30:24.460] So yeah, as a way of bootstrapping languages, [30:24.460 --> 30:29.740] I mean, it's probably not good to ship it without any supervision, [30:29.740 --> 30:32.460] but at least as a way to bootstrap languages, [30:32.460 --> 30:35.220] it might work. Yeah, it's something worth exploring. [30:35.220 --> 30:36.220] Yeah. [30:36.220 --> 30:43.140] So is the library on mutual get-text or do you go all this [30:43.140 --> 30:47.060] to keep as its own system or is it used both? [30:47.060 --> 30:48.980] So we use both. [30:48.980 --> 30:52.260] So we try to use ourself, [30:52.260 --> 30:53.500] which is based like ours, [30:53.500 --> 30:54.980] which is based on get-text. [30:54.980 --> 30:58.740] The problem is that we have a tiring level [30:58.740 --> 31:02.660] for our libraries and we can't [31:02.660 --> 31:04.900] have one library depend on the other. [31:04.900 --> 31:09.660] So the base layer of libraries uses the Qt translation system, [31:09.660 --> 31:13.500] and then everything above that uses the one in get-text. [31:13.500 --> 31:16.500] So we mainly use the get-text one. [31:16.700 --> 31:18.380] I don't know. [31:18.380 --> 31:20.660] Is that a library on the get-text? [31:20.660 --> 31:22.420] It's a library that drops get-text and [31:22.420 --> 31:24.620] adds that functionality I mentioned before of [31:24.620 --> 31:27.220] doing the combinatorial thingy. [31:27.500 --> 31:28.660] One more question over there. [31:28.660 --> 31:32.740] That's not a question of just like you asked about [31:32.740 --> 31:37.220] whether automated translation system, [31:37.220 --> 31:41.620] some teams in KDE are already using that. [31:41.620 --> 31:42.620] Okay. [31:42.620 --> 31:45.940] I'm not sure whether they use particularly with that, [31:45.940 --> 31:47.220] but there are, for example, [31:47.220 --> 31:51.100] the Bulgarian team has a person called Wincham. [31:51.100 --> 31:53.500] He's doing exactly that, [31:54.500 --> 31:59.820] trying to automate translation system. [31:59.820 --> 32:04.900] Cool. I think we're out of time. [32:04.900 --> 32:05.980] Yeah. Okay. Thank you. [32:05.980 --> 32:07.180] Thank you.