Skip to content

Commit 8c4f5f1

Browse files
committed
支持语言切换模型
1 parent d4e5634 commit 8c4f5f1

File tree

6 files changed

+138
-3
lines changed

6 files changed

+138
-3
lines changed

data/data.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package data
22

3+
import (
4+
"github.com/tinygg/gofaker/data/person"
5+
"reflect"
6+
)
7+
38
// Data consists of the main set of fake information
49
var Data = map[string]map[string][]string{
5-
"person": Person,
10+
"person": person.Provider(reflect.ValueOf(LOCALE).String()),
611
"address": Address,
712
"company": Company,
813
"job": Job,

data/locale.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package data
2+
3+
type Locale string
4+
5+
const (
6+
ZH_CN Locale = "zh_CN"
7+
EN_US Locale = "en_US"
8+
RU_RU Locale = "ru_RU"
9+
FR_FR Locale = "fr_FR"
10+
AR_PS Locale = "ar_PS"
11+
ES_ES Locale = "es_ES"
12+
FA_IR Locale = "fa_IR"
13+
HR_HR Locale = "hr_HR"
14+
HU_HU Locale = "hu_HU"
15+
HY_AM Locale = "hy_AM"
16+
PT_BR Locale = "pt_BR"
17+
TH_TH Locale = "th_TH"
18+
UK_UA Locale = "uk_UA"
19+
)
20+
21+
var (
22+
LOCALE Locale = EN_US
23+
)
24+
25+
func SetLocale(locale Locale) {
26+
LOCALE = locale
27+
}

data/person.go renamed to data/person/en_US/person.go

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

data/person/person.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package person
2+
3+
import (
4+
"github.com/tinygg/gofaker/data/person/en_US"
5+
"github.com/tinygg/gofaker/data/person/zh_CN"
6+
)
7+
8+
func Provider(lang string) map[string][]string {
9+
switch lang {
10+
case "ZH_CN":
11+
return zh_CN.Person
12+
case "EN_US":
13+
return en_US.Person
14+
default:
15+
return en_US.Person
16+
}
17+
18+
}

data/person/zh_CN/person.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package zh_CN
2+
3+
// Person consists of a slice of people information
4+
var Person = map[string][]string{
5+
"prefix": {"Mr.", "Mrs.", "Ms.", "Miss", "Dr."},
6+
"suffix": {"Jr.", "Sr.", "I", "II", "III", "IV", "V", "MD", "DDS", "PhD", "DVM"},
7+
"first": {
8+
"王", "李", "张", "刘", "陈", "杨", "黄", "吴", "赵", "周", "徐", "孙", "马", "朱", "胡", "林", "郭", "何", "高",
9+
"罗", "郑", "梁", "谢", "宋", "唐", "许", "邓", "冯", "韩", "曹", "曾", "彭", "萧", "蔡", "潘", "田", "董", "袁",
10+
"于", "余", "叶", "蒋", "杜", "苏", "魏", "程", "吕", "丁", "沈", "任", "姚", "卢", "傅", "钟", "姜", "崔", "谭",
11+
"廖", "范", "汪", "陆", "金", "石", "戴", "贾", "韦", "夏", "邱", "方", "侯", "邹", "熊", "孟", "秦", "白", "江",
12+
"阎", "薛", "尹", "段", "雷", "黎", "史", "龙", "陶", "贺", "顾", "毛", "郝", "龚", "邵", "万", "钱", "严", "赖",
13+
"覃", "洪", "武", "莫", "孔", "汤", "向", "常", "温", "康", "施", "文", "牛", "樊", "葛", "邢", "安", "齐", "易",
14+
"乔", "伍", "庞", "颜", "倪", "庄", "聂", "章", "鲁", "岳", "翟", "殷", "詹", "申", "欧", "耿", "关", "兰", "焦",
15+
"俞", "左", "柳", "甘", "祝", "包", "宁", "尚", "符", "舒", "阮", "柯", "纪", "梅", "童", "凌", "毕", "单", "季",
16+
"裴", "霍", "涂", "成", "苗", "谷", "盛", "曲", "翁", "冉", "骆", "蓝", "路", "游", "辛", "靳", "欧", "管", "柴",
17+
"蒙", "鲍", "华", "喻", "祁", "蒲", "房", "滕", "屈", "饶", "解", "牟", "艾", "尤", "阳", "时", "穆", "农", "司",
18+
"卓", "古", "吉", "缪", "简", "车", "项", "连", "芦", "麦", "褚", "娄", "窦", "戚", "岑", "景", "党", "宫", "费",
19+
"卜", "冷", "晏", "席", "卫", "米", "柏", "宗", "瞿", "桂", "全", "佟", "应", "臧", "闵", "苟", "邬", "边", "卞",
20+
"姬", "师", "和", "仇", "栾", "隋", "商", "刁", "沙", "荣", "巫", "寇", "桑", "郎", "甄", "丛", "仲", "虞", "敖",
21+
"巩", "明", "佘", "池", "查", "麻", "苑", "迟", "邝", "官", "封", "谈", "匡", "鞠", "惠", "荆", "乐", "冀", "郁",
22+
"胥", "南", "班", "储", "原", "栗", "燕", "楚", "鄢", "劳", "谌", "奚", "皮", "粟", "冼", "蔺", "楼", "盘", "满",
23+
"闻", "位", "厉", "伊", "仝", "区", "郜", "海", "阚", "花", "权", "强", "帅", "屠", "豆", "朴", "盖", "练", "廉",
24+
"禹", "井", "祖", "漆", "巴", "丰", "支", "卿", "国", "狄", "平", "计", "索", "宣", "晋", "相", "初", "门", "云",
25+
"容", "敬", "来", "扈", "晁", "芮", "都", "普", "阙", "浦", "戈", "伏", "鹿", "薄", "邸", "雍", "辜", "羊", "阿",
26+
"乌", "母", "裘", "亓", "修", "邰", "赫", "杭", "况", "那", "宿", "鲜", "印", "逯", "隆", "茹", "诸", "战", "慕",
27+
"危", "玉", "银", "亢", "嵇", "公", "哈", "湛", "宾", "戎", "勾", "茅", "利", "于", "呼", "居", "揭", "干", "但",
28+
"尉", "冶", "斯", "元", "束", "檀", "衣", "信", "展", "阴", "昝", "智", "幸", "奉", "植", "衡", "富", "尧", "闭",
29+
"由",
30+
},
31+
"last": {
32+
"伟", "强", "磊", "洋", "勇", "军", "杰", "涛", "超", "明", "刚", "平", "辉", "鹏", "华", "飞",
33+
"鑫", "波", "斌", "宇", "浩", "凯", "健", "俊", "帆", "帅", "旭", "宁", "龙", "林", "欢", "佳",
34+
"阳", "建华", "亮", "成", "建", "峰", "建国", "建军", "晨", "瑞", "志强", "兵", "雷", "东", "博",
35+
"彬", "坤", "想", "岩", "杨", "文", "利", "楠", "红霞", "建平",
36+
"芳", "娜", "敏", "静", "秀英", "丽", "艳", "娟", "霞", "秀兰", "燕", "玲", "桂英", "丹", "萍",
37+
"红", "玉兰", "桂兰", "英", "梅", "莉", "秀珍", "婷", "玉梅", "玉珍", "凤英", "晶", "玉英", "颖",
38+
"雪", "慧", "红梅", "倩", "琴", "兰英", "畅", "云", "洁", "柳", "淑珍", "春梅", "海燕", "冬梅",
39+
"秀荣", "桂珍", "莹", "秀云", "桂荣", "秀梅", "丽娟", "婷婷", "玉华", "琳", "雪梅", "淑兰", "丽丽",
40+
"玉", "秀芳", "欣", "淑英", "桂芳", "丽华", "丹丹", "桂香", "淑华", "荣", "秀华", "桂芝", "小红",
41+
"金凤", "瑜", "桂花", "璐", "凤兰",
42+
},
43+
"phone": {"###-###-####", "(###)###-####", "1-###-###-####", "###.###.####"},
44+
}

random_select.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package gofaker
2+
3+
import (
4+
"math/rand"
5+
"sort"
6+
)
7+
8+
// Choice is a generic wrapper that can be used to add weights for any object
9+
type Choice struct {
10+
Item interface{}
11+
Weight uint
12+
}
13+
14+
// A Chooser caches many possible Choices in a structure designed to improve
15+
// performance on repeated calls for weighted random selection.
16+
type Chooser struct {
17+
data []Choice
18+
totals []int
19+
max int
20+
}
21+
22+
// NewChooser initializes a new Chooser consisting of the possible Choices.
23+
func NewChooser(cs ...Choice) Chooser {
24+
sort.Slice(cs, func(i, j int) bool {
25+
return cs[i].Weight < cs[j].Weight
26+
}) // 核心点,对元素进行递增排序。
27+
totals := make([]int, len(cs))
28+
runningTotal := 0
29+
for i, c := range cs {
30+
runningTotal += int(c.Weight)
31+
totals[i] = runningTotal
32+
}
33+
return Chooser{data: cs, totals: totals, max: runningTotal}
34+
}
35+
36+
// Pick returns a single weighted random Choice.Item from the Chooser.
37+
func (chs Chooser) Pick() interface{} {
38+
r := rand.Intn(chs.max) + 1 // 使用最大值获取随机数,避免超过范围,随机生成的数需要排除0,故加1
39+
i := sort.SearchInts(chs.totals, r) // 核心点该方法使用二分法,找到对应的下标,如果没有则为大于该数的+1 下标,可能为len(a)即数组长度。
40+
return chs.data[i].Item
41+
}

0 commit comments

Comments
 (0)