Stream: t-compiler/wg-diagnostics

Topic: Internationalization


Manish Goregaokar (Jun 08 2019 at 03:05, on Zulip):

Started a thread on internationalization in https://internals.rust-lang.org/t/translating-the-compiler/10376 , thought y'all would be interested

Manish Goregaokar (Jun 08 2019 at 17:26, on Zulip):

@Esteban Küber i don't understand what you mean when you say our diagnostics system isn't ready for this

Manish Goregaokar (Jun 08 2019 at 17:27, on Zulip):

This wouldn't even be plumbed through diagnostics in the first place, this is _largely_ just changing the strings that get fed to diagnostics

Esteban Küber (Jun 08 2019 at 17:29, on Zulip):

We do a lot of string tweaking by hand. We would need to stop doing that

Esteban Küber (Jun 08 2019 at 17:29, on Zulip):

Not only with plural handling but also combining substrings all over the place

Esteban Küber (Jun 08 2019 at 17:30, on Zulip):

Q

Esteban Küber (Jun 08 2019 at 17:31, on Zulip):

I'm not opposed to the idea, I just think that keeping the high quality of errors, improving existing errors and keeping them translation friendly will be a lot of work

Esteban Küber (Jun 08 2019 at 17:31, on Zulip):

For which we don't have the manpower today

Esteban Küber (Jun 08 2019 at 17:33, on Zulip):

But there are some things that can be done in the meantime (glossary, extending error codes, cleaning up logic) that will be improvements even we don't start translating rustc yet

Tom Phinney (Jun 08 2019 at 20:17, on Zulip):

Not only with plural handling but also combining substrings all over the place
We do a lot of string tweaking by hand.

@Manish Goregaokar This is part of what I saw a year ago when I looked at how difficult it would be to translate rustc's generated messages to a wide set of other languages (particularly non-European ones).

Manish Goregaokar (Jun 08 2019 at 20:20, on Zulip):

@Esteban Küber @Tom Phinney fluent has good support for doing this kind of thing, though

Manish Goregaokar (Jun 08 2019 at 20:21, on Zulip):

Again, it's precisely designed for this kind of thing

Manish Goregaokar (Jun 08 2019 at 20:22, on Zulip):

Fluent totally does substring combination and selection

Manish Goregaokar (Jun 08 2019 at 20:22, on Zulip):

Variables are quite powerful

Manish Goregaokar (Jun 08 2019 at 20:23, on Zulip):

@Tom Phinney this is super tricky to do in a format! based system but fluent is better

Tom Phinney (Jun 08 2019 at 20:23, on Zulip):

@Manish Goregaokar For plurals, nominative vs genitive vs accusative case (in Roman languages), etc. I think @Esteban Küber 's concern is that there's a lot of ad hoc string assembly that would have to be rationalized in a way that removes English-language dependence.

Manish Goregaokar (Jun 08 2019 at 20:23, on Zulip):

You can do casing

centril (Jun 08 2019 at 20:23, on Zulip):

@Esteban Küber @Manish Goregaokar So perhaps we can start with the places that have mostly string literals that are not formatted at all but just .to_string()ed

Manish Goregaokar (Jun 08 2019 at 20:24, on Zulip):

I don't think we need to

Manish Goregaokar (Jun 08 2019 at 20:24, on Zulip):

Bt

Manish Goregaokar (Jun 08 2019 at 20:24, on Zulip):

Brb

centril (Jun 08 2019 at 20:25, on Zulip):

wg-diagnostics has a plan to move diagnostics out of the happy path and more into structs that can be rendered

centril (Jun 08 2019 at 20:25, on Zulip):

it seems to me that after you've moved something into a struct, there should be no strings in the happy path, and so you can internationalize the renderer

Manish Goregaokar (Jun 08 2019 at 20:26, on Zulip):

Okay so

Manish Goregaokar (Jun 08 2019 at 20:26, on Zulip):

Arbitrary substringing/etc is something Fluent does quite well. The main concern is that these cases may not be as parallelizeable

Manish Goregaokar (Jun 08 2019 at 20:27, on Zulip):

like, if we get a bunch of people converting things to translation strings, they may not know how to do these. which is fine. it's not hard to document and teach, but even without that it's fine

Tom Phinney (Jun 08 2019 at 20:27, on Zulip):

