github.com/wangyougui/gf/v2@v2.6.5/i18n/gi18n/gi18n_z_unit_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gi18n_test
     8  
     9  import (
    10  	"time"
    11  
    12  	"github.com/wangyougui/gf/v2/encoding/gbase64"
    13  	"github.com/wangyougui/gf/v2/os/gctx"
    14  
    15  	"context"
    16  	"testing"
    17  
    18  	"github.com/wangyougui/gf/v2/debug/gdebug"
    19  	"github.com/wangyougui/gf/v2/frame/g"
    20  	"github.com/wangyougui/gf/v2/i18n/gi18n"
    21  	"github.com/wangyougui/gf/v2/os/gfile"
    22  	"github.com/wangyougui/gf/v2/os/gres"
    23  	"github.com/wangyougui/gf/v2/os/gtime"
    24  	"github.com/wangyougui/gf/v2/test/gtest"
    25  	"github.com/wangyougui/gf/v2/util/gconv"
    26  )
    27  
    28  func Test_Basic(t *testing.T) {
    29  	gtest.C(t, func(t *gtest.T) {
    30  		i18n := gi18n.New(gi18n.Options{
    31  			Path: gtest.DataPath("i18n"),
    32  		})
    33  		i18n.SetLanguage("none")
    34  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
    35  
    36  		i18n.SetLanguage("ja")
    37  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
    38  
    39  		i18n.SetLanguage("zh-CN")
    40  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
    41  		i18n.SetDelimiters("{$", "}")
    42  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
    43  		t.Assert(i18n.T(context.Background(), "{$hello}{$world}"), "你好世界")
    44  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
    45  		t.Assert(i18n.T(context.Background(), "{$你好} {$世界}"), "hello world")
    46  		// undefined variables.
    47  		t.Assert(i18n.T(context.Background(), "{$你好1}{$世界1}"), "{$你好1}{$世界1}")
    48  	})
    49  
    50  	gtest.C(t, func(t *gtest.T) {
    51  		i18n := gi18n.New(gi18n.Options{
    52  			Path: gtest.DataPath("i18n-file"),
    53  		})
    54  		i18n.SetLanguage("none")
    55  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
    56  
    57  		i18n.SetLanguage("ja")
    58  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
    59  
    60  		i18n.SetLanguage("zh-CN")
    61  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
    62  		t.Assert(i18n.T(context.Background(), "{#你好} {#世界}"), "hello world")
    63  	})
    64  
    65  	gtest.C(t, func(t *gtest.T) {
    66  		i18n := gi18n.New(gi18n.Options{
    67  			Path: gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n-dir",
    68  		})
    69  		i18n.SetLanguage("none")
    70  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
    71  
    72  		i18n.SetLanguage("ja")
    73  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
    74  
    75  		i18n.SetLanguage("zh-CN")
    76  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
    77  	})
    78  }
    79  
    80  func Test_TranslateFormat(t *testing.T) {
    81  	// Tf
    82  	gtest.C(t, func(t *gtest.T) {
    83  		i18n := gi18n.New(gi18n.Options{
    84  			Path: gtest.DataPath("i18n"),
    85  		})
    86  		i18n.SetLanguage("none")
    87  		t.Assert(i18n.Tf(context.Background(), "{#hello}{#world} %d", 2020), "{#hello}{#world} 2020")
    88  
    89  		i18n.SetLanguage("ja")
    90  		t.Assert(i18n.Tf(context.Background(), "{#hello}{#world} %d", 2020), "こんにちは世界 2020")
    91  	})
    92  }
    93  
    94  func Test_DefaultManager(t *testing.T) {
    95  	gtest.C(t, func(t *gtest.T) {
    96  		err := gi18n.SetPath(gtest.DataPath("i18n"))
    97  		t.AssertNil(err)
    98  
    99  		gi18n.SetLanguage("none")
   100  		t.Assert(gi18n.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
   101  
   102  		gi18n.SetLanguage("ja")
   103  		t.Assert(gi18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
   104  
   105  		gi18n.SetLanguage("zh-CN")
   106  		t.Assert(gi18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
   107  	})
   108  
   109  	gtest.C(t, func(t *gtest.T) {
   110  		err := gi18n.SetPath(gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n-dir")
   111  		t.AssertNil(err)
   112  
   113  		gi18n.SetLanguage("none")
   114  		t.Assert(gi18n.Translate(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
   115  
   116  		gi18n.SetLanguage("ja")
   117  		t.Assert(gi18n.Translate(context.Background(), "{#hello}{#world}"), "こんにちは世界")
   118  
   119  		gi18n.SetLanguage("zh-CN")
   120  		t.Assert(gi18n.Translate(context.Background(), "{#hello}{#world}"), "你好世界")
   121  	})
   122  }
   123  
   124  func Test_Instance(t *testing.T) {
   125  	gtest.C(t, func(t *gtest.T) {
   126  		m := gi18n.Instance()
   127  		err := m.SetPath(gtest.DataPath("i18n-dir"))
   128  		t.AssertNil(err)
   129  		m.SetLanguage("zh-CN")
   130  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "你好世界")
   131  		t.Assert(m.T(context.Background(), "{#你好} {#世界}"), "hello world")
   132  	})
   133  
   134  	gtest.C(t, func(t *gtest.T) {
   135  		m := gi18n.Instance()
   136  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "你好世界")
   137  	})
   138  
   139  	gtest.C(t, func(t *gtest.T) {
   140  		t.Assert(g.I18n().T(context.Background(), "{#hello}{#world}"), "你好世界")
   141  	})
   142  	// Default language is: en
   143  	gtest.C(t, func(t *gtest.T) {
   144  		m := gi18n.Instance(gconv.String(gtime.TimestampNano()))
   145  		m.SetPath(gtest.DataPath("i18n-dir"))
   146  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "HelloWorld")
   147  	})
   148  }
   149  
   150  func Test_Resource(t *testing.T) {
   151  	gtest.C(t, func(t *gtest.T) {
   152  		m := g.I18n("resource")
   153  		err := m.SetPath(gtest.DataPath("i18n-dir"))
   154  		t.AssertNil(err)
   155  
   156  		m.SetLanguage("none")
   157  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "{#hello}{#world}")
   158  
   159  		m.SetLanguage("ja")
   160  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
   161  
   162  		m.SetLanguage("zh-CN")
   163  		t.Assert(m.T(context.Background(), "{#hello}{#world}"), "你好世界")
   164  	})
   165  }
   166  
   167  func Test_SetCtxLanguage(t *testing.T) {
   168  	gtest.C(t, func(t *gtest.T) {
   169  		ctx := gctx.New()
   170  		t.Assert(gi18n.LanguageFromCtx(ctx), "")
   171  	})
   172  
   173  	gtest.C(t, func(t *gtest.T) {
   174  		t.Assert(gi18n.LanguageFromCtx(nil), "")
   175  	})
   176  
   177  	gtest.C(t, func(t *gtest.T) {
   178  		ctx := gctx.New()
   179  		ctx = gi18n.WithLanguage(ctx, "zh-CN")
   180  		t.Assert(gi18n.LanguageFromCtx(ctx), "zh-CN")
   181  	})
   182  
   183  	gtest.C(t, func(t *gtest.T) {
   184  		ctx := gi18n.WithLanguage(context.Background(), "zh-CN")
   185  		t.Assert(gi18n.LanguageFromCtx(ctx), "zh-CN")
   186  	})
   187  
   188  }
   189  
   190  func Test_GetContent(t *testing.T) {
   191  	i18n := gi18n.New(gi18n.Options{
   192  		Path: gtest.DataPath("i18n-file"),
   193  	})
   194  	gtest.C(t, func(t *gtest.T) {
   195  		t.Assert(i18n.GetContent(context.Background(), "hello"), "Hello")
   196  
   197  		ctx := gi18n.WithLanguage(context.Background(), "zh-CN")
   198  		t.Assert(i18n.GetContent(ctx, "hello"), "你好")
   199  
   200  		ctx = gi18n.WithLanguage(context.Background(), "unknown")
   201  		t.Assert(i18n.GetContent(ctx, "hello"), "")
   202  	})
   203  }
   204  
   205  func Test_PathInResource(t *testing.T) {
   206  	gtest.C(t, func(t *gtest.T) {
   207  		binContent, err := gres.Pack(gtest.DataPath("i18n"))
   208  		t.AssertNil(err)
   209  		err = gres.Add(gbase64.EncodeToString(binContent))
   210  		t.AssertNil(err)
   211  
   212  		i18n := gi18n.New()
   213  		i18n.SetLanguage("zh-CN")
   214  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
   215  
   216  		err = i18n.SetPath("i18n")
   217  		t.AssertNil(err)
   218  		i18n.SetLanguage("ja")
   219  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
   220  	})
   221  }
   222  
   223  func Test_PathInNormal(t *testing.T) {
   224  	// Copy i18n files to current directory.
   225  	gfile.CopyDir(gtest.DataPath("i18n"), gfile.Join(gdebug.CallerDirectory(), "manifest/i18n"))
   226  	// Remove copied files after testing.
   227  	defer gfile.Remove(gfile.Join(gdebug.CallerDirectory(), "manifest"))
   228  
   229  	i18n := gi18n.New()
   230  
   231  	gtest.C(t, func(t *gtest.T) {
   232  		i18n.SetLanguage("zh-CN")
   233  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "你好世界")
   234  		// Set not exist path.
   235  		err := i18n.SetPath("i18n-not-exist")
   236  		t.AssertNE(err, nil)
   237  		err = i18n.SetPath("")
   238  		t.AssertNE(err, nil)
   239  		i18n.SetLanguage("ja")
   240  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}"), "こんにちは世界")
   241  	})
   242  
   243  	// Change language file content.
   244  	gtest.C(t, func(t *gtest.T) {
   245  		i18n.SetLanguage("en")
   246  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}{#name}"), "HelloWorld{#name}")
   247  		err := gfile.PutContentsAppend(gfile.Join(gdebug.CallerDirectory(), "manifest/i18n/en.toml"), "\nname = \"GoFrame\"")
   248  		t.AssertNil(err)
   249  		// Wait for the file modification time to change.
   250  		time.Sleep(10 * time.Millisecond)
   251  		t.Assert(i18n.T(context.Background(), "{#hello}{#world}{#name}"), "HelloWorldGoFrame")
   252  	})
   253  
   254  	// Add new language
   255  	gtest.C(t, func(t *gtest.T) {
   256  		err := gfile.PutContents(gfile.Join(gdebug.CallerDirectory(), "manifest/i18n/en-US.toml"), "lang = \"en-US\"")
   257  		t.AssertNil(err)
   258  		// Wait for the file modification time to change.
   259  		time.Sleep(10 * time.Millisecond)
   260  		i18n.SetLanguage("en-US")
   261  		t.Assert(i18n.T(context.Background(), "{#lang}"), "en-US")
   262  	})
   263  }