Thank you everyone for being here.
Hi everyone.
Thanks for joining me today.
My name is Stan...islas Signoud, but call me Stan.
I'm also called Signez on the internet.
So it's pronounced like this, but of course,
nobody besides language nerds know how to pronounce those letters.
So you can simply remember…
"see", "knee", "hey !",
and you correctly pronounce it.
But call me Stan, it's easier and nobody cares.
My internet handle or my AT protocol nickname is @signez.fr,
and I'm Signez everywhere else.
And there are a lot of, you know, key facts about me, but honestly,
everything that you will see on this slide doesn't matter because…
I'm French, and this is the main thing
that you will have to remember about me here.
And that is also why I won't do so many…
that much of eye contact, because I will have to
follow my notes because it's a very dense presentation.
I will try to, you know, respect the timing.
And also, I have a weird accent, you may have noticed that,
and I will be talking a lot about French from France,
which is fr-FR. For real, for real.
And that is key because I'm sorry for all the Québécois,
and also the Belgium and Switzerland guys,
and also all the people from Africa that speak French.
There are a lot of people over there.
I will not focus about that because I had to crunch it down to only 25…
30… 35 minutes.
So let's go on.
I'm here because I'm one of the main volunteer translators of Bluesky's UI in French.
Everything on the website, besides user-generated content, of course, is translated in French.
And that's partly because of my volunteer job that I do early in the morning before taking my croissant…
as a breakfast at my favorite boulangerie, and that is not a joke. I actually do that.
So maybe you are thinking right now that what I do is practically this:
Taking Bluesky's source code, translating strings, and ta-da! Bluesky is available in French.
Surprise, that's not that simple.
I've encountered a lot of little problems, a bunch of anecdotes that
can actually help you design better products (I think)
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.
So here is our roadmap for today.
And as you can see, I've used some examples of real cases that I've faced, besides the joke at the beginning.
And each time we'll get back to this roadmap, you will learn something that will replace those cases.
So let's start with the first one.
It's not "poster", as a poster, it's "Poster",
the verb.
So here is the UI of Bluesky with an equivalent of the example.com situation, a Jerry post.
And as you may notice on the top of the screen, there is a header
that says Post, because what you are looking at is a post.
Signage is sometimes redundant, but it's useful to know.
And let's say that this very funny post inspired me to write another funny post.
So I boot up the— open up the post composer, and look here on the top right corner:
a Post button.
Of course, in this context, you know that it's not some header, it's just a button.
And "Post" is written here because we write infinitive forms of verbs on top of buttons.
Or maybe it's imperative form? yeah, you say Post! Yeah, to make it obvious, whatever.
So, to recap, in English (US), you have those two "Post",
but it doesn't actually mean the same [thing].
Well, broadly the same, but they are not the same.
One is a verb, one is a noun.
Let's say that I want to translate that in French.
Now, I think that you are… see what's coming.
So I want to change this to "Poster", which is the French for to post.
So I open up Crowdin,
and I can see this. Of course, it's a very simplified version.
Oh, there is "Post".
So I will change it to "Poster".
When I get back, oh, perfect, "Poster".
But you may have deduced this yourself:
Here is "Poster", and that doesn't make any sense.
So something is broken, and to explain why this is happening, I have to talk about internationalization.
By the way, did you ever notice that there were 18 characters?
That's why we write it like that everywhere.
Actually, a lot of people don't know that, and it's a weird way of doing an acronym, but yeah.
There are two main ways
of organizing strings, translations.
In a project, you can either decide of 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.
And then internationalization libraries check out if there are any translations for those words in the translation file and swap those.
But you have also another strategy, that is the Hierarchical identifiers, you got it.
And basically you treat all the words shown on the screen as external data that you reference using symbolic keys like those.
The benefit of this approach is that those identifiers are clearer for translators because we have context.
And you can edit the text shown to users even in your own language.
So if you want to change what we also call microcopy, the words that you use for the users,
even in English, you can do so without changing the source code, which is something kinda nice.
And it's also cool because, in a way, English is just another language.
It's not the reference language. So that's a cool way to do that.
But Bluesky chose the former.
And honestly, I do understand that because, let's be honest, most English-speaking developers
just want to iterate very quickly and they just slap the translation after the fact.
And so, yeah, they chose the first strategy.
And it's very common and, honestly, it works.
So, and this is one of the *two* slides with code on it.
We just slap the Trans tag into that.
And like lives, this Trans tag matters a lot.
It's a way for the internationalization library to do its job and go fetch the actual translation
for that string here, "Post".
So now that you know a little bit more about internationalization, how can we fix this problem?
Well, actually, it's quite simple.
And even if we have to [change] something in the source code,
of course, we just have to add context tags.
basically attaching some context to each of these strings.
The first one is basically a standalone noun, the second one, an action verb.
And in the code (here is the second slide), we simply have
to add context="description", because post is a description of the thing, not an action.
As soon as we do that, the localization catalog updates,
and we have two separate entries.
And I can simply translate the second one and then the first one.
And ta-da! Everything is translated correctly.
Success.
So the thing that I want you to remember for this first example is: Context is everything.
Something that we know, but it's important to say again.
And you have to be ready to hear the demands of your translators to add context tags if you use the first strategy.
If you use the second, normally, you shouldn't have to do that, because it's already in the identifier.
And to their credit, the Bluesky team always accepted our pull requests very quickly to add context tags.
So that's awesome.
And I thank them for that.
So context is everything.
Let's get to the next one, Abonné·e·s, with those weird points.
And you will understand why there are weird dots.
But first, let me tell you a story
that starts with a GitHub issue.
This GitHub issue created by fenarinarsa is quite simple:
Make the French translation gender-neutral,
as they said: the current translation does not follow the current recommendations
for non-sexist and more inclusive French forms.
To explain what he's talking about, I have to explain a few things about French.
So please bear with me while I will try to offer you some French 101 lesson, and now you understand why it may take a long time.
This! is a hat.
In French, we would translate it as "un chapeau".
This is a tulip.
In French,
une tulipe.
UNE tulipe.
Yeah. Did you notice?
Une tulipe.
It's a feminine word.
In French, everything is gendered, 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.
So some examples of gendered things, so you understand the mess that it can become:
This is a chair.
It's feminine,
une chaise.
This is a seat.
It's masculine, un siège.
This is a shoe.
It's feminine, une chaussure !
This is a finger.
It's masculine, [c'est un doigt.]
But it gets even weirder because: here is Canada.
It's masculine for some reason!
But here is Poland.
It's feminine for some reason!
Strength…
is feminine: la force.
Love…
is masculine: un amour (oulalah).
When I say nearly everything, really I mean it.
So, gendering is not optional.
This is a key thing that you have to remember.
If you say "un tulipe" inside a sentence,
and you are not a beginner or a tourist,
that means that we haven't switched to in the *quirks mode*,
that we will do some extra mile or you know, 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.
It's like a checksum or a CRC.
So that's not the end of it.
Here is a big hat…
"un grand chapeau".
Here is a big tulip…
"une grandE tulipe".
In French, we do an accord, this.
That means that we do change the form of the adjectives that comes with the noun.
By the way, I learned that it was called a concord in English, but nobody says that, so we don't care.
Here are two tulips.
Actually, you do an accord in English, but only for the noun.
And we do it, of course, in French.
Here [are] two big tulips.
So, of course: deux grandes tulipes.
Both gender and number are used in this accord.
And it also works with people.
And so we talked a lot about gender of stuff, but of course gender of people also affects the language.
Here, an old man... "un vieil homme".
Two old men... Oh, did you notice?
You also do an accord... with a weird form...
It's not only about other languages. Deux vieux hommes.
Two old women... deux vieilles femmes.
Now that you have all that in mind,
Let's take a more complex example so you understand the problem that is coming.
Here is a detective.
In French, we can translate that to "un inspecteur".
And the gender is visible because it's "UN" inspecteur, because
if it was a female detective, it would be "une inspectrice".
As you can see, "une" changed, but also "inspectrice".
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.
But actually, it's not the actual problem that I'm talking about right now.
But of course, it happens. It also happens.
When you have two detectives, a duo of detectives, one male detective and a female detective,
together we call them two detectives.
Which gender should we use in French for this group?
Well, you will have to use the masculine form.
Deux inspecteurs.
I know.
But here's a team with five detectives and four of them are female detectives.
How should we translate five detectives in this case?
Masculine again.
Cinq inspecteurs.
This comes from an old rule we even learned in school.
Le masculin l'emporte.
The masculine takes it all.
As soon as there is one noun, subject, or part of a group that is masculine,
we should use the masculine [form] for the whole group.
And let me be honest, this rule sucks.
People try to reason about it, saying that in French, masculine is a neutral form, but it's a cop out.
Always gendering in masculine,
in the masculine form (sorry), blocks some young women from projecting themselves into whole domains,
can make them feel non-represented, and moreover, that's just unfair in a lot of ways.
So!
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.
Basically, it's just voluntarily using some words, pieces of sentences and tricks
to make sure that we stop excluding women from the language.
So here are the two main strategies that we can use to implement écriture inclusive:
either write both masculine and feminine forms every time,
in whatever order, by the way,
or merge both forms into the same word like this.
And to do that, you use some point médian,
which are basically interpunct, but nobody says that, even in English,
which are basically dots that you place in the middle of the vertical height of the line.
Of course, we could use parentheses,
but then you put 50% of the population inside parentheses.
And so, yeah, that's weird, so we tend not to do that.
É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 an easy and efficient way to make it clear that you wanted the situation improving,
showing that you cared about the subject of gender inclusivity.
But then,
after a few years, I'd say five or six years of widespread usage,
Some right-wing people started to ask themselves, you know, this whole "écriture inclusive" thing...
isn't this woke?
They focused a lot on those point médian forms.
They called it something ugly, weird, decadent, or whatever,
and basically created an equal sign between using the point médian and being woke.
It was bullshit, you know.
But it's not like that kind of stuff would stop them.
It's a perfect scapegoat for them.
So, of course, they started coming to the Bluesky repository
complaining about using politically sided language,
just because we followed a somewhat common new practice of caring about inclusivity.
So from there, what should we do?
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 writing both the feminine and masculine forms.
Then if and only if we have very little room for the translated version,
then as a last resort, using point médian short form,
and it's what we did for Abonné·e·s, by the way, the example,
the title example that I used.
But we have some trick up our sleeves to make it better.
And to be fair, I lied to you, I'm sorry, by omission, I'd say.
What if there were words that shared the same form in both gender[s]?
That's why I used detective as an example.
A detective can also be translated in French as
"un détective"!
And a female detective as
"une détective"!
Perfect.
Those words that can be written the same in both masculine and feminine form are called "épicène" words.
And they're awesome for us because they basically solve the problem in a very nice way.
However, they don't always exist.
There are not always synonyms that have this property of being épicène,
including Abonné·e·s, by the way, that's why I have to use that.
So, to recap, going forward, when I face this kind of puzzle in my translation work,
my policy is to try to find an épicène word,
and if I can't find one, then to use the expanded version with both masculine and feminine form,
and then, and only when space is missing, as a last resort,
using the point médian.
And here we have it.
And by the way, as a conclusion for this part, here is what Dan Abramov,
at that time part of the Bluesky team, posted before closing
that pull request that wanted to revert the work
that we did on gender neutral language.
It was very validating to see part of the Bluesky 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 moreover the pragmatic approach I tried to follow.
So thank you again Dan and the Bluesky team for your support.
Builders, please support your translators if you agree with their choices!
Let's get to the fourth point, and we have some short time to go on, so it's going way easier now.
Well not easier, but quicker to understand.
So this: "Traduit (langue d'origine : anglais)"
A very quick, only one slide, short French 102 lesson.
I reassure you.
It's very, very quick.
This is THE cat.
It's THE cat.
You would agree, I think: it's beautiful.
And in French, we would say le chat.
And this is the tree; it's such a beautiful tree.
It's THE tree.
And we would say...
l'arbre,
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.
Élision is not optional.
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.
So like a checksum again.
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.
We are used to software not doing the élision stuff
because it's hard to do it properly.
There are some letters that only trigger the élision in some cases.
The "H aspiré", if you know French.
And there are a lot of hardcoded exceptions in the language too.
So yeah, we love exceptions in French.
So because of that internationalization libraries just don't care.
There is no standard way of doing it, like with plurals or genders.
So yeah, it's perceived as too hard and it's not done.
So what can we do?
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.
So we can't do "Traduit depuis le anglais" because it will sound like that.
And we can't do "Traduit depuis anglais" either.
So we have to do workarounds.
Like "Traduit (original en anglais)", literally "translated (originally in English)".
Because "en" doesn't trigger this élision stuff, so we don't care, it works.
Actually, I didn't use that one, but an even clearer one, because in that context it could be a little bit complex.
So I used "Traduit (langue originale : anglais)", "translated (source language: English)".
Fun fact, from this morning, it's an exclusive.
I wanted to make sure that I quoted my translation correctly, and this morning I tried to find it in Crowdin.
And no, there weren't any translation about that.
So I took my phone, got one of my English shitposts from a day ago,
hit Translate, and yeah, in the meantime, Eric,
one of the designers of Bluesky, changed actually the whole design,
and this string doesn't exist anymore.
There's a nice arrow that conveys the message even easier over there.
Better: sometimes design can solve this kind of thing.
But honestly, I prefer this anyway.
So it's a good ending in my books.
Sometimes there are no perfect solutions, only workarounds.
This is the key thing that I want you to remember.
We try to do our best.
But sometimes, yeah,
we do what we can do.
OK. My last point is about Following, Discover, For You, etc.
Here is the UI in French, so I will dim out all the user-generated content.
So you can see that nearly everything is translated in French.
*Nearly* everything is translated in French...
but not those.
Why?
Well, because feed names are not part of our language catalog.
You could say, oh, but feed names are user-generated.
Yeah, but you may have noticed that I said before
(well, 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.
So it's weird that they are not translated.
We can't translate those names ahead of time.
And we could use some hacks to find and replace the most popular ones.
That's something that actually there is an open pull request from surfdude29 to do exactly that.
But it's not a very future-proof way of fixing this problem in my opinion.
So how should we proceed?
Well, I don't know.
No, honestly, I don't know.
Please, dear AT Proto nerds, this is a mission I give you, your homework.
Please figure this out.
We have to figure out a solution to do that.
Actually, we were able to do that with labels, moderation labels.
I've just learned that from Trazy from Cartridge that explained that to me yesterday.
But it wasn't done for feed names.
It's so frustrating because they are a very prominent part of the UI for good reasons.
It's a very good feature.
And yeah, it's very frustrating that it's not translatable right now.
So here we have it.
Context is everything.
Support genders and translators.
Workarounds may be required.
User content should be translatable as soon as they are not perceived as user content.
Is that it?
No! Of course not. It's not the end of it.
Translating stuff is only a small part of the equation.
You should think about localization holistically.
Because as an integrated experience, language and region-specific stuff are everywhere.
And again, we don't expect you to figure it out from day one or to figure it out by yourself.
You can't know everything.
But every f*** given will provide tremendous value to users around the world.
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.
Community guidelines are not translated right now for Bluesky.
It's kind of weird in a way that we expect users to respect rules they can't even read.
Trending topics are not localized, and one key message that I want to give you is:
We don't care about the NFL!
Stop trying to tell us about the NFL.
We don't care.
It's just a weird thing.
You don't even use "football" correctly.
And also, blog posts and help pages are not translated right now.
Discover feed algorithms
(Nightheaven did a great leaflet about that)
are not localized, so you will encounter a lot of content that is not in your language.
And you can... there are some allowlist systems that are in place
that are not very... that's a hack, not a proper localization.
And, of course, announcements.
Right now, Bluesky do not do announcements in any other language than
Japanese and English. And that's it. That's weird.
But we talked a little bit about that in the previous panel.
And here we are.
Thank you for listening!
*timid claps*
To see my work in action, *actual claps* thanks. *claps continues*
As a guy said at some point, "please clap".
To see my work in action, you can just
go to the settings and change the language to French.
I also want to thank surfdude29 because this guy
simply is an informal translation manager for
the whole Bluesky open source project.
He does it in his spare time.
And that's awesome that he does that.
And also thanks to Pipomantis that helped me figure out some stuff on those slides.
And of course a big shout out to all the other fellow translators.
I hope that I didn't say anything weird about your work, too.
And as The Stanley Parable says, the end is never the end.
It's never the end about all the things related to translation.
Do you have any questions? Do we have time for questions?
Oh, there is no time— ah… sorry.
We are a little bit behind schedule, but thank you so much…
And feel free to follow me to [learn] more about that.
Thanks.
Thank you so much, Stan! *claps*