I don't recall any real "blockers" in what I saw in rustc's code when I examined it a year ago, but it will take more time than simply reworking message text with argument insertion, which Fluent and Pontoon seem to actually handle quite well.

Manish Goregaokar (Jun 08 2019 at 20:27, on Zulip):

renderable structs would be nice, like that's basically a 1:1 mapping to a fluent id + variables

Manish Goregaokar (Jun 08 2019 at 20:28, on Zulip):

@Tom Phinney I'm not sure what you mean

centril (Jun 08 2019 at 20:28, on Zulip):

@Manish Goregaokar there's https://github.com/rust-lang/rust/issues/51528 if you haven't seen that issue yet.

Manish Goregaokar (Jun 08 2019 at 20:28, on Zulip):

it doesn't have to be _just_ argument insertion. you can do argument selection too

centril (Jun 08 2019 at 20:28, on Zulip):

@Manish Goregaokar one thing that might make sense is to focus on a small subset of errors somewhere in the compiler to get a feeling for it

centril (Jun 08 2019 at 20:28, on Zulip):

and to get the interface in place

Manish Goregaokar (Jun 08 2019 at 20:28, on Zulip):

sure

centril (Jun 08 2019 at 20:28, on Zulip):

e.g. the traits needed and whatnot

Manish Goregaokar (Jun 08 2019 at 20:28, on Zulip):

that's kind of ... the plan?

centril (Jun 08 2019 at 20:29, on Zulip):

@Manish Goregaokar :P

Manish Goregaokar (Jun 08 2019 at 20:29, on Zulip):

i feel like people are assuming i want to do this all at once?

centril (Jun 08 2019 at 20:29, on Zulip):

@Manish Goregaokar no

centril (Jun 08 2019 at 20:29, on Zulip):

but I think perhaps it would be best to not be incremental at the start

Manish Goregaokar (Jun 08 2019 at 20:29, on Zulip):

like, of course we need to get the framework set up first. and then get translation strings in, slowly, growing the framework where necessary

Manish Goregaokar (Jun 08 2019 at 20:29, on Zulip):

what do you mean?

centril (Jun 08 2019 at 20:30, on Zulip):

just do a small bit and figure out the framework, and then stop; don't do more for a while

centril (Jun 08 2019 at 20:30, on Zulip):

and then figure out how this meshes with wg-diagnostics's plan to have error structs

Manish Goregaokar (Jun 08 2019 at 20:30, on Zulip):

that's not "not be incremental" means :)

Esteban Küber (Jun 08 2019 at 20:30, on Zulip):

I think the thing I jumped at is, it's gonna be a lot of work and it will cause churn. The intermediate steps are gonna be ugly, but it's something we need to do.

Manish Goregaokar (Jun 08 2019 at 20:30, on Zulip):

I don't think the intermediate steps will be ugly?

Manish Goregaokar (Jun 08 2019 at 20:30, on Zulip):

It's pretty smooth to migrate

Esteban Küber (Jun 08 2019 at 20:31, on Zulip):

Once we have error structs it'll be much more easy, but it is a bigger undertaking than I originally expected

Manish Goregaokar (Jun 08 2019 at 20:31, on Zulip):

once you replace a string with a text!() invocation (or whatever), that's it.

Manish Goregaokar (Jun 08 2019 at 20:31, on Zulip):

oh, for error structs

centril (Jun 08 2019 at 20:31, on Zulip):

@Esteban Küber Yes, do you realize now how much technical debt y'all have added? ;)

Manish Goregaokar (Jun 08 2019 at 20:31, on Zulip):

can you give examples of what you mean by the error struct?

Manish Goregaokar (Jun 08 2019 at 20:31, on Zulip):

is it something like

centril (Jun 08 2019 at 20:32, on Zulip):

@Manish Goregaokar like so: https://github.com/rust-lang/rust/issues/61132

Manish Goregaokar (Jun 08 2019 at 20:32, on Zulip):

MoveOutOfBorrowError {
original: Span,
new: Span,
ty: Ty,
// some other crap
}

Esteban Küber (Jun 08 2019 at 20:32, on Zulip):

Yes

Manish Goregaokar (Jun 08 2019 at 20:32, on Zulip):

got it

Manish Goregaokar (Jun 08 2019 at 20:32, on Zulip):

okay so

Manish Goregaokar (Jun 08 2019 at 20:32, on Zulip):

