করো: Translating Go to Other (Human) Languages, and Back Again - GopherCon Brasil

করো: Translating Go to Other (Human) Languages, and Back Again - GopherCon Brasil

Like most programming languages, Go uses English keywords. But Go's unique approach to byte and string handling makes it the ideal candidate for a universal programming language that can be localized to allow English-speaking and non-English speaking developers to collaborate on the same projects.

94dcff33cbdf74b5d785369ac54bc1a8?s=128

Aditya Mukerjee

November 18, 2017
Tweet

Transcript

  1. কেরা: Translating Go to Other (Human) Languages, and Back Again

    Aditya Mukerjee Systems Engineer at Stripe @chimeracoder কেরা: Traduzindo Go para Outros Idiomas (Humanos) e Vice-versa
  2. @chimeracoder

  3. @chimeracoder

  4. @chimeracoder

  5. Why not use a lingua franca? •English is difficult to

    learn •A lingua franca doesn’t eliminate language barriers •Languages evolve. Even if we tried to restrict them, we couldn't •Embrace multilingual workflows instead of fighting an uphill battle @chimeracoder
  6. None
  7. “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
  8. github.com/ChimeraCoder/koro কেরা (koro)

  9. package main import "fmt" func main() { if true {

    fmt.Printf(“hello, world!\n") } } @chimeracoder
  10. প ােকজ main আমদািন "fmt" ফ main(){ যিদ true {

    fmt.Println("ওেহ িব !\n") } } @chimeracoder
  11. @chimeracoder

  12. @chimeracoder

  13. @chimeracoder

  14. <insert gif of translation>

  15. gofmt korofmt @chimeracoder

  16. None
  17. Automatic source code translation • Bidirectional translation layers • Localize

    source code as a commit hook • Treat language preferences like indentation preferences @chimeracoder
  18. Dá pra fazer isso em português?

  19. Structuring Code

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

    () … @chimeracoder
  21. type error interface { Error() string } @chimeracoder

  22. Localizing Error Messages Cannot cast parameter type from type “System.String”

    to argument type “System.String” The only thing worse than a cryptic error message is a cryptic error message in a foreign language that you can’t understand @chimeracoder
  23. What about documentation?

  24. 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
  25. 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 থেক এক বা একািধক িরড স হয়। তথ সংি পাঠ (বা পাঠ) থেক িলখন থেক সরাসির কিপ করা হয়; কান অভ রীণ বাফার আেছ। এটা এেক অপেরর সে বা ব সে সমা রাল প ন প ন এবং িলখন িনরাপদ। লখার জন সমা রাল কল িল প ন এবং সমা রাল কল িলও িনরাপদ: ব ি গত কল িল মানুসাের গট হেয় যােব।
  26. 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.
  27. 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.
  28. •Automatic translation is not a substitute •The point is to

    signal interest to draw other speakers to your project •Growing a multilingual OSS community doesn’t happen overnight •But it doesn’t happen automatically, either – we have to work for it @chimeracoder
  29. Community Translations •Actively reach out within your community •We are

    already looking for ways to get people to contribute to OSS projects •You have to ask @chimeracoder
  30. Localizing Mailing Lists •Encourage people to write in their native

    languages •Provide archive links with community translations @chimeracoder
  31. Where do we go from here? @chimeracoder

  32. In 2018, the Go project will be translated into other

    languages @chimeracoder
  33. 95% of the world doesn’t speak English as their first

    language 89% of the world doesn't speak English at all @chimeracoder
  34. Aditya Mukerjee @chimeracoder https://github.com/ChimeraCoder Obrigado!