// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main // TODO: these definitions should be moved to a package so that the can be used // by other tools. // The file contains the structures used to define translations of a certain // messages. // // A translation may have multiple translations strings, or messages, depending // on the feature values of the various arguments. For instance, consider // a hypothetical translation from English to English, where the source defines // the format string "%d file(s) remaining". A completed translation, expressed // in JS, for this format string could look like: // // { // "Key": [ // "\"%d files(s) remaining\"" // ], // "Original": { // "Msg": "\"%d files(s) remaining\"" // }, // "Translation": { // "Select": { // "Feature": "plural", // "Arg": 1, // "Case": { // "one": { "Msg": "1 file remaining" }, // "other": { "Msg": "%d files remaining" } // }, // }, // }, // "Args": [ // { // "ID": 2, // "Type": "int", // "UnderlyingType": "int", // "Expr": "nFiles", // "Comment": "number of files remaining", // "Position": "golang.org/x/text/cmd/gotext/demo.go:34:3" // } // ], // "Position": "golang.org/x/text/cmd/gotext/demo.go:33:10", // } // // Alternatively, the Translation section could be written as: // // "Translation": { // "Msg": "%d %[files]s remaining", // "Var": { // "files" : { // "Select": { // "Feature": "plural", // "Arg": 1, // "Case": { // "one": { "Msg": "file" }, // "other": { "Msg": "files" } // } // } // } // } // } // A Translation describes a translation for a single language for a single // message. type Translation struct { // Key contains a list of identifiers for the message. If this list is empty // Original is used as the key. Key []string `json:"key,omitempty"` Original Text `json:"original"` Translation Text `json:"translation"` ExtractedComment string `json:"extractedComment,omitempty"` TranslatorComment string `json:"translatorComment,omitempty"` Args []Argument `json:"args,omitempty"` // Extraction information. Position string `json:"position,omitempty"` // filePosition:line } // An Argument contains information about the arguments passed to a message. type Argument struct { ID interface{} `json:"id"` // An int for printf-style calls, but could be a string. Type string `json:"type"` UnderlyingType string `json:"underlyingType"` Expr string `json:"expr"` Value string `json:"value,omitempty"` Comment string `json:"comment,omitempty"` Position string `json:"position,omitempty"` // Features contains the features that are available for the implementation // of this argument. Features []Feature `json:"features,omitempty"` } // Feature holds information about a feature that can be implemented by // an Argument. type Feature struct { Type string `json:"type"` // Right now this is only gender and plural. // TODO: possible values and examples for the language under consideration. } // Text defines a message to be displayed. type Text struct { // Msg and Select contains the message to be displayed. Within a Text value // either Msg or Select is defined. Msg string `json:"msg,omitempty"` Select *Select `json:"select,omitempty"` // Var defines a map of variables that may be substituted in the selected // message. Var map[string]Text `json:"var,omitempty"` // Example contains an example message formatted with default values. Example string `json:"example,omitempty"` } // Type Select selects a Text based on the feature value associated with // a feature of a certain argument. type Select struct { Feature string `json:"feature"` // Name of variable or Feature type Arg interface{} `json:"arg"` // The argument ID. Cases map[string]Text `json:"cases"` }