this is good, actually

Esteban Küber (Jun 08 2019 at 20:32, on Zulip):

All encompassing every variable that would affect output

Manish Goregaokar (Jun 08 2019 at 20:33, on Zulip):

this makes stuff much nicer!

Manish Goregaokar (Jun 08 2019 at 20:33, on Zulip):

we can transition to error structs, and in the process transition to fluent

Esteban Küber (Jun 08 2019 at 20:33, on Zulip):

@centril actually the part I'm struggling with is some borrow errors that have different codes but are fundamentally the same thing :smile:

oli (Jun 08 2019 at 20:33, on Zulip):

yea, I think we can bootstrap all of these changes simultaneously

Manish Goregaokar (Jun 08 2019 at 20:33, on Zulip):

in an independent way, e.g. you can move something to an error struct, and you can _also_ move that error struct to Fluent if you _want_, but you don't have to

Esteban Küber (Jun 08 2019 at 20:34, on Zulip):

Yep

Esteban Küber (Jun 08 2019 at 20:34, on Zulip):

That sounds good to me

oli (Jun 08 2019 at 20:34, on Zulip):

might even move some parts to struct reporting just for fluent, others just for annotate-rs

Manish Goregaokar (Jun 08 2019 at 20:34, on Zulip):

as in?

oli (Jun 08 2019 at 20:34, on Zulip):

whatever contributors focus on. and at some point we'll have everything moved

centril (Jun 08 2019 at 20:34, on Zulip):

Right; this sounds good... connecting fluent at once is probably a good idea because then you also figure out what sessions and context data need to be passed as well

oli (Jun 08 2019 at 20:34, on Zulip):

no like, there don't need to be conflicts of interest

Manish Goregaokar (Jun 08 2019 at 20:34, on Zulip):

I should attend the WG diagnostics meetings lol, I didn't notice this go by and this is kinda amazing

Manish Goregaokar (Jun 08 2019 at 20:35, on Zulip):

@centril i think fluent will largely work based off of globals so it's fine

Tom Phinney (Jun 08 2019 at 20:35, on Zulip):

It's just that it's a large effort to address all the different error processing sections of rustc. That's why a small starter sample, as @centril advises, is almost certainly the way to proceed.

centril (Jun 08 2019 at 20:35, on Zulip):

ouch.. globals... that is heartbreaking :slight_smile:

Manish Goregaokar (Jun 08 2019 at 20:35, on Zulip):

@Tom Phinney i don't think i ever suggested doing it all at once, people keep assumign that

Manish Goregaokar (Jun 08 2019 at 20:35, on Zulip):

of course it's going to be incremental

Manish Goregaokar (Jun 08 2019 at 20:36, on Zulip):

but I do believe it's _doable_

Manish Goregaokar (Jun 08 2019 at 20:36, on Zulip):

the concerns you were bringing up were that it's not

centril (Jun 08 2019 at 20:36, on Zulip):

I think Tom is just reaffirming what we're all saying ;)

Manish Goregaokar (Jun 08 2019 at 20:36, on Zulip):

@centril doesn't have to be globals, it's just easier with globals. we can stick stuff in Sess instead

centril (Jun 08 2019 at 20:36, on Zulip):

@Manish Goregaokar Using Sess seems preferable

Manish Goregaokar (Jun 08 2019 at 20:37, on Zulip):

Cool we'll do that

Tom Phinney (Jun 08 2019 at 20:37, on Zulip):

I've thought all along that it was doable and worth doing. It's just going to be a lot worse than making Fluent versions of error strings and their arguments.

centril (Jun 08 2019 at 20:37, on Zulip):
trait AsError {
    /// ParseSess, Session or `TyCtxt`
    type Session;
    fn to_error(self, session: Self::Session) -> DiagnosticBuilder;
    fn emit(self) {
        self.to_error().emit()
    }
}

@Manish Goregaokar this is even adapted to just that ^^

Manish Goregaokar (Jun 08 2019 at 20:37, on Zulip):

@Tom Phinney I don't know what you mean by that

Manish Goregaokar (Jun 08 2019 at 20:38, on Zulip):

@Tom Phinney i mean, the plumbing for this is obviously going to be a bunch of work

oli (Jun 08 2019 at 20:38, on Zulip):

the plumbing should be almost conflict free though

