From: Zygmunt Krynicki Date: Thu, 17 Jan 2019 14:42:35 +0000 (+0200) Subject: i18n: use dummy localizations to avoid dependencies X-Git-Tag: archive/raspbian/2.37.2-1+rpi1^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=23ef8effad40ab766d22098c3427cbf76b3571e5;p=snapd.git i18n: use dummy localizations to avoid dependencies Upstream snapd uses the github.com/ojii/gettext.go package for access to translation catalogs. This package is currently not available in Debian and prevents building the package. As such, replace the real implementation with a simple dummy one that always uses the English input strings. Signed-off-by: Zygmunt Krynicki Gbp-Pq: Name 0007-i18n-use-dummy-localizations-to-avoid-dependencies.patch --- diff --git a/i18n/i18n.go b/i18n/i18n.go index fb50901a..79f28545 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -19,101 +19,16 @@ package i18n -//go:generate update-pot - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/ojii/gettext.go" - - "github.com/snapcore/snapd/dirs" - "github.com/snapcore/snapd/osutil" -) - -// TEXTDOMAIN is the message domain used by snappy; see dgettext(3) -// for more information. -var ( - TEXTDOMAIN = "snappy" - locale gettext.Catalog - translations gettext.Translations -) - -func init() { - bindTextDomain(TEXTDOMAIN, "/usr/share/locale") - setLocale("") -} - -func langpackResolver(baseRoot string, locale string, domain string) string { - // first check for the real locale (e.g. de_DE) - // then try to simplify the locale (e.g. de_DE -> de) - locales := []string{locale, strings.SplitN(locale, "_", 2)[0]} - for _, locale := range locales { - r := filepath.Join(locale, "LC_MESSAGES", fmt.Sprintf("%s.mo", domain)) - - // look into the core snaps first for translations, - // then the main system - candidateDirs := []string{ - filepath.Join(dirs.SnapMountDir, "/core/current/", baseRoot), - baseRoot, - } - for _, root := range candidateDirs { - // ubuntu uses /usr/lib/locale-langpack and patches the glibc gettext - // implementation - langpack := filepath.Join(root, "..", "locale-langpack", r) - if osutil.FileExists(langpack) { - return langpack - } - - regular := filepath.Join(root, r) - if osutil.FileExists(regular) { - return regular - } - } - } - - return "" -} - -func bindTextDomain(domain, dir string) { - translations = gettext.NewTranslations(dir, domain, langpackResolver) -} - -func setLocale(loc string) { - if loc == "" { - loc = os.Getenv("LC_MESSAGES") - if loc == "" { - loc = os.Getenv("LANG") - } - } - // de_DE.UTF-8, de_DE@euro all need to get simplified - loc = strings.Split(loc, "@")[0] - loc = strings.Split(loc, ".")[0] - - locale = translations.Locale(loc) -} - // G is the shorthand for Gettext func G(msgid string) string { - return locale.Gettext(msgid) -} - -// https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html -// (search for 1000) -func ngn(d int) uint32 { - const max = 1000000 - if d < 0 { - d = -d - } - if d > max { - return uint32((d % max) + max) - } - return uint32(d) + return msgid } // NG is the shorthand for NGettext func NG(msgid string, msgidPlural string, n int) string { - return locale.NGettext(msgid, msgidPlural, ngn(n)) + if n == 1 { + return msgid + } else { + return msgidPlural + } } diff --git a/i18n/i18n_test.go b/i18n/i18n_test.go index 81cb050a..86b59f3b 100644 --- a/i18n/i18n_test.go +++ b/i18n/i18n_test.go @@ -20,143 +20,28 @@ package i18n import ( - "io/ioutil" - "os" - "os/exec" - "path/filepath" "testing" . "gopkg.in/check.v1" - - "github.com/snapcore/snapd/dirs" ) // Hook up check.v1 into the "go test" runner func Test(t *testing.T) { TestingT(t) } -var mockLocalePo = []byte(` -msgid "" -msgstr "" -"Project-Id-Version: snappy-test\n" -"Report-Msgid-Bugs-To: snappy-devel@lists.ubuntu.com\n" -"POT-Creation-Date: 2015-06-16 09:08+0200\n" -"Language: en_DK\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;>\n" - -msgid "plural_1" -msgid_plural "plural_2" -msgstr[0] "translated plural_1" -msgstr[1] "translated plural_2" - -msgid "singular" -msgstr "translated singular" -`) - -func makeMockTranslations(c *C, localeDir string) { - fullLocaleDir := filepath.Join(localeDir, "en_DK", "LC_MESSAGES") - err := os.MkdirAll(fullLocaleDir, 0755) - c.Assert(err, IsNil) - - po := filepath.Join(fullLocaleDir, "snappy-test.po") - mo := filepath.Join(fullLocaleDir, "snappy-test.mo") - err = ioutil.WriteFile(po, mockLocalePo, 0644) - c.Assert(err, IsNil) - - cmd := exec.Command("msgfmt", po, "--output-file", mo) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - c.Assert(err, IsNil) -} - -type i18nTestSuite struct { - origLang string - origLcMessages string -} +type i18nTestSuite struct{} var _ = Suite(&i18nTestSuite{}) -func (s *i18nTestSuite) SetUpTest(c *C) { - // this dir contains a special hand-crafted en_DK/snappy-test.mo - // file - localeDir := c.MkDir() - makeMockTranslations(c, localeDir) - - // we use a custom test mo file - TEXTDOMAIN = "snappy-test" - - s.origLang = os.Getenv("LANG") - s.origLcMessages = os.Getenv("LC_MESSAGES") - - bindTextDomain("snappy-test", localeDir) - os.Setenv("LANG", "en_DK.UTF-8") - setLocale("") -} - -func (s *i18nTestSuite) TearDownTest(c *C) { - os.Setenv("LANG", s.origLang) - os.Setenv("LC_MESSAGES", s.origLcMessages) -} - func (s *i18nTestSuite) TestTranslatedSingular(c *C) { // no G() to avoid adding the test string to snappy-pot var Gtest = G - c.Assert(Gtest("singular"), Equals, "translated singular") + c.Assert(Gtest("singular"), Equals, "singular") } func (s *i18nTestSuite) TestTranslatesPlural(c *C) { // no NG() to avoid adding the test string to snappy-pot var NGtest = NG - c.Assert(NGtest("plural_1", "plural_2", 1), Equals, "translated plural_1") -} - -func (s *i18nTestSuite) TestTranslatedMissingLangNoCrash(c *C) { - setLocale("invalid") - - // no G() to avoid adding the test string to snappy-pot - var Gtest = G - c.Assert(Gtest("singular"), Equals, "singular") -} - -func (s *i18nTestSuite) TestInvalidTextDomainDir(c *C) { - bindTextDomain("snappy-test", "/random/not/existing/dir") - setLocale("invalid") - - // no G() to avoid adding the test string to snappy-pot - var Gtest = G - c.Assert(Gtest("singular"), Equals, "singular") -} - -func (s *i18nTestSuite) TestLangpackResolverFromLangpack(c *C) { - root := c.MkDir() - localeDir := filepath.Join(root, "/usr/share/locale") - err := os.MkdirAll(localeDir, 0755) - c.Assert(err, IsNil) - - d := filepath.Join(root, "/usr/share/locale-langpack") - makeMockTranslations(c, d) - bindTextDomain("snappy-test", localeDir) - setLocale("") - - // no G() to avoid adding the test string to snappy-pot - var Gtest = G - c.Assert(Gtest("singular"), Equals, "translated singular", Commentf("test with %q failed", d)) -} - -func (s *i18nTestSuite) TestLangpackResolverFromCore(c *C) { - origSnapMountDir := dirs.SnapMountDir - defer func() { dirs.SnapMountDir = origSnapMountDir }() - dirs.SnapMountDir = c.MkDir() - - d := filepath.Join(dirs.SnapMountDir, "/core/current/usr/share/locale") - makeMockTranslations(c, d) - bindTextDomain("snappy-test", "/usr/share/locale") - setLocale("") - - // no G() to avoid adding the test string to snappy-pot - var Gtest = G - c.Assert(Gtest("singular"), Equals, "translated singular", Commentf("test with %q failed", d)) + c.Assert(NGtest("plural_1", "plural_2", 0), Equals, "plural_2") + c.Assert(NGtest("plural_1", "plural_2", 1), Equals, "plural_1") + c.Assert(NGtest("plural_1", "plural_2", 2), Equals, "plural_2") }