From e746be6ebb74634110f77f63e59cb41be51e78eb Mon Sep 17 00:00:00 2001 From: Zygmunt Krynicki Date: Thu, 17 Jan 2019 16:42:35 +0200 Subject: [PATCH] [PATCH 7/9] 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 Signed-off-by: Maciej Borzecki Gbp-Pq: Name 0007-i18n-use-dummy-localizations-to-avoid-dependencies.patch --- i18n/i18n.go | 87 +++----------------------------- i18n/i18n_test.go | 125 ++-------------------------------------------- 2 files changed, 11 insertions(+), 201 deletions(-) diff --git a/i18n/i18n.go b/i18n/i18n.go index 352e9a65..12885f71 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -19,76 +19,11 @@ package i18n -//go:generate update-pot - import ( - "fmt" "os" - "path/filepath" "strings" - - "github.com/snapcore/go-gettext" - - "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 = localeFromEnv() - } - - locale = translations.Locale(simplifyLocale(loc)) -} - func simplifyLocale(loc string) string { // de_DE.UTF-8, de_DE@euro all need to get simplified loc = strings.Split(loc, "@")[0] @@ -106,30 +41,20 @@ func localeFromEnv() string { return loc } -// CurrentLocale returns the current locale without encoding or variants. func CurrentLocale() string { return simplifyLocale(localeFromEnv()) } // 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") } -- 2.30.2