Manish Goregaokar (Jun 08 2019 at 20:38, on Zulip):

as in?

Manish Goregaokar (Jun 08 2019 at 20:38, on Zulip):

@centril yep!

oli (Jun 08 2019 at 20:38, on Zulip):

like no bitrot because it's all new stuff

Manish Goregaokar (Jun 08 2019 at 20:38, on Zulip):

that's why i suggested the session lol

Manish Goregaokar (Jun 08 2019 at 20:39, on Zulip):

yeah

centril (Jun 08 2019 at 20:39, on Zulip):

@Manish Goregaokar Could you summarize this informal mini-meeting in the roadmap issue?

Manish Goregaokar (Jun 08 2019 at 20:39, on Zulip):

so i think once we have some error structs, what i can do is start figuring out how best to add fluent to that.

Tom Phinney (Jun 08 2019 at 20:40, on Zulip):

@Manish Goregaokar There's a lot of detailed code path analysis and transforming that will be required. In many cases existing generation of error message fragments is intermixed with other code.

centril (Jun 08 2019 at 20:40, on Zulip):

yep; very good :+1:

Manish Goregaokar (Jun 08 2019 at 20:40, on Zulip):

@Tom Phinney as in?

Manish Goregaokar (Jun 08 2019 at 20:40, on Zulip):

oh, like the borrow errors where an entire sentence is split across spans

centril (Jun 08 2019 at 20:40, on Zulip):

@Tom Phinney I think this just means that there's a lot of diagnostics logic intermingled with the happy path

centril (Jun 08 2019 at 20:40, on Zulip):

that is a problem that we want to fix independent of internationalization

oli (Jun 08 2019 at 20:40, on Zulip):

@Tom Phinney we're trying to get rid of these anyway :laughing:

Manish Goregaokar (Jun 08 2019 at 20:41, on Zulip):

yep

oli (Jun 08 2019 at 20:41, on Zulip):

any fluent changes could at first focus on the easy ones

centril (Jun 08 2019 at 20:41, on Zulip):

@Manish Goregaokar hmm; I do think we might have some error structs somewhere in typeck/infer/coercions

centril (Jun 08 2019 at 20:41, on Zulip):

already, that is

oli (Jun 08 2019 at 20:41, on Zulip):

as @Manish Goregaokar said, once there are some structs, only do the fluent stuff for these

Tom Phinney (Jun 08 2019 at 20:42, on Zulip):

@centril is correct, both in the source of the complexity and the need to fix it (eventually). It's over a year since I looked at this task. WRT "As in?", now you're taxing my memory.

Manish Goregaokar (Jun 08 2019 at 20:42, on Zulip):

@Tom Phinney fwiw such split-sentence diagnostics are awkward _anyway_ in English. Fortunately all languages have recursion, so you can pretty much always construct a correct-but-awkward sentence that does this.

Manish Goregaokar (Jun 08 2019 at 20:43, on Zulip):

(recursion the linguistic concept)

centril (Jun 08 2019 at 20:43, on Zulip):

@Manish Goregaokar Finnish is even recursively enumerable :joy:

Manish Goregaokar (Jun 08 2019 at 20:43, on Zulip):

the ordering isn't dependent on the language, it's dependent on the way we wish to present the error

Manish Goregaokar (Jun 08 2019 at 20:44, on Zulip):

@centril I mean, i want to wait until we've got AsError being used :)

Manish Goregaokar (Jun 08 2019 at 20:44, on Zulip):

bc then i can just fuck with AsError

centril (Jun 08 2019 at 20:44, on Zulip):

Fair =)

Tom Phinney (Jun 08 2019 at 20:44, on Zulip):

It seems that we all agree this is a task worth doing, and that the needed restructuring will reduce some of rustc's technical debt. How do we start?

centril (Jun 08 2019 at 20:44, on Zulip):

@Tom Phinney right now there's an on-going cleanup effort in e.g. the parser

centril (Jun 08 2019 at 20:45, on Zulip):

we are moving some stuff to diagnostics.rs files and such

centril (Jun 08 2019 at 20:45, on Zulip):

you can join in to clean up the happy path

Manish Goregaokar (Jun 08 2019 at 20:45, on Zulip):

I think a cool design would basically be a #[derive(AsError)]

centril (Jun 08 2019 at 20:45, on Zulip):

but this WG is pretty new

