Slide 1

Slide 1 text

কেরা: Translating Code to Other (Human) Languages and Back Again @chimeracoder Aditya Mukerjee Systems Engineer, Stripe

Slide 2

Slide 2 text

@chimeracoder

Slide 3

Slide 3 text

@chimeracoder

Slide 4

Slide 4 text

95% of the world doesn’t speak English as their first language 89% of the world doesn't speak English at all @chimeracoder

Slide 5

Slide 5 text

@chimeacoder

Slide 6

Slide 6 text

@chimeracoder

Slide 7

Slide 7 text

Software reflects the people who build it @chimeracoder

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

“I would have thought it would be useful to NATO, because they had the common verbs for the things they were going to do. And the nouns, they’d just have to have a dictionary for things they were referring to for inventory control…. They’d have common nouns throughout NATO, and they could make a dictionary of common verbs and translate the program. You could write one in English and you could translate it and it could go to [the other language]. No problem, you’d have communication. It would be a limited vocabulary.” - Grace Hopper @chimeracoder

Slide 10

Slide 10 text

github.com/ChimeraCoder/koro কেরা (koro)

Slide 11

Slide 11 text

package main import "fmt" func main() { if true { fmt.Printf(“hello, world!\n") } } @chimeracoder

Slide 12

Slide 12 text

প ােকজ main আমদািন "fmt" ফ main(){ যিদ true { fmt.Println("ওেহ িব !\n") } } @chimeracoder

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

@chimeracoder

Slide 16

Slide 16 text

Slide 17

Slide 17 text

gofmt korofmt @chimeracoder

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Automatic source code translation • Bidirectional translation layers • Localize source code as a commit hook @chimeracoder

Slide 20

Slide 20 text

Structuring Code

Slide 21

Slide 21 text

Naming Schemes @chimeracoder ReadFoo() WriteFoo() Close() (etc.) Fooপড়() Foo লখ() ব () …

Slide 22

Slide 22 text

Localizing Error Messages

Slide 23

Slide 23 text

type error interface { Error() string } @chimeracoder

Slide 24

Slide 24 text

@chimeracoder Cannot cast parameter type from type “System.String” to argument type “System.String”

Slide 25

Slide 25 text

The only thing worse than a cryptic error message is a cryptic error message in a foreign language that you can’t understand @chimeracoder

Slide 26

Slide 26 text

What about documentation?

Slide 27

Slide 27 text

The secret of automated translation…. • We don't have to bridge all communication between two arbitrary languages • We just have to bridge communication in a specific context between two languages @chimeracoder

Slide 28

Slide 28 text

Pipe creates a synchronous in- memory pipe. It can be used to connect code expecting an io.Reader with code expecting an io.Writer. Reads and Writes on the pipe are matched one to one except when multiple Reads are needed to consume a single Write. That is, each Write to the PipeWriter blocks until it has satisfied one or more Reads from the PipeReader that fully consume the written data. The data is copied directly from the Write to the corresponding Read (or Reads); there is no internal buffering. It is safe to call Read and Write in parallel with each other or with Close. Parallel calls to Read and parallel calls to Write are also safe: the individual calls will be gated sequentially. পাইপ এক িসেKানাস ইন- মমির পাইপ তির কের। এ এক io.Reader কাড কাড এক io.Writer আশা সে কাড সংেযাগ করেত ব বহার করা যেত পাের। পাইেপর উপর লখা এবং িলখন িল এক থেক এক সােথ মলােনা হয় যখন একক লখার জন একািধক িরড িলর েয়াজন হয়। য, েত ক পাইপ ওয়ািরটার ক িলেত িলখন যত ন না িলিখত ডটা স ূণভােব ব বহার কের PipeReader থেক এক বা একািধক িরড স হয়। তথ সংি পাঠ (বা পাঠ) থেক িলখন থেক সরাসির কিপ করা হয়; কান অভ রীণ বাফার আেছ। এটা এেক অপেরর সে বা ব সে সমা রাল প ন প ন এবং িলখন িনরাপদ। লখার জন সমা রাল কল িল প ন এবং সমা রাল কল িলও িনরাপদ: ব ি গত কল িল মানুসাের গট হেয় যােব।

Slide 29

Slide 29 text

Pipe creates a synchronous in- memory pipe. It can be used to connect code expecting an io.Reader with code expecting an io.Writer. Reads and Writes on the pipe are matched one to one except when multiple Reads are needed to consume a single Write. That is, each Write to the PipeWriter blocks until it has satisfied one or more Reads from the PipeReader that fully consume the written data. The data is copied directly from the Write to the corresponding Read (or Reads); there is no internal buffering. It is safe to call Read and Write in parallel with each other or with Close. Parallel calls to Read and parallel calls to Write are also safe: the individual calls will be gated sequentially. The pipe creates a synchronous in- memory pipe. It can be used to connect the code with an io.Writer Expect an io.Reader code code. Writing and writing on pipe matches one to one when multiple reads are required for single writing. Write down each pipe warrior block until one or more reads from PipeReader are satisfied using the written data completely. The information is copied directly from the corresponding text (or text); There are no internal buffers. Read it to read parallel with each other or close and safe to enter. Read parallel calls for writing and parallel calls are also safe: Private calls will be gated in sequence.

Slide 30

Slide 30 text

Pipe creates a synchronous in- memory pipe. It can be used to connect code expecting an io.Reader with code expecting an io.Writer. Reads and Writes on the pipe are matched one to one except when multiple Reads are needed to consume a single Write. That is, each Write to the PipeWriter blocks until it has satisfied one or more Reads from the PipeReader that fully consume the written data. The data is copied directly from the Write to the corresponding Read (or Reads); there is no internal buffering. It is safe to call Read and Write in parallel with each other or with Close. Parallel calls to Read and parallel calls to Write are also safe: the individual calls will be gated sequentially. Piping creates a synchronous pipeline in memory. It is a discount code io.Reader code to connect with a io.Writer hope can be used. Writing and writing in the pipeline when the units correspond one by one with the need to write more than one ridagulira. That is, each tube will write blocks until the data using the one or more read PipeReader is satisfied. Relevant text information (or text) is copied directly from the site; There is no internal buffer. It is read in parallel with each other or with the read and write insurance. Reading calls to write parallel and parallel calls is safe: the door will be in the order of personal calls.

Slide 31

Slide 31 text

@chimeracoder

Slide 32

Slide 32 text

Growing a multilingual OSS community doesn’t happen overnight @chimeracoder Automatic translation is not a substitute - it’s an invitation (but it doesn’t happen automatically either)

Slide 33

Slide 33 text

@chimeracoder It’s surprisingly easy to get community translations… but you do have to ask

Slide 34

Slide 34 text

Localizing Live Events @chimeracoder

Slide 35

Slide 35 text

@chimeracoder We need to bring events to the global community …but we also need to bring the global community to our events To truly eliminate linguistic barriers, both are necessary

Slide 36

Slide 36 text

Localizing Project Communication @chimeracoder

Slide 37

Slide 37 text

@chimeracoder Encourage people to write in their native languages Provide archive links with community translations

Slide 38

Slide 38 text

Where do we go from here?

Slide 39

Slide 39 text

95% of the world doesn’t speak English as their first language 89% of the world doesn't speak English at all @chimeracoder

Slide 40

Slide 40 text

Aditya Mukerjee @chimeracoder https://github.com/ChimeraCoder