48 lines
954 B
Go
48 lines
954 B
Go
package jf2
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
// Lang is the localization language of the containing object and all
|
|
// sub-objects, unless overridden by another lang definition. Setting lang at a
|
|
// lower level overrides any lang value set at higher levels.
|
|
type Lang struct {
|
|
language.Tag
|
|
}
|
|
|
|
func (l *Lang) UnmarshalJSON(v []byte) error {
|
|
unquoted, err := strconv.Unquote(string(v))
|
|
if err != nil {
|
|
return fmt.Errorf("JF2: Lang: cannot unquote value: %w", err)
|
|
}
|
|
|
|
parsed, err := language.Parse(unquoted)
|
|
if err != nil {
|
|
return fmt.Errorf("JF2: Lang: cannot parse value as language tag: %w", err)
|
|
}
|
|
|
|
l.Tag = parsed
|
|
|
|
return nil
|
|
}
|
|
|
|
func (l Lang) MarshalJSON() ([]byte, error) {
|
|
if l.Tag != language.Und {
|
|
return []byte(strconv.Quote(l.Tag.String())), nil
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func (l Lang) String() string {
|
|
return l.Tag.String()
|
|
}
|
|
|
|
func (l Lang) GoString() string {
|
|
return "jf2.Lang(" + l.String() + ")"
|
|
}
|