Manish Goregaokar (Jun 08 2019 at 20:45, on Zulip):

this is useful anyway

Manish Goregaokar (Jun 08 2019 at 20:45, on Zulip):

but this is super easy to adapt to Fluent

Manish Goregaokar (Jun 08 2019 at 20:45, on Zulip):

uh

centril (Jun 08 2019 at 20:46, on Zulip):

@Manish Goregaokar yea that's very nice; probably you probably need some customizations for different phases of the compiler and the associated type for the session

Manish Goregaokar (Jun 08 2019 at 20:46, on Zulip):

argh too bad we don't have anonymous structs this derive would be more fun to write

centril (Jun 08 2019 at 20:46, on Zulip):

@Manish Goregaokar maybe a design inspired by snafu / failure?

centril (Jun 08 2019 at 20:47, on Zulip):

@Manish Goregaokar do you mean structural records?

Manish Goregaokar (Jun 08 2019 at 20:47, on Zulip):

yes

Manish Goregaokar (Jun 08 2019 at 20:47, on Zulip):

oh hold on i got it

centril (Jun 08 2019 at 20:48, on Zulip):

Shame-less plug: https://github.com/rust-lang/rfcs/pull/2584 =P

Manish Goregaokar (Jun 08 2019 at 20:48, on Zulip):
#[derive(AsError)]
#[error = "Cannot move out of borrow in {ty}", span]
#[note = "First borrwed here", other_span]
#[code = E12345]
struct MoveOutOfBorrowError {
    ty: Ty,
    span: Span,
    other_span: Span,
}
Manish Goregaokar (Jun 08 2019 at 20:48, on Zulip):

how does that look

Manish Goregaokar (Jun 08 2019 at 20:49, on Zulip):

if we have this, it becomes extremely simple to migrate to fluent

Manish Goregaokar (Jun 08 2019 at 20:49, on Zulip):

in fact, we can do most of it in an automated way

centril (Jun 08 2019 at 20:49, on Zulip):

@Manish Goregaokar hmm; but why are we baking the English strings into this? this is the pre-migrated version?

Manish Goregaokar (Jun 08 2019 at 20:49, on Zulip):

Yes

Manish Goregaokar (Jun 08 2019 at 20:49, on Zulip):

one step at a time

centril (Jun 08 2019 at 20:49, on Zulip):

Ah yes; this is very nice

Manish Goregaokar (Jun 08 2019 at 20:50, on Zulip):

migrating this to fluent is extremely simple, you write a script that finds these, extracts the strings, converts them to fluent's format, and replaces them with ids.

centril (Jun 08 2019 at 20:50, on Zulip):

more tricky if you got control flow in there but most errors don't have that

Manish Goregaokar (Jun 08 2019 at 20:51, on Zulip):
#[derive(AsError)]
#[fluent = "borrowck-move-out-of-borrow"]
#[error = 1, span]
#[note = 1, other_span]
struct MoveOutOfBorrowError {
    ty: Ty,
    span: Span,
    other_span: Span,
}

// borrowck.ftl
borrowck-move-out-of-borrow
    .error1 = Cannot move out of borrow in { $ty }
    .note1 = First borrowed here
Manish Goregaokar (Jun 08 2019 at 20:52, on Zulip):

Those would be manually impld anyway

Manish Goregaokar (Jun 08 2019 at 20:52, on Zulip):

though actually since fluent has selection support a lot of what would originally be a manual impl of AsError could become a derive in the fluent world

Manish Goregaokar (Jun 08 2019 at 20:53, on Zulip):

(I'm on the fence about doing borrowck-move-out-of-borrow.error1 vs borrowck-move-out-of-borrow-error1, I'd have to look at Pontoon's interface for the two. Also the numbering/whatever. We can figure that out later)

centril (Jun 08 2019 at 20:54, on Zulip):

Yeah this is neat; Are the #[note ..]s in sequence there? can you add more?

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

yes

centril (Jun 08 2019 at 20:54, on Zulip):

or does fluent control the order?

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

that's why i numbered it

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

so you can add a note2

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

the precise way you identify different notes will need to be figured out :)

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

numbering is one valid but ugly way to do it

centril (Jun 08 2019 at 20:54, on Zulip):

@Manish Goregaokar aah; I was thinking that the attribute order in Rust would be the order perhaps :P

Manish Goregaokar (Jun 08 2019 at 20:54, on Zulip):

_shrug_

Manish Goregaokar (Jun 08 2019 at 20:55, on Zulip):

so i18n best practices are to rename the key when things change, usually by adding a number, so numbering may not be great here

Manish Goregaokar (Jun 08 2019 at 20:55, on Zulip):

(this way tooling like Pontoon notices the change)

Manish Goregaokar (Jun 08 2019 at 20:55, on Zulip):

another way to do it is to write your own tooling that keeps a watch on the locales/en-US folder

Manish Goregaokar (Jun 08 2019 at 20:56, on Zulip):

that's not our problem now

Manish Goregaokar (Jun 08 2019 at 20:56, on Zulip):

okay, so I'll first jot down this custom derive design on the issue

Manish Goregaokar (Jun 08 2019 at 20:56, on Zulip):

@oli can you send me an invite to the diagnostics meetings?

oli (Jun 08 2019 at 20:56, on Zulip):

will do

Manish Goregaokar (Jun 08 2019 at 20:56, on Zulip):

thx

centril (Jun 08 2019 at 20:57, on Zulip):

@oli you should add wg-diagnostics to the t-compiler google calendar

oli (Jun 08 2019 at 20:57, on Zulip):

we don't have a regular meeting

centril (Jun 08 2019 at 20:57, on Zulip):

yeah but add them to the calendar when you have meetings

oli (Jun 08 2019 at 20:57, on Zulip):

ok

centril (Jun 08 2019 at 20:58, on Zulip):

its a great way to get an overview

centril (Jun 08 2019 at 20:58, on Zulip):

thanks

centril (Jun 08 2019 at 21:02, on Zulip):

@Manish Goregaokar one idea for the custom derive: If you leave out #[fluent = "$key"] then infer the $key by hyphenating the struct's name

Manish Goregaokar (Jun 08 2019 at 21:03, on Zulip):

nah, we'd need the explicit key in order to rename the key if things change

Manish Goregaokar (Jun 08 2019 at 21:03, on Zulip):

but the autogeneration could be done that way

Manish Goregaokar (Jun 08 2019 at 21:05, on Zulip):

i don't think we need to figure this out right now, but y'all _should_ figure out what the AsError custom derive should look like

Manish Goregaokar (Jun 08 2019 at 21:05, on Zulip):

it may be better to make it a rustc attribute, not custom derive

Manish Goregaokar (Jun 08 2019 at 21:06, on Zulip):

(that way we can give the derive some arguments itself, e.g. #[aserror(TyCtxt)] for different session levels)

centril (Jun 08 2019 at 21:07, on Zulip):

Seems like something you can provide via helper attributes to the derive?

Manish Goregaokar (Jun 08 2019 at 21:08, on Zulip):

yeah.

Manish Goregaokar (Jun 08 2019 at 21:08, on Zulip):

_shrug_

Manish Goregaokar (Jun 08 2019 at 21:08, on Zulip):

y'all should pick a design for the custom derive

Manish Goregaokar (Jun 08 2019 at 21:09, on Zulip):

i don't have much of an opinion, i'll make sure whatever y'all pick is compatible with moving to fluent later

centril (Jun 08 2019 at 21:21, on Zulip):

@oli I'm wondering whether ParseSess, Session, and TyCtxt have some sort of common trait we can create that would facilitate generating the code for those custom derives

centril (Jun 08 2019 at 21:21, on Zulip):

Such that you can have type Session: SessionLike;

Tom Phinney (Jun 09 2019 at 02:38, on Zulip):

Back from working on my house with a contractor for six hours. @oli @Manish Goregaokar would you send me an invite to any planned meetings on internationalization of diagnostics? I have a lot of time conflicts this summer but I'll attend if I can, or catch up on zulip later.

Manish Goregaokar (Jun 09 2019 at 03:19, on Zulip):

@Tom Phinney there aren't any planned meetings for diagnostics internationalization, we decided to do a bunch of other cleanups first

Manish Goregaokar (Jun 09 2019 at 03:19, on Zulip):

i don't think we'll be having meetings for i18n

Manish Goregaokar (Jun 09 2019 at 03:19, on Zulip):

we have a clear plan already

Manish Goregaokar (Jun 09 2019 at 03:19, on Zulip):

i'll let you know when we start doing that though

Last update: Nov 15 2019 at 09:45UTC