Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
MCMS
Commits
cb77002e
Commit
cb77002e
authored
Jun 30, 2020
by
sgjj
Browse files
添加国际化
parent
a96f78d3
Changes
8
Hide whitespace changes
Inline
Side-by-side
pom.xml
View file @
cb77002e
...
...
@@ -85,6 +85,7 @@
<groupId>
net.mingsoft
</groupId>
<artifactId>
ms-mpeople
</artifactId>
</dependency>
<dependency>
<groupId>
net.mingsoft
</groupId>
<artifactId>
ms-basic
</artifactId>
...
...
src/main/java/net/mingsoft/MSApplication.java
View file @
cb77002e
...
...
@@ -8,7 +8,9 @@ import org.springframework.context.annotation.ComponentScan;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
;
import
java.util.Locale
;
@SpringBootApplication
@ComponentScan
(
basePackages
=
{
"net.mingsoft"
})
@MapperScan
(
basePackages
={
"**.dao"
})
...
...
src/main/java/net/mingsoft/cms/action/web/MCmsAction.java
View file @
cb77002e
...
...
@@ -52,10 +52,7 @@ import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.UnsupportedEncodingException
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.*
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
...
...
src/main/webapp/WEB-INF/manager/cms/category/form.ftl
View file @
cb77002e
...
...
@@ -3,6 +3,9 @@
<
head
>
<title>分类</title>
<#include "../../include/head-file.ftl">
<script src="$
{
base
}
/static/locale/lang/cms/category/ch.js"></script>
<script src="$
{
base
}
/static/locale/lang/cms/category/en.js"></script>
</
head
>
<
body
>
<
div
id="form" v-cloak>
...
...
@@ -19,7 +22,7 @@
justify="start" align="top">
<el-col span="12">
<el-form-item label="栏目管理名称" prop="categoryTitle">
<template slot='label'>
栏目管理名称
<template slot='label'>
{{
$t
(
'
form
.categoryTitle.text
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
<a href="http://doc.ms.mingsoft.net/plugs-cms/biao-qian/nei-rong-biao-qian-ms-field.html"
target="_blank">
{
ms
:
field
.typetitle
/
}
</a>
...
...
@@ -32,12 +35,12 @@
:disabled="false"
:style="
{
width
:
'
100
%'
}
"
:clearable="true"
placeholder="
请输入栏目管理名称
">
:
placeholder="
$t('form.categoryTitle.placeholder')
">
</el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="
所属栏目
" prop="categoryId">
<el-form-item
:
label="
$t('form.categoryId')
" prop="categoryId">
<tree-select ref="tree" :props="
{
value
:
'
id
'
,
label
:
'
categoryTitle
'
,
children
:
'
children
'
}
"
:options="treeList" :style="
{
width
:
'
100
%'
}
"
v-model="form.categoryId"></tree-select>
...
...
@@ -49,7 +52,7 @@
justify="start" align="top">
<el-col span="12">
<el-form-item prop="categoryType">
<template slot='label'>
栏目类型
<template slot='label'>
{{
$t
(
'
form
.categoryType
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
列表:常用于带列表、详情的业务,例如:新闻列表、图片列表<br>封面:常用单篇文章显示,例如:关于我们、公司介绍<br>修改栏目时如果该栏目存在文章则不能修改栏目类型
<i class="el-icon-question" slot="reference"></i>
...
...
@@ -66,7 +69,7 @@
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="
自定义顺序
" prop="categorySort">
<el-form-item
:
label="
$t('form.categorySort')
" prop="categorySort">
<el-input-number
v-model="form.categorySort"
:disabled="false"
...
...
@@ -79,7 +82,7 @@
gutter="0"
justify="start" align="top">
<el-col span="12">
<el-form-item prop="categoryUrl" :label="
form.categoryType =='1'? '内容模板' : '封面模板'
">
<el-form-item prop="categoryUrl" :label="
$tc('form.categoryUrl',form.categoryType)
">
<el-select v-model="form.categoryUrl"
:style="
{
width
:
'
100
%'
}
"
:filterable="true"
...
...
@@ -93,7 +96,7 @@
</el-col>
<el-col span="12">
<el-form-item prop="mdiyModelId">
<template slot='label'>
自定义模型
<template slot='label'>
{{
$t
(
'
form
.mdiyModelId
'
)}}
<el-popover slot="label" placement="top-start" title="提示" width="400" trigger="hover"
content="如果发布时候文章字段信息不够,可以采用铭飞代码生成器生成自定义模型,再通过“自定义管理->自定义模型->导入”功能导入模型,注意类型是cms">
<i class="el-icon-question" slot="reference"></i>
...
...
@@ -114,7 +117,7 @@
<el-row gutter="0" justify="start" align="top">
<el-col span="12">
<el-form-item prop="categoryListUrl" v-if="form.categoryType == '1'">
<template slot='label'>
列表模板
<template slot='label'>
{{
$t
(
'
form
.categoryListUrl
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover"
content="当栏目类型为列表时有效">
<i class="el-icon-question" slot="reference"></i>
...
...
@@ -133,7 +136,7 @@
</el-col>
<el-col span="12">
<el-form-item label="栏目属性" prop="categoryFlag">
<template slot='label'>
栏目属性
<template slot='label'>
{{
$t
(
'
form
.categoryFlag
'
)}}
<el-popover placement="top-start" title="提示" trigger="hover" content="类型不满足可以在自定义字典菜单中新增,字段类型为“栏目属性”">
<i class="el-icon-question" slot="reference"></i>
</el-popover>
...
...
@@ -151,7 +154,7 @@
</el-col>
</el-row>
<el-form-item label="栏目管理关键字" prop="categoryKeyword">
<template slot='label'>
栏目关键字
<template slot='label'>
{{
$t
(
'
form
.categoryKeyword
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
<a href="http://doc.ms.mingsoft.net/plugs-cms/biao-qian/lan-mu-lie-biao-ms-channel.html"
target="_blank">[field.typekeyword/]</a>
...
...
@@ -167,7 +170,7 @@
</el-input>
</el-form-item>
<el-form-item label="栏目管理描述" prop="categoryDescrip">
<template slot='label'>
栏目描述
<template slot='label'>
{{
$t
(
'
form
.categoryDescrip
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
<a href="http://doc.ms.mingsoft.net/plugs-cms/biao-qian/lan-mu-lie-biao-ms-channel.html"
target="_blank">[field.typedescrip/]</a>
...
...
@@ -183,7 +186,7 @@
</el-input>
</el-form-item>
<el-form-item label="" prop="categoryImg">
<template slot='label'>
缩略图
<template slot='label'>
{{
$t
(
'
form
.categoryImg
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
<a href="http://doc.ms.mingsoft.net/plugs-cms/biao-qian/nei-rong-biao-qian-ms-field.html"
target="_blank">
{
ms
:
field
.typelitpic
/
}
</a>
...
...
@@ -209,7 +212,7 @@
</el-upload>
</el-form-item>
<el-form-item prop="categoryDiyUrl">
<template slot='label'>
自定义链接
<template slot='label'>
{{
$t
(
'
form
.categoryDiyUrl
'
)}}
<el-popover slot="label" placement="top-start" title="提示" trigger="hover">
<a href="http://doc.ms.mingsoft.net/plugs-cms/biao-qian/lan-mu-lie-biao-ms-channel.html"
target="_blank">[field.typeurl/]</a>
...
...
@@ -230,10 +233,17 @@
</
body
>
</
html
>
<
script
>
var i18n = new VueI18n(
{
locale
:
parent
.indexVue.locale.language
,
//
设置地区
messages
:
O
bject
.assign
({},
localeCh
,
localeEn
)
}
)
var form = new Vue(
{
i18n
:
i18n
,
el
:
'#
form
'
,
data
:
function
()
{
return
{
locale
:
parent
.indexVue.locale
,
treeList
:
[
{
id
:
'
0
'
,
categoryTitle
:
'顶级栏目'
,
...
...
@@ -302,6 +312,9 @@
}
;
},
watch
:
{
'
locale
.language
'
:
function
(
n
,
o
)
{
this
.
$i18n
.locale
=
n
},
'
form
.categoryId
'
:
function
(
n
,
o
)
{
var
_
this
=
this
;
...
...
src/main/webapp/WEB-INF/manager/index.ftl
View file @
cb77002e
...
...
@@ -52,7 +52,9 @@
<!--头部-->
<el-header class="ms-admin-header" v-cloak>
<#--展示合并菜单-->
<div class="ms-admin-header-menu-shrink" @click="collapseMenu = !collapseMenu"><i class="iconfont" :class="collapseMenu?'icon-liebiaoxiangyou':'icon-shousuo'"></i></div>
<div class="ms-admin-header-menu-shrink" @click="collapseMenu = !collapseMenu"><i class="iconfont"
:class="collapseMenu?'icon-liebiaoxiangyou':'icon-shousuo'"></i>
</div>
<!--头部menu-->
<el-menu menu-trigger="hover" class="ms-admin-header-menu" background-color="rgba(255,255,255,1)"
text-color="#333333" active-text-color="#409EFF" :default-active="headMenuActive"
...
...
@@ -104,9 +106,20 @@
</el-menu-item>
</el-submenu>
</el-menu>
<el-dropdown trigger="hover" class="ms-admin-login" placement="top-start" @visible-change="loginDown = !loginDown">
<#--
语言切换-->
<el-dropdown @command="handleLanguageClick">
<span class="el-dropdown-link" >
{{
locale
.text
}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="(item,index) in localeCommands" :command="item">
{{
item
.text
}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown trigger="hover" class="ms-admin-login" placement="top-start"
@visible-change="loginDown = !loginDown">
<span class="el-dropdown-link">
<div class="ms-admin-people-head" v-text="peopleInfo.managerName && peopleInfo.managerName.substr(0, 2)"></div>
<div class="ms-admin-people-head"
v-text="peopleInfo.managerName && peopleInfo.managerName.substr(0, 2)"></div>
<span v-text='peopleInfo.managerName'></span>
</span>
<el-dropdown-menu class="ms-admin-login-down" slot="dropdown" @click.native='openModal'>
...
...
@@ -123,7 +136,7 @@
</el-header>
<!--内容-->
<el-main class="ms-admin-main"
>
<el-main class="ms-admin-main">
<!--选项卡-->
<el-tabs class="ms-admin-tabs" v-model="currentTab" type="card" closable @tab-remove="closeTab"
@tab-click='tabClick'>
...
...
@@ -148,6 +161,20 @@
el
:
"#app"
,
data
:
{
code
:
''
,
locale
:
{
text
:
'中文'
,
language
:
'
ch
'
,
},
localeCommands
:
[
{
text
:
'中文'
,
language
:
'
ch
'
,
},
{
text
:
'
E
nglish
'
,
language
:
'
en
'
,
}
]
,
menuList
:
[]
,
//菜单接口数据
asideMenuList
:
[]
,
//侧边菜单
parentMenuList
:
[]
,
//一级菜单
...
...
@@ -242,6 +269,12 @@
}
},
methods
:
{
handleLanguageClick
:
function
(
val
)
{
this
.locale.text
=
val
.text
this
.locale.language
=
val
.language
//语言切换
console
.log
(
val
)
},
getAuthorization
:
function
()
{
},
...
...
@@ -554,9 +587,10 @@
</
script
>
<
style
>
.adminhead
{
margin-top: 10px\0;
.adminhead
{
margin-top
:
10
px
\
0
;
}
.item
{
margin-right
:
19
px
;
}
...
...
@@ -751,7 +785,8 @@
width
:
162
px
;
min-width
:
162
px
;
}
.ms-admin-login-down
{
top:55px !important;
.ms-admin-login-down
{
top
:
55
px
!
important
;
}
</
style
>
src/main/webapp/static/locale/lang/cms/category/ch.js
0 → 100644
View file @
cb77002e
var
localeCh
=
{
ch
:{
form
:{
categoryTitle
:{
text
:
'
栏目名称
'
,
placeholder
:
'
请输入栏目名称
'
,
help
:
''
,
},
categoryId
:
'
所属栏目
'
,
categoryType
:
'
栏目类型
'
,
categorySort
:
'
自定义顺序
'
,
categoryUrl
:
'
内容模板|封面模板
'
,
mdiyModelId
:
'
自定义模型
'
,
categoryListUrl
:
'
列表模板
'
,
categoryFlag
:
'
栏目属性
'
,
categoryKeyword
:
'
栏目关键字
'
,
categoryDescrip
:
'
栏目描述
'
,
categoryImg
:
'
栏目图片
'
,
categoryDiyUrl
:
'
自定义链接
'
,
}
}
}
\ No newline at end of file
src/main/webapp/static/locale/lang/cms/category/en.js
0 → 100644
View file @
cb77002e
var
localeEn
=
{
en
:{
form
:{
categoryTitle
:{
text
:
'
channel name
'
,
placeholder
:
'
please enter channel name
'
,
help
:
''
,
},
categoryId
:
'
parent channel
'
,
categoryType
:
'
channel type
'
,
categorySort
:
'
channel sort
'
,
categoryUrl
:
'
content template|page template
'
,
mdiyModelId
:
'
diy Model
'
,
categoryListUrl
:
'
list template
'
,
categoryFlag
:
'
channel property
'
,
categoryKeyword
:
'
channel keyword
'
,
categoryDescrip
:
'
channel desc
'
,
categoryImg
:
'
channel image
'
,
categoryDiyUrl
:
'
custom url
'
,
}
}
}
\ No newline at end of file
src/main/webapp/static/plugins/vue-i18n/vue-i18n.js
0 → 100644
View file @
cb77002e
/*!
* vue-i18n v8.18.2
* (c) 2020 kazuya kawaguchi
* Released under the MIT License.
*/
(
function
(
global
,
factory
)
{
typeof
exports
===
'
object
'
&&
typeof
module
!==
'
undefined
'
?
module
.
exports
=
factory
()
:
typeof
define
===
'
function
'
&&
define
.
amd
?
define
(
factory
)
:
(
global
.
VueI18n
=
factory
());
}(
this
,
(
function
()
{
'
use strict
'
;
/* */
/**
* constants
*/
var
numberFormatKeys
=
[
'
style
'
,
'
currency
'
,
'
currencyDisplay
'
,
'
useGrouping
'
,
'
minimumIntegerDigits
'
,
'
minimumFractionDigits
'
,
'
maximumFractionDigits
'
,
'
minimumSignificantDigits
'
,
'
maximumSignificantDigits
'
,
'
localeMatcher
'
,
'
formatMatcher
'
,
'
unit
'
];
/**
* utilities
*/
function
warn
(
msg
,
err
)
{
if
(
typeof
console
!==
'
undefined
'
)
{
console
.
warn
(
'
[vue-i18n]
'
+
msg
);
/* istanbul ignore if */
if
(
err
)
{
console
.
warn
(
err
.
stack
);
}
}
}
function
error
(
msg
,
err
)
{
if
(
typeof
console
!==
'
undefined
'
)
{
console
.
error
(
'
[vue-i18n]
'
+
msg
);
/* istanbul ignore if */
if
(
err
)
{
console
.
error
(
err
.
stack
);
}
}
}
var
isArray
=
Array
.
isArray
;
function
isObject
(
obj
)
{
return
obj
!==
null
&&
typeof
obj
===
'
object
'
}
function
isBoolean
(
val
)
{
return
typeof
val
===
'
boolean
'
}
function
isString
(
val
)
{
return
typeof
val
===
'
string
'
}
var
toString
=
Object
.
prototype
.
toString
;
var
OBJECT_STRING
=
'
[object Object]
'
;
function
isPlainObject
(
obj
)
{
return
toString
.
call
(
obj
)
===
OBJECT_STRING
}
function
isNull
(
val
)
{
return
val
===
null
||
val
===
undefined
}
function
parseArgs
()
{
var
args
=
[],
len
=
arguments
.
length
;
while
(
len
--
)
args
[
len
]
=
arguments
[
len
];
var
locale
=
null
;
var
params
=
null
;
if
(
args
.
length
===
1
)
{
if
(
isObject
(
args
[
0
])
||
Array
.
isArray
(
args
[
0
]))
{
params
=
args
[
0
];
}
else
if
(
typeof
args
[
0
]
===
'
string
'
)
{
locale
=
args
[
0
];
}
}
else
if
(
args
.
length
===
2
)
{
if
(
typeof
args
[
0
]
===
'
string
'
)
{
locale
=
args
[
0
];
}
/* istanbul ignore if */
if
(
isObject
(
args
[
1
])
||
Array
.
isArray
(
args
[
1
]))
{
params
=
args
[
1
];
}
}
return
{
locale
:
locale
,
params
:
params
}
}
function
looseClone
(
obj
)
{
return
JSON
.
parse
(
JSON
.
stringify
(
obj
))
}
function
remove
(
arr
,
item
)
{
if
(
arr
.
length
)
{
var
index
=
arr
.
indexOf
(
item
);
if
(
index
>
-
1
)
{
return
arr
.
splice
(
index
,
1
)
}
}
}
function
includes
(
arr
,
item
)
{
return
!!~
arr
.
indexOf
(
item
)
}
var
hasOwnProperty
=
Object
.
prototype
.
hasOwnProperty
;
function
hasOwn
(
obj
,
key
)
{
return
hasOwnProperty
.
call
(
obj
,
key
)
}
function
merge
(
target
)
{
var
arguments$1
=
arguments
;
var
output
=
Object
(
target
);
for
(
var
i
=
1
;
i
<
arguments
.
length
;
i
++
)
{
var
source
=
arguments$1
[
i
];
if
(
source
!==
undefined
&&
source
!==
null
)
{
var
key
=
(
void
0
);
for
(
key
in
source
)
{
if
(
hasOwn
(
source
,
key
))
{
if
(
isObject
(
source
[
key
]))
{
output
[
key
]
=
merge
(
output
[
key
],
source
[
key
]);
}
else
{
output
[
key
]
=
source
[
key
];
}
}
}
}
}
return
output
}
function
looseEqual
(
a
,
b
)
{
if
(
a
===
b
)
{
return
true
}
var
isObjectA
=
isObject
(
a
);
var
isObjectB
=
isObject
(
b
);
if
(
isObjectA
&&
isObjectB
)
{
try
{
var
isArrayA
=
Array
.
isArray
(
a
);
var
isArrayB
=
Array
.
isArray
(
b
);
if
(
isArrayA
&&
isArrayB
)
{
return
a
.
length
===
b
.
length
&&
a
.
every
(
function
(
e
,
i
)
{
return
looseEqual
(
e
,
b
[
i
])
})
}
else
if
(
!
isArrayA
&&
!
isArrayB
)
{
var
keysA
=
Object
.
keys
(
a
);
var
keysB
=
Object
.
keys
(
b
);
return
keysA
.
length
===
keysB
.
length
&&
keysA
.
every
(
function
(
key
)
{
return
looseEqual
(
a
[
key
],
b
[
key
])
})
}
else
{
/* istanbul ignore next */
return
false
}
}
catch
(
e
)
{
/* istanbul ignore next */
return
false
}
}
else
if
(
!
isObjectA
&&
!
isObjectB
)
{
return
String
(
a
)
===
String
(
b
)
}
else
{
return
false
}
}
/* */
function
extend
(
Vue
)
{
if
(
!
Vue
.
prototype
.
hasOwnProperty
(
'
$i18n
'
))
{
// $FlowFixMe
Object
.
defineProperty
(
Vue
.
prototype
,
'
$i18n
'
,
{
get
:
function
get
()
{
return
this
.
_i18n
}
});
}
Vue
.
prototype
.
$t
=
function
(
key
)
{
var
values
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
1
];
var
i18n
=
this
.
$i18n
;
return
i18n
.
_t
.
apply
(
i18n
,
[
key
,
i18n
.
locale
,
i18n
.
_getMessages
(),
this
].
concat
(
values
))
};
Vue
.
prototype
.
$tc
=
function
(
key
,
choice
)
{
var
values
=
[],
len
=
arguments
.
length
-
2
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
2
];
var
i18n
=
this
.
$i18n
;
return
i18n
.
_tc
.
apply
(
i18n
,
[
key
,
i18n
.
locale
,
i18n
.
_getMessages
(),
this
,
choice
].
concat
(
values
))
};
Vue
.
prototype
.
$te
=
function
(
key
,
locale
)
{
var
i18n
=
this
.
$i18n
;
return
i18n
.
_te
(
key
,
i18n
.
locale
,
i18n
.
_getMessages
(),
locale
)
};
Vue
.
prototype
.
$d
=
function
(
value
)
{
var
ref
;
var
args
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
args
[
len
]
=
arguments
[
len
+
1
];
return
(
ref
=
this
.
$i18n
).
d
.
apply
(
ref
,
[
value
].
concat
(
args
))
};
Vue
.
prototype
.
$n
=
function
(
value
)
{
var
ref
;
var
args
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
args
[
len
]
=
arguments
[
len
+
1
];
return
(
ref
=
this
.
$i18n
).
n
.
apply
(
ref
,
[
value
].
concat
(
args
))
};
}
/* */
var
mixin
=
{
beforeCreate
:
function
beforeCreate
()
{
var
options
=
this
.
$options
;
options
.
i18n
=
options
.
i18n
||
(
options
.
__i18n
?
{}
:
null
);
if
(
options
.
i18n
)
{
if
(
options
.
i18n
instanceof
VueI18n
)
{
// init locale messages via custom blocks
if
(
options
.
__i18n
)
{
try
{
var
localeMessages
=
{};
options
.
__i18n
.
forEach
(
function
(
resource
)
{
localeMessages
=
merge
(
localeMessages
,
JSON
.
parse
(
resource
));
});
Object
.
keys
(
localeMessages
).
forEach
(
function
(
locale
)
{
options
.
i18n
.
mergeLocaleMessage
(
locale
,
localeMessages
[
locale
]);
});
}
catch
(
e
)
{
{
error
(
"
Cannot parse locale messages via custom blocks.
"
,
e
);
}
}
}
this
.
_i18n
=
options
.
i18n
;
this
.
_i18nWatcher
=
this
.
_i18n
.
watchI18nData
();
}
else
if
(
isPlainObject
(
options
.
i18n
))
{
var
rootI18n
=
this
.
$root
&&
this
.
$root
.
$i18n
&&
this
.
$root
.
$i18n
instanceof
VueI18n
?
this
.
$root
.
$i18n
:
null
;
// component local i18n
if
(
rootI18n
)
{
options
.
i18n
.
root
=
this
.
$root
;
options
.
i18n
.
formatter
=
rootI18n
.
formatter
;
options
.
i18n
.
fallbackLocale
=
rootI18n
.
fallbackLocale
;
options
.
i18n
.
formatFallbackMessages
=
rootI18n
.
formatFallbackMessages
;
options
.
i18n
.
silentTranslationWarn
=
rootI18n
.
silentTranslationWarn
;
options
.
i18n
.
silentFallbackWarn
=
rootI18n
.
silentFallbackWarn
;
options
.
i18n
.
pluralizationRules
=
rootI18n
.
pluralizationRules
;
options
.
i18n
.
preserveDirectiveContent
=
rootI18n
.
preserveDirectiveContent
;
}
// init locale messages via custom blocks
if
(
options
.
__i18n
)
{
try
{
var
localeMessages$1
=
{};
options
.
__i18n
.
forEach
(
function
(
resource
)
{
localeMessages$1
=
merge
(
localeMessages$1
,
JSON
.
parse
(
resource
));
});
options
.
i18n
.
messages
=
localeMessages$1
;
}
catch
(
e
)
{
{
warn
(
"
Cannot parse locale messages via custom blocks.
"
,
e
);
}
}
}
var
ref
=
options
.
i18n
;
var
sharedMessages
=
ref
.
sharedMessages
;
if
(
sharedMessages
&&
isPlainObject
(
sharedMessages
))
{
options
.
i18n
.
messages
=
merge
(
options
.
i18n
.
messages
,
sharedMessages
);
}
this
.
_i18n
=
new
VueI18n
(
options
.
i18n
);
this
.
_i18nWatcher
=
this
.
_i18n
.
watchI18nData
();
if
(
options
.
i18n
.
sync
===
undefined
||
!!
options
.
i18n
.
sync
)
{
this
.
_localeWatcher
=
this
.
$i18n
.
watchLocale
();
}
if
(
rootI18n
)
{
rootI18n
.
onComponentInstanceCreated
(
this
.
_i18n
);
}
}
else
{
{
warn
(
"
Cannot be interpreted 'i18n' option.
"
);
}
}
}
else
if
(
this
.
$root
&&
this
.
$root
.
$i18n
&&
this
.
$root
.
$i18n
instanceof
VueI18n
)
{
// root i18n
this
.
_i18n
=
this
.
$root
.
$i18n
;
}
else
if
(
options
.
parent
&&
options
.
parent
.
$i18n
&&
options
.
parent
.
$i18n
instanceof
VueI18n
)
{
// parent i18n
this
.
_i18n
=
options
.
parent
.
$i18n
;
}
},
beforeMount
:
function
beforeMount
()
{
var
options
=
this
.
$options
;
options
.
i18n
=
options
.
i18n
||
(
options
.
__i18n
?
{}
:
null
);
if
(
options
.
i18n
)
{
if
(
options
.
i18n
instanceof
VueI18n
)
{
// init locale messages via custom blocks
this
.
_i18n
.
subscribeDataChanging
(
this
);
this
.
_subscribing
=
true
;
}
else
if
(
isPlainObject
(
options
.
i18n
))
{
this
.
_i18n
.
subscribeDataChanging
(
this
);
this
.
_subscribing
=
true
;
}
else
{
{
warn
(
"
Cannot be interpreted 'i18n' option.
"
);
}
}
}
else
if
(
this
.
$root
&&
this
.
$root
.
$i18n
&&
this
.
$root
.
$i18n
instanceof
VueI18n
)
{
this
.
_i18n
.
subscribeDataChanging
(
this
);
this
.
_subscribing
=
true
;
}
else
if
(
options
.
parent
&&
options
.
parent
.
$i18n
&&
options
.
parent
.
$i18n
instanceof
VueI18n
)
{
this
.
_i18n
.
subscribeDataChanging
(
this
);
this
.
_subscribing
=
true
;
}
},
beforeDestroy
:
function
beforeDestroy
()
{
if
(
!
this
.
_i18n
)
{
return
}
var
self
=
this
;
this
.
$nextTick
(
function
()
{
if
(
self
.
_subscribing
)
{
self
.
_i18n
.
unsubscribeDataChanging
(
self
);
delete
self
.
_subscribing
;
}
if
(
self
.
_i18nWatcher
)
{
self
.
_i18nWatcher
();
self
.
_i18n
.
destroyVM
();
delete
self
.
_i18nWatcher
;
}
if
(
self
.
_localeWatcher
)
{
self
.
_localeWatcher
();
delete
self
.
_localeWatcher
;
}
});
}
};
/* */
var
interpolationComponent
=
{
name
:
'
i18n
'
,
functional
:
true
,
props
:
{
tag
:
{
type
:
[
String
,
Boolean
],
default
:
'
span
'
},
path
:
{
type
:
String
,
required
:
true
},
locale
:
{
type
:
String
},
places
:
{
type
:
[
Array
,
Object
]
}
},
render
:
function
render
(
h
,
ref
)
{
var
data
=
ref
.
data
;
var
parent
=
ref
.
parent
;
var
props
=
ref
.
props
;
var
slots
=
ref
.
slots
;
var
$i18n
=
parent
.
$i18n
;
if
(
!
$i18n
)
{
{
warn
(
'
Cannot find VueI18n instance!
'
);
}
return
}
var
path
=
props
.
path
;
var
locale
=
props
.
locale
;
var
places
=
props
.
places
;
var
params
=
slots
();
var
children
=
$i18n
.
i
(
path
,
locale
,
onlyHasDefaultPlace
(
params
)
||
places
?
useLegacyPlaces
(
params
.
default
,
places
)
:
params
);
var
tag
=
(
!!
props
.
tag
&&
props
.
tag
!==
true
)
||
props
.
tag
===
false
?
props
.
tag
:
'
span
'
;
return
tag
?
h
(
tag
,
data
,
children
)
:
children
}
};
function
onlyHasDefaultPlace
(
params
)
{
var
prop
;
for
(
prop
in
params
)
{
if
(
prop
!==
'
default
'
)
{
return
false
}
}
return
Boolean
(
prop
)
}
function
useLegacyPlaces
(
children
,
places
)
{
var
params
=
places
?
createParamsFromPlaces
(
places
)
:
{};
if
(
!
children
)
{
return
params
}
// Filter empty text nodes
children
=
children
.
filter
(
function
(
child
)
{
return
child
.
tag
||
child
.
text
.
trim
()
!==
''
});
var
everyPlace
=
children
.
every
(
vnodeHasPlaceAttribute
);
if
(
everyPlace
)
{
warn
(
'
`place` attribute is deprecated in next major version. Please switch to Vue slots.
'
);
}
return
children
.
reduce
(
everyPlace
?
assignChildPlace
:
assignChildIndex
,
params
)
}
function
createParamsFromPlaces
(
places
)
{
{
warn
(
'
`places` prop is deprecated in next major version. Please switch to Vue slots.
'
);
}
return
Array
.
isArray
(
places
)
?
places
.
reduce
(
assignChildIndex
,
{})
:
Object
.
assign
({},
places
)
}
function
assignChildPlace
(
params
,
child
)
{
if
(
child
.
data
&&
child
.
data
.
attrs
&&
child
.
data
.
attrs
.
place
)
{
params
[
child
.
data
.
attrs
.
place
]
=
child
;
}
return
params
}
function
assignChildIndex
(
params
,
child
,
index
)
{
params
[
index
]
=
child
;
return
params
}
function
vnodeHasPlaceAttribute
(
vnode
)
{
return
Boolean
(
vnode
.
data
&&
vnode
.
data
.
attrs
&&
vnode
.
data
.
attrs
.
place
)
}
/* */
var
numberComponent
=
{
name
:
'
i18n-n
'
,
functional
:
true
,
props
:
{
tag
:
{
type
:
[
String
,
Boolean
],
default
:
'
span
'
},
value
:
{
type
:
Number
,
required
:
true
},
format
:
{
type
:
[
String
,
Object
]
},
locale
:
{
type
:
String
}
},
render
:
function
render
(
h
,
ref
)
{
var
props
=
ref
.
props
;
var
parent
=
ref
.
parent
;
var
data
=
ref
.
data
;
var
i18n
=
parent
.
$i18n
;
if
(
!
i18n
)
{
{
warn
(
'
Cannot find VueI18n instance!
'
);
}
return
null
}
var
key
=
null
;
var
options
=
null
;
if
(
isString
(
props
.
format
))
{
key
=
props
.
format
;
}
else
if
(
isObject
(
props
.
format
))
{
if
(
props
.
format
.
key
)
{
key
=
props
.
format
.
key
;
}
// Filter out number format options only
options
=
Object
.
keys
(
props
.
format
).
reduce
(
function
(
acc
,
prop
)
{
var
obj
;
if
(
includes
(
numberFormatKeys
,
prop
))
{
return
Object
.
assign
({},
acc
,
(
obj
=
{},
obj
[
prop
]
=
props
.
format
[
prop
],
obj
))
}
return
acc
},
null
);
}
var
locale
=
props
.
locale
||
i18n
.
locale
;
var
parts
=
i18n
.
_ntp
(
props
.
value
,
locale
,
key
,
options
);
var
values
=
parts
.
map
(
function
(
part
,
index
)
{
var
obj
;
var
slot
=
data
.
scopedSlots
&&
data
.
scopedSlots
[
part
.
type
];
return
slot
?
slot
((
obj
=
{},
obj
[
part
.
type
]
=
part
.
value
,
obj
.
index
=
index
,
obj
.
parts
=
parts
,
obj
))
:
part
.
value
});
var
tag
=
(
!!
props
.
tag
&&
props
.
tag
!==
true
)
||
props
.
tag
===
false
?
props
.
tag
:
'
span
'
;
return
tag
?
h
(
tag
,
{
attrs
:
data
.
attrs
,
'
class
'
:
data
[
'
class
'
],
staticClass
:
data
.
staticClass
},
values
)
:
values
}
};
/* */
function
bind
(
el
,
binding
,
vnode
)
{
if
(
!
assert
(
el
,
vnode
))
{
return
}
t
(
el
,
binding
,
vnode
);
}
function
update
(
el
,
binding
,
vnode
,
oldVNode
)
{
if
(
!
assert
(
el
,
vnode
))
{
return
}
var
i18n
=
vnode
.
context
.
$i18n
;
if
(
localeEqual
(
el
,
vnode
)
&&
(
looseEqual
(
binding
.
value
,
binding
.
oldValue
)
&&
looseEqual
(
el
.
_localeMessage
,
i18n
.
getLocaleMessage
(
i18n
.
locale
))))
{
return
}
t
(
el
,
binding
,
vnode
);
}
function
unbind
(
el
,
binding
,
vnode
,
oldVNode
)
{
var
vm
=
vnode
.
context
;
if
(
!
vm
)
{
warn
(
'
Vue instance does not exists in VNode context
'
);
return
}
var
i18n
=
vnode
.
context
.
$i18n
||
{};
if
(
!
binding
.
modifiers
.
preserve
&&
!
i18n
.
preserveDirectiveContent
)
{
el
.
textContent
=
''
;
}
el
.
_vt
=
undefined
;
delete
el
[
'
_vt
'
];
el
.
_locale
=
undefined
;
delete
el
[
'
_locale
'
];
el
.
_localeMessage
=
undefined
;
delete
el
[
'
_localeMessage
'
];
}
function
assert
(
el
,
vnode
)
{
var
vm
=
vnode
.
context
;
if
(
!
vm
)
{
warn
(
'
Vue instance does not exists in VNode context
'
);
return
false
}
if
(
!
vm
.
$i18n
)
{
warn
(
'
VueI18n instance does not exists in Vue instance
'
);
return
false
}
return
true
}
function
localeEqual
(
el
,
vnode
)
{
var
vm
=
vnode
.
context
;
return
el
.
_locale
===
vm
.
$i18n
.
locale
}
function
t
(
el
,
binding
,
vnode
)
{
var
ref$1
,
ref$2
;
var
value
=
binding
.
value
;
var
ref
=
parseValue
(
value
);
var
path
=
ref
.
path
;
var
locale
=
ref
.
locale
;
var
args
=
ref
.
args
;
var
choice
=
ref
.
choice
;
if
(
!
path
&&
!
locale
&&
!
args
)
{
warn
(
'
value type not supported
'
);
return
}
if
(
!
path
)
{
warn
(
'
`path` is required in v-t directive
'
);
return
}
var
vm
=
vnode
.
context
;
if
(
choice
!=
null
)
{
el
.
_vt
=
el
.
textContent
=
(
ref$1
=
vm
.
$i18n
).
tc
.
apply
(
ref$1
,
[
path
,
choice
].
concat
(
makeParams
(
locale
,
args
)
));
}
else
{
el
.
_vt
=
el
.
textContent
=
(
ref$2
=
vm
.
$i18n
).
t
.
apply
(
ref$2
,
[
path
].
concat
(
makeParams
(
locale
,
args
)
));
}
el
.
_locale
=
vm
.
$i18n
.
locale
;
el
.
_localeMessage
=
vm
.
$i18n
.
getLocaleMessage
(
vm
.
$i18n
.
locale
);
}
function
parseValue
(
value
)
{
var
path
;
var
locale
;
var
args
;
var
choice
;
if
(
isString
(
value
))
{
path
=
value
;
}
else
if
(
isPlainObject
(
value
))
{
path
=
value
.
path
;
locale
=
value
.
locale
;
args
=
value
.
args
;
choice
=
value
.
choice
;
}
return
{
path
:
path
,
locale
:
locale
,
args
:
args
,
choice
:
choice
}
}
function
makeParams
(
locale
,
args
)
{
var
params
=
[];
locale
&&
params
.
push
(
locale
);
if
(
args
&&
(
Array
.
isArray
(
args
)
||
isPlainObject
(
args
)))
{
params
.
push
(
args
);
}
return
params
}
var
Vue
;
function
install
(
_Vue
)
{
/* istanbul ignore if */
if
(
install
.
installed
&&
_Vue
===
Vue
)
{
warn
(
'
already installed.
'
);
return
}
install
.
installed
=
true
;
Vue
=
_Vue
;
var
version
=
(
Vue
.
version
&&
Number
(
Vue
.
version
.
split
(
'
.
'
)[
0
]))
||
-
1
;
/* istanbul ignore if */
if
(
version
<
2
)
{
warn
((
"
vue-i18n (
"
+
(
install
.
version
)
+
"
) need to use Vue 2.0 or later (Vue:
"
+
(
Vue
.
version
)
+
"
).
"
));
return
}
extend
(
Vue
);
Vue
.
mixin
(
mixin
);
Vue
.
directive
(
'
t
'
,
{
bind
:
bind
,
update
:
update
,
unbind
:
unbind
});
Vue
.
component
(
interpolationComponent
.
name
,
interpolationComponent
);
Vue
.
component
(
numberComponent
.
name
,
numberComponent
);
// use simple mergeStrategies to prevent i18n instance lose '__proto__'
var
strats
=
Vue
.
config
.
optionMergeStrategies
;
strats
.
i18n
=
function
(
parentVal
,
childVal
)
{
return
childVal
===
undefined
?
parentVal
:
childVal
};
}
/* */
var
BaseFormatter
=
function
BaseFormatter
()
{
this
.
_caches
=
Object
.
create
(
null
);
};
BaseFormatter
.
prototype
.
interpolate
=
function
interpolate
(
message
,
values
)
{
if
(
!
values
)
{
return
[
message
]
}
var
tokens
=
this
.
_caches
[
message
];
if
(
!
tokens
)
{
tokens
=
parse
(
message
);
this
.
_caches
[
message
]
=
tokens
;
}
return
compile
(
tokens
,
values
)
};
var
RE_TOKEN_LIST_VALUE
=
/^
(?:\d)
+/
;
var
RE_TOKEN_NAMED_VALUE
=
/^
(?:\w)
+/
;
function
parse
(
format
)
{
var
tokens
=
[];
var
position
=
0
;
var
text
=
''
;
while
(
position
<
format
.
length
)
{
var
char
=
format
[
position
++
];
if
(
char
===
'
{
'
)
{
if
(
text
)
{
tokens
.
push
({
type
:
'
text
'
,
value
:
text
});
}
text
=
''
;
var
sub
=
''
;
char
=
format
[
position
++
];
while
(
char
!==
undefined
&&
char
!==
'
}
'
)
{
sub
+=
char
;
char
=
format
[
position
++
];
}
var
isClosed
=
char
===
'
}
'
;
var
type
=
RE_TOKEN_LIST_VALUE
.
test
(
sub
)
?
'
list
'
:
isClosed
&&
RE_TOKEN_NAMED_VALUE
.
test
(
sub
)
?
'
named
'
:
'
unknown
'
;
tokens
.
push
({
value
:
sub
,
type
:
type
});
}
else
if
(
char
===
'
%
'
)
{
// when found rails i18n syntax, skip text capture
if
(
format
[(
position
)]
!==
'
{
'
)
{
text
+=
char
;
}
}
else
{
text
+=
char
;
}
}
text
&&
tokens
.
push
({
type
:
'
text
'
,
value
:
text
});
return
tokens
}
function
compile
(
tokens
,
values
)
{
var
compiled
=
[];
var
index
=
0
;
var
mode
=
Array
.
isArray
(
values
)
?
'
list
'
:
isObject
(
values
)
?
'
named
'
:
'
unknown
'
;
if
(
mode
===
'
unknown
'
)
{
return
compiled
}
while
(
index
<
tokens
.
length
)
{
var
token
=
tokens
[
index
];
switch
(
token
.
type
)
{
case
'
text
'
:
compiled
.
push
(
token
.
value
);
break
case
'
list
'
:
compiled
.
push
(
values
[
parseInt
(
token
.
value
,
10
)]);
break
case
'
named
'
:
if
(
mode
===
'
named
'
)
{
compiled
.
push
((
values
)[
token
.
value
]);
}
else
{
{
warn
((
"
Type of token '
"
+
(
token
.
type
)
+
"
' and format of value '
"
+
mode
+
"
' don't match!
"
));
}
}
break
case
'
unknown
'
:
{
warn
(
"
Detect 'unknown' type of token!
"
);
}
break
}
index
++
;
}
return
compiled
}
/* */
/**
* Path parser
* - Inspired:
* Vue.js Path parser
*/
// actions
var
APPEND
=
0
;
var
PUSH
=
1
;
var
INC_SUB_PATH_DEPTH
=
2
;
var
PUSH_SUB_PATH
=
3
;
// states
var
BEFORE_PATH
=
0
;
var
IN_PATH
=
1
;
var
BEFORE_IDENT
=
2
;
var
IN_IDENT
=
3
;
var
IN_SUB_PATH
=
4
;
var
IN_SINGLE_QUOTE
=
5
;
var
IN_DOUBLE_QUOTE
=
6
;
var
AFTER_PATH
=
7
;
var
ERROR
=
8
;
var
pathStateMachine
=
[];
pathStateMachine
[
BEFORE_PATH
]
=
{
'
ws
'
:
[
BEFORE_PATH
],
'
ident
'
:
[
IN_IDENT
,
APPEND
],
'
[
'
:
[
IN_SUB_PATH
],
'
eof
'
:
[
AFTER_PATH
]
};
pathStateMachine
[
IN_PATH
]
=
{
'
ws
'
:
[
IN_PATH
],
'
.
'
:
[
BEFORE_IDENT
],
'
[
'
:
[
IN_SUB_PATH
],
'
eof
'
:
[
AFTER_PATH
]
};
pathStateMachine
[
BEFORE_IDENT
]
=
{
'
ws
'
:
[
BEFORE_IDENT
],
'
ident
'
:
[
IN_IDENT
,
APPEND
],
'
0
'
:
[
IN_IDENT
,
APPEND
],
'
number
'
:
[
IN_IDENT
,
APPEND
]
};
pathStateMachine
[
IN_IDENT
]
=
{
'
ident
'
:
[
IN_IDENT
,
APPEND
],
'
0
'
:
[
IN_IDENT
,
APPEND
],
'
number
'
:
[
IN_IDENT
,
APPEND
],
'
ws
'
:
[
IN_PATH
,
PUSH
],
'
.
'
:
[
BEFORE_IDENT
,
PUSH
],
'
[
'
:
[
IN_SUB_PATH
,
PUSH
],
'
eof
'
:
[
AFTER_PATH
,
PUSH
]
};
pathStateMachine
[
IN_SUB_PATH
]
=
{
"
'
"
:
[
IN_SINGLE_QUOTE
,
APPEND
],
'
"
'
:
[
IN_DOUBLE_QUOTE
,
APPEND
],
'
[
'
:
[
IN_SUB_PATH
,
INC_SUB_PATH_DEPTH
],
'
]
'
:
[
IN_PATH
,
PUSH_SUB_PATH
],
'
eof
'
:
ERROR
,
'
else
'
:
[
IN_SUB_PATH
,
APPEND
]
};
pathStateMachine
[
IN_SINGLE_QUOTE
]
=
{
"
'
"
:
[
IN_SUB_PATH
,
APPEND
],
'
eof
'
:
ERROR
,
'
else
'
:
[
IN_SINGLE_QUOTE
,
APPEND
]
};
pathStateMachine
[
IN_DOUBLE_QUOTE
]
=
{
'
"
'
:
[
IN_SUB_PATH
,
APPEND
],
'
eof
'
:
ERROR
,
'
else
'
:
[
IN_DOUBLE_QUOTE
,
APPEND
]
};
/**
* Check if an expression is a literal value.
*/
var
literalValueRE
=
/^
\s?(?:
true|false|-
?[\d
.
]
+|'
[^
'
]
*'|"
[^
"
]
*"
)\s?
$/
;
function
isLiteral
(
exp
)
{
return
literalValueRE
.
test
(
exp
)
}
/**
* Strip quotes from a string
*/
function
stripQuotes
(
str
)
{
var
a
=
str
.
charCodeAt
(
0
);
var
b
=
str
.
charCodeAt
(
str
.
length
-
1
);
return
a
===
b
&&
(
a
===
0x22
||
a
===
0x27
)
?
str
.
slice
(
1
,
-
1
)
:
str
}
/**
* Determine the type of a character in a keypath.
*/
function
getPathCharType
(
ch
)
{
if
(
ch
===
undefined
||
ch
===
null
)
{
return
'
eof
'
}
var
code
=
ch
.
charCodeAt
(
0
);
switch
(
code
)
{
case
0x5B
:
// [
case
0x5D
:
// ]
case
0x2E
:
// .
case
0x22
:
// "
case
0x27
:
// '
return
ch
case
0x5F
:
// _
case
0x24
:
// $
case
0x2D
:
// -
return
'
ident
'
case
0x09
:
// Tab
case
0x0A
:
// Newline
case
0x0D
:
// Return
case
0xA0
:
// No-break space
case
0xFEFF
:
// Byte Order Mark
case
0x2028
:
// Line Separator
case
0x2029
:
// Paragraph Separator
return
'
ws
'
}
return
'
ident
'
}
/**
* Format a subPath, return its plain form if it is
* a literal string or number. Otherwise prepend the
* dynamic indicator (*).
*/
function
formatSubPath
(
path
)
{
var
trimmed
=
path
.
trim
();
// invalid leading 0
if
(
path
.
charAt
(
0
)
===
'
0
'
&&
isNaN
(
path
))
{
return
false
}
return
isLiteral
(
trimmed
)
?
stripQuotes
(
trimmed
)
:
'
*
'
+
trimmed
}
/**
* Parse a string path into an array of segments
*/
function
parse$1
(
path
)
{
var
keys
=
[];
var
index
=
-
1
;
var
mode
=
BEFORE_PATH
;
var
subPathDepth
=
0
;
var
c
;
var
key
;
var
newChar
;
var
type
;
var
transition
;
var
action
;
var
typeMap
;
var
actions
=
[];
actions
[
PUSH
]
=
function
()
{
if
(
key
!==
undefined
)
{
keys
.
push
(
key
);
key
=
undefined
;
}
};
actions
[
APPEND
]
=
function
()
{
if
(
key
===
undefined
)
{
key
=
newChar
;
}
else
{
key
+=
newChar
;
}
};
actions
[
INC_SUB_PATH_DEPTH
]
=
function
()
{
actions
[
APPEND
]();
subPathDepth
++
;
};
actions
[
PUSH_SUB_PATH
]
=
function
()
{
if
(
subPathDepth
>
0
)
{
subPathDepth
--
;
mode
=
IN_SUB_PATH
;
actions
[
APPEND
]();
}
else
{
subPathDepth
=
0
;
if
(
key
===
undefined
)
{
return
false
}
key
=
formatSubPath
(
key
);
if
(
key
===
false
)
{
return
false
}
else
{
actions
[
PUSH
]();
}
}
};
function
maybeUnescapeQuote
()
{
var
nextChar
=
path
[
index
+
1
];
if
((
mode
===
IN_SINGLE_QUOTE
&&
nextChar
===
"
'
"
)
||
(
mode
===
IN_DOUBLE_QUOTE
&&
nextChar
===
'
"
'
))
{
index
++
;
newChar
=
'
\\
'
+
nextChar
;
actions
[
APPEND
]();
return
true
}
}
while
(
mode
!==
null
)
{
index
++
;
c
=
path
[
index
];
if
(
c
===
'
\\
'
&&
maybeUnescapeQuote
())
{
continue
}
type
=
getPathCharType
(
c
);
typeMap
=
pathStateMachine
[
mode
];
transition
=
typeMap
[
type
]
||
typeMap
[
'
else
'
]
||
ERROR
;
if
(
transition
===
ERROR
)
{
return
// parse error
}
mode
=
transition
[
0
];
action
=
actions
[
transition
[
1
]];
if
(
action
)
{
newChar
=
transition
[
2
];
newChar
=
newChar
===
undefined
?
c
:
newChar
;
if
(
action
()
===
false
)
{
return
}
}
if
(
mode
===
AFTER_PATH
)
{
return
keys
}
}
}
var
I18nPath
=
function
I18nPath
()
{
this
.
_cache
=
Object
.
create
(
null
);
};
/**
* External parse that check for a cache hit first
*/
I18nPath
.
prototype
.
parsePath
=
function
parsePath
(
path
)
{
var
hit
=
this
.
_cache
[
path
];
if
(
!
hit
)
{
hit
=
parse$1
(
path
);
if
(
hit
)
{
this
.
_cache
[
path
]
=
hit
;
}
}
return
hit
||
[]
};
/**
* Get path value from path string
*/
I18nPath
.
prototype
.
getPathValue
=
function
getPathValue
(
obj
,
path
)
{
if
(
!
isObject
(
obj
))
{
return
null
}
var
paths
=
this
.
parsePath
(
path
);
if
(
paths
.
length
===
0
)
{
return
null
}
else
{
var
length
=
paths
.
length
;
var
last
=
obj
;
var
i
=
0
;
while
(
i
<
length
)
{
var
value
=
last
[
paths
[
i
]];
if
(
value
===
undefined
)
{
return
null
}
last
=
value
;
i
++
;
}
return
last
}
};
/* */
var
htmlTagMatcher
=
/<
\/?[\w\s
="
/
.':;#-
\/]
+>/
;
var
linkKeyMatcher
=
/
(?:
@
(?:\.[
a-z
]
+
)?
:
(?:[\w\-
_|.
]
+|
\([\w\-
_|.
]
+
\)))
/g
;
var
linkKeyPrefixMatcher
=
/^@
(?:\.([
a-z
]
+
))?
:/
;
var
bracketsMatcher
=
/
[
()
]
/g
;
var
defaultModifiers
=
{
'
upper
'
:
function
(
str
)
{
return
str
.
toLocaleUpperCase
();
},
'
lower
'
:
function
(
str
)
{
return
str
.
toLocaleLowerCase
();
},
'
capitalize
'
:
function
(
str
)
{
return
(
""
+
(
str
.
charAt
(
0
).
toLocaleUpperCase
())
+
(
str
.
substr
(
1
)));
}
};
var
defaultFormatter
=
new
BaseFormatter
();
var
VueI18n
=
function
VueI18n
(
options
)
{
var
this
$1
=
this
;
if
(
options
===
void
0
)
options
=
{};
// Auto install if it is not done yet and `window` has `Vue`.
// To allow users to avoid auto-installation in some cases,
// this code should be placed here. See #290
/* istanbul ignore if */
if
(
!
Vue
&&
typeof
window
!==
'
undefined
'
&&
window
.
Vue
)
{
install
(
window
.
Vue
);
}
var
locale
=
options
.
locale
||
'
en-US
'
;
var
fallbackLocale
=
options
.
fallbackLocale
===
false
?
false
:
options
.
fallbackLocale
||
'
en-US
'
;
var
messages
=
options
.
messages
||
{};
var
dateTimeFormats
=
options
.
dateTimeFormats
||
{};
var
numberFormats
=
options
.
numberFormats
||
{};
this
.
_vm
=
null
;
this
.
_formatter
=
options
.
formatter
||
defaultFormatter
;
this
.
_modifiers
=
options
.
modifiers
||
{};
this
.
_missing
=
options
.
missing
||
null
;
this
.
_root
=
options
.
root
||
null
;
this
.
_sync
=
options
.
sync
===
undefined
?
true
:
!!
options
.
sync
;
this
.
_fallbackRoot
=
options
.
fallbackRoot
===
undefined
?
true
:
!!
options
.
fallbackRoot
;
this
.
_formatFallbackMessages
=
options
.
formatFallbackMessages
===
undefined
?
false
:
!!
options
.
formatFallbackMessages
;
this
.
_silentTranslationWarn
=
options
.
silentTranslationWarn
===
undefined
?
false
:
options
.
silentTranslationWarn
;
this
.
_silentFallbackWarn
=
options
.
silentFallbackWarn
===
undefined
?
false
:
!!
options
.
silentFallbackWarn
;
this
.
_dateTimeFormatters
=
{};
this
.
_numberFormatters
=
{};
this
.
_path
=
new
I18nPath
();
this
.
_dataListeners
=
[];
this
.
_componentInstanceCreatedListener
=
options
.
componentInstanceCreatedListener
||
null
;
this
.
_preserveDirectiveContent
=
options
.
preserveDirectiveContent
===
undefined
?
false
:
!!
options
.
preserveDirectiveContent
;
this
.
pluralizationRules
=
options
.
pluralizationRules
||
{};
this
.
_warnHtmlInMessage
=
options
.
warnHtmlInMessage
||
'
off
'
;
this
.
_postTranslation
=
options
.
postTranslation
||
null
;
/**
* @param choice {number} a choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)`
* @param choicesLength {number} an overall amount of available choices
* @returns a final choice index
*/
this
.
getChoiceIndex
=
function
(
choice
,
choicesLength
)
{
var
thisPrototype
=
Object
.
getPrototypeOf
(
this
$1
);
if
(
thisPrototype
&&
thisPrototype
.
getChoiceIndex
)
{
var
prototypeGetChoiceIndex
=
(
thisPrototype
.
getChoiceIndex
);
return
(
prototypeGetChoiceIndex
).
call
(
this
$1
,
choice
,
choicesLength
)
}
// Default (old) getChoiceIndex implementation - english-compatible
var
defaultImpl
=
function
(
_choice
,
_choicesLength
)
{
_choice
=
Math
.
abs
(
_choice
);
if
(
_choicesLength
===
2
)
{
return
_choice
?
_choice
>
1
?
1
:
0
:
1
}
return
_choice
?
Math
.
min
(
_choice
,
2
)
:
0
};
if
(
this
$1
.
locale
in
this
$1
.
pluralizationRules
)
{
return
this
$1
.
pluralizationRules
[
this
$1
.
locale
].
apply
(
this
$1
,
[
choice
,
choicesLength
])
}
else
{
return
defaultImpl
(
choice
,
choicesLength
)
}
};
this
.
_exist
=
function
(
message
,
key
)
{
if
(
!
message
||
!
key
)
{
return
false
}
if
(
!
isNull
(
this
$1
.
_path
.
getPathValue
(
message
,
key
)))
{
return
true
}
// fallback for flat key
if
(
message
[
key
])
{
return
true
}
return
false
};
if
(
this
.
_warnHtmlInMessage
===
'
warn
'
||
this
.
_warnHtmlInMessage
===
'
error
'
)
{
Object
.
keys
(
messages
).
forEach
(
function
(
locale
)
{
this
$1
.
_checkLocaleMessage
(
locale
,
this
$1
.
_warnHtmlInMessage
,
messages
[
locale
]);
});
}
this
.
_initVM
({
locale
:
locale
,
fallbackLocale
:
fallbackLocale
,
messages
:
messages
,
dateTimeFormats
:
dateTimeFormats
,
numberFormats
:
numberFormats
});
};
var
prototypeAccessors
=
{
vm
:
{
configurable
:
true
},
messages
:
{
configurable
:
true
},
dateTimeFormats
:
{
configurable
:
true
},
numberFormats
:
{
configurable
:
true
},
availableLocales
:
{
configurable
:
true
},
locale
:
{
configurable
:
true
},
fallbackLocale
:
{
configurable
:
true
},
formatFallbackMessages
:
{
configurable
:
true
},
missing
:
{
configurable
:
true
},
formatter
:
{
configurable
:
true
},
silentTranslationWarn
:
{
configurable
:
true
},
silentFallbackWarn
:
{
configurable
:
true
},
preserveDirectiveContent
:
{
configurable
:
true
},
warnHtmlInMessage
:
{
configurable
:
true
},
postTranslation
:
{
configurable
:
true
}
};
VueI18n
.
prototype
.
_checkLocaleMessage
=
function
_checkLocaleMessage
(
locale
,
level
,
message
)
{
var
paths
=
[];
var
fn
=
function
(
level
,
locale
,
message
,
paths
)
{
if
(
isPlainObject
(
message
))
{
Object
.
keys
(
message
).
forEach
(
function
(
key
)
{
var
val
=
message
[
key
];
if
(
isPlainObject
(
val
))
{
paths
.
push
(
key
);
paths
.
push
(
'
.
'
);
fn
(
level
,
locale
,
val
,
paths
);
paths
.
pop
();
paths
.
pop
();
}
else
{
paths
.
push
(
key
);
fn
(
level
,
locale
,
val
,
paths
);
paths
.
pop
();
}
});
}
else
if
(
Array
.
isArray
(
message
))
{
message
.
forEach
(
function
(
item
,
index
)
{
if
(
isPlainObject
(
item
))
{
paths
.
push
((
"
[
"
+
index
+
"
]
"
));
paths
.
push
(
'
.
'
);
fn
(
level
,
locale
,
item
,
paths
);
paths
.
pop
();
paths
.
pop
();
}
else
{
paths
.
push
((
"
[
"
+
index
+
"
]
"
));
fn
(
level
,
locale
,
item
,
paths
);
paths
.
pop
();
}
});
}
else
if
(
isString
(
message
))
{
var
ret
=
htmlTagMatcher
.
test
(
message
);
if
(
ret
)
{
var
msg
=
"
Detected HTML in message '
"
+
message
+
"
' of keypath '
"
+
(
paths
.
join
(
''
))
+
"
' at '
"
+
locale
+
"
'. Consider component interpolation with '<i18n>' to avoid XSS. See https://bit.ly/2ZqJzkp
"
;
if
(
level
===
'
warn
'
)
{
warn
(
msg
);
}
else
if
(
level
===
'
error
'
)
{
error
(
msg
);
}
}
}
};
fn
(
level
,
locale
,
message
,
paths
);
};
VueI18n
.
prototype
.
_initVM
=
function
_initVM
(
data
)
{
var
silent
=
Vue
.
config
.
silent
;
Vue
.
config
.
silent
=
true
;
this
.
_vm
=
new
Vue
({
data
:
data
});
Vue
.
config
.
silent
=
silent
;
};
VueI18n
.
prototype
.
destroyVM
=
function
destroyVM
()
{
this
.
_vm
.
$destroy
();
};
VueI18n
.
prototype
.
subscribeDataChanging
=
function
subscribeDataChanging
(
vm
)
{
this
.
_dataListeners
.
push
(
vm
);
};
VueI18n
.
prototype
.
unsubscribeDataChanging
=
function
unsubscribeDataChanging
(
vm
)
{
remove
(
this
.
_dataListeners
,
vm
);
};
VueI18n
.
prototype
.
watchI18nData
=
function
watchI18nData
()
{
var
self
=
this
;
return
this
.
_vm
.
$watch
(
'
$data
'
,
function
()
{
var
i
=
self
.
_dataListeners
.
length
;
while
(
i
--
)
{
Vue
.
nextTick
(
function
()
{
self
.
_dataListeners
[
i
]
&&
self
.
_dataListeners
[
i
].
$forceUpdate
();
});
}
},
{
deep
:
true
})
};
VueI18n
.
prototype
.
watchLocale
=
function
watchLocale
()
{
/* istanbul ignore if */
if
(
!
this
.
_sync
||
!
this
.
_root
)
{
return
null
}
var
target
=
this
.
_vm
;
return
this
.
_root
.
$i18n
.
vm
.
$watch
(
'
locale
'
,
function
(
val
)
{
target
.
$set
(
target
,
'
locale
'
,
val
);
target
.
$forceUpdate
();
},
{
immediate
:
true
})
};
VueI18n
.
prototype
.
onComponentInstanceCreated
=
function
onComponentInstanceCreated
(
newI18n
)
{
if
(
this
.
_componentInstanceCreatedListener
)
{
this
.
_componentInstanceCreatedListener
(
newI18n
,
this
);
}
};
prototypeAccessors
.
vm
.
get
=
function
()
{
return
this
.
_vm
};
prototypeAccessors
.
messages
.
get
=
function
()
{
return
looseClone
(
this
.
_getMessages
())
};
prototypeAccessors
.
dateTimeFormats
.
get
=
function
()
{
return
looseClone
(
this
.
_getDateTimeFormats
())
};
prototypeAccessors
.
numberFormats
.
get
=
function
()
{
return
looseClone
(
this
.
_getNumberFormats
())
};
prototypeAccessors
.
availableLocales
.
get
=
function
()
{
return
Object
.
keys
(
this
.
messages
).
sort
()
};
prototypeAccessors
.
locale
.
get
=
function
()
{
return
this
.
_vm
.
locale
};
prototypeAccessors
.
locale
.
set
=
function
(
locale
)
{
this
.
_vm
.
$set
(
this
.
_vm
,
'
locale
'
,
locale
);
};
prototypeAccessors
.
fallbackLocale
.
get
=
function
()
{
return
this
.
_vm
.
fallbackLocale
};
prototypeAccessors
.
fallbackLocale
.
set
=
function
(
locale
)
{
this
.
_localeChainCache
=
{};
this
.
_vm
.
$set
(
this
.
_vm
,
'
fallbackLocale
'
,
locale
);
};
prototypeAccessors
.
formatFallbackMessages
.
get
=
function
()
{
return
this
.
_formatFallbackMessages
};
prototypeAccessors
.
formatFallbackMessages
.
set
=
function
(
fallback
)
{
this
.
_formatFallbackMessages
=
fallback
;
};
prototypeAccessors
.
missing
.
get
=
function
()
{
return
this
.
_missing
};
prototypeAccessors
.
missing
.
set
=
function
(
handler
)
{
this
.
_missing
=
handler
;
};
prototypeAccessors
.
formatter
.
get
=
function
()
{
return
this
.
_formatter
};
prototypeAccessors
.
formatter
.
set
=
function
(
formatter
)
{
this
.
_formatter
=
formatter
;
};
prototypeAccessors
.
silentTranslationWarn
.
get
=
function
()
{
return
this
.
_silentTranslationWarn
};
prototypeAccessors
.
silentTranslationWarn
.
set
=
function
(
silent
)
{
this
.
_silentTranslationWarn
=
silent
;
};
prototypeAccessors
.
silentFallbackWarn
.
get
=
function
()
{
return
this
.
_silentFallbackWarn
};
prototypeAccessors
.
silentFallbackWarn
.
set
=
function
(
silent
)
{
this
.
_silentFallbackWarn
=
silent
;
};
prototypeAccessors
.
preserveDirectiveContent
.
get
=
function
()
{
return
this
.
_preserveDirectiveContent
};
prototypeAccessors
.
preserveDirectiveContent
.
set
=
function
(
preserve
)
{
this
.
_preserveDirectiveContent
=
preserve
;
};
prototypeAccessors
.
warnHtmlInMessage
.
get
=
function
()
{
return
this
.
_warnHtmlInMessage
};
prototypeAccessors
.
warnHtmlInMessage
.
set
=
function
(
level
)
{
var
this
$1
=
this
;
var
orgLevel
=
this
.
_warnHtmlInMessage
;
this
.
_warnHtmlInMessage
=
level
;
if
(
orgLevel
!==
level
&&
(
level
===
'
warn
'
||
level
===
'
error
'
))
{
var
messages
=
this
.
_getMessages
();
Object
.
keys
(
messages
).
forEach
(
function
(
locale
)
{
this
$1
.
_checkLocaleMessage
(
locale
,
this
$1
.
_warnHtmlInMessage
,
messages
[
locale
]);
});
}
};
prototypeAccessors
.
postTranslation
.
get
=
function
()
{
return
this
.
_postTranslation
};
prototypeAccessors
.
postTranslation
.
set
=
function
(
handler
)
{
this
.
_postTranslation
=
handler
;
};
VueI18n
.
prototype
.
_getMessages
=
function
_getMessages
()
{
return
this
.
_vm
.
messages
};
VueI18n
.
prototype
.
_getDateTimeFormats
=
function
_getDateTimeFormats
()
{
return
this
.
_vm
.
dateTimeFormats
};
VueI18n
.
prototype
.
_getNumberFormats
=
function
_getNumberFormats
()
{
return
this
.
_vm
.
numberFormats
};
VueI18n
.
prototype
.
_warnDefault
=
function
_warnDefault
(
locale
,
key
,
result
,
vm
,
values
,
interpolateMode
)
{
if
(
!
isNull
(
result
))
{
return
result
}
if
(
this
.
_missing
)
{
var
missingRet
=
this
.
_missing
.
apply
(
null
,
[
locale
,
key
,
vm
,
values
]);
if
(
isString
(
missingRet
))
{
return
missingRet
}
}
else
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
))
{
warn
(
"
Cannot translate the value of keypath '
"
+
key
+
"
'.
"
+
'
Use the value of keypath as default.
'
);
}
}
if
(
this
.
_formatFallbackMessages
)
{
var
parsedArgs
=
parseArgs
.
apply
(
void
0
,
values
);
return
this
.
_render
(
key
,
interpolateMode
,
parsedArgs
.
params
,
key
)
}
else
{
return
key
}
};
VueI18n
.
prototype
.
_isFallbackRoot
=
function
_isFallbackRoot
(
val
)
{
return
!
val
&&
!
isNull
(
this
.
_root
)
&&
this
.
_fallbackRoot
};
VueI18n
.
prototype
.
_isSilentFallbackWarn
=
function
_isSilentFallbackWarn
(
key
)
{
return
this
.
_silentFallbackWarn
instanceof
RegExp
?
this
.
_silentFallbackWarn
.
test
(
key
)
:
this
.
_silentFallbackWarn
};
VueI18n
.
prototype
.
_isSilentFallback
=
function
_isSilentFallback
(
locale
,
key
)
{
return
this
.
_isSilentFallbackWarn
(
key
)
&&
(
this
.
_isFallbackRoot
()
||
locale
!==
this
.
fallbackLocale
)
};
VueI18n
.
prototype
.
_isSilentTranslationWarn
=
function
_isSilentTranslationWarn
(
key
)
{
return
this
.
_silentTranslationWarn
instanceof
RegExp
?
this
.
_silentTranslationWarn
.
test
(
key
)
:
this
.
_silentTranslationWarn
};
VueI18n
.
prototype
.
_interpolate
=
function
_interpolate
(
locale
,
message
,
key
,
host
,
interpolateMode
,
values
,
visitedLinkStack
)
{
if
(
!
message
)
{
return
null
}
var
pathRet
=
this
.
_path
.
getPathValue
(
message
,
key
);
if
(
Array
.
isArray
(
pathRet
)
||
isPlainObject
(
pathRet
))
{
return
pathRet
}
var
ret
;
if
(
isNull
(
pathRet
))
{
/* istanbul ignore else */
if
(
isPlainObject
(
message
))
{
ret
=
message
[
key
];
if
(
!
isString
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallback
(
locale
,
key
))
{
warn
((
"
Value of key '
"
+
key
+
"
' is not a string!
"
));
}
return
null
}
}
else
{
return
null
}
}
else
{
/* istanbul ignore else */
if
(
isString
(
pathRet
))
{
ret
=
pathRet
;
}
else
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallback
(
locale
,
key
))
{
warn
((
"
Value of key '
"
+
key
+
"
' is not a string!
"
));
}
return
null
}
}
// Check for the existence of links within the translated string
if
(
ret
.
indexOf
(
'
@:
'
)
>=
0
||
ret
.
indexOf
(
'
@.
'
)
>=
0
)
{
ret
=
this
.
_link
(
locale
,
message
,
ret
,
host
,
'
raw
'
,
values
,
visitedLinkStack
);
}
return
this
.
_render
(
ret
,
interpolateMode
,
values
,
key
)
};
VueI18n
.
prototype
.
_link
=
function
_link
(
locale
,
message
,
str
,
host
,
interpolateMode
,
values
,
visitedLinkStack
)
{
var
ret
=
str
;
// Match all the links within the local
// We are going to replace each of
// them with its translation
var
matches
=
ret
.
match
(
linkKeyMatcher
);
for
(
var
idx
in
matches
)
{
// ie compatible: filter custom array
// prototype method
if
(
!
matches
.
hasOwnProperty
(
idx
))
{
continue
}
var
link
=
matches
[
idx
];
var
linkKeyPrefixMatches
=
link
.
match
(
linkKeyPrefixMatcher
);
var
linkPrefix
=
linkKeyPrefixMatches
[
0
];
var
formatterName
=
linkKeyPrefixMatches
[
1
];
// Remove the leading @:, @.case: and the brackets
var
linkPlaceholder
=
link
.
replace
(
linkPrefix
,
''
).
replace
(
bracketsMatcher
,
''
);
if
(
includes
(
visitedLinkStack
,
linkPlaceholder
))
{
{
warn
((
"
Circular reference found.
\"
"
+
link
+
"
\"
is already visited in the chain of
"
+
(
visitedLinkStack
.
reverse
().
join
(
'
<-
'
))));
}
return
ret
}
visitedLinkStack
.
push
(
linkPlaceholder
);
// Translate the link
var
translated
=
this
.
_interpolate
(
locale
,
message
,
linkPlaceholder
,
host
,
interpolateMode
===
'
raw
'
?
'
string
'
:
interpolateMode
,
interpolateMode
===
'
raw
'
?
undefined
:
values
,
visitedLinkStack
);
if
(
this
.
_isFallbackRoot
(
translated
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
linkPlaceholder
))
{
warn
((
"
Fall back to translate the link placeholder '
"
+
linkPlaceholder
+
"
' with root locale.
"
));
}
/* istanbul ignore if */
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
var
root
=
this
.
_root
.
$i18n
;
translated
=
root
.
_translate
(
root
.
_getMessages
(),
root
.
locale
,
root
.
fallbackLocale
,
linkPlaceholder
,
host
,
interpolateMode
,
values
);
}
translated
=
this
.
_warnDefault
(
locale
,
linkPlaceholder
,
translated
,
host
,
Array
.
isArray
(
values
)
?
values
:
[
values
],
interpolateMode
);
if
(
this
.
_modifiers
.
hasOwnProperty
(
formatterName
))
{
translated
=
this
.
_modifiers
[
formatterName
](
translated
);
}
else
if
(
defaultModifiers
.
hasOwnProperty
(
formatterName
))
{
translated
=
defaultModifiers
[
formatterName
](
translated
);
}
visitedLinkStack
.
pop
();
// Replace the link with the translated
ret
=
!
translated
?
ret
:
ret
.
replace
(
link
,
translated
);
}
return
ret
};
VueI18n
.
prototype
.
_render
=
function
_render
(
message
,
interpolateMode
,
values
,
path
)
{
var
ret
=
this
.
_formatter
.
interpolate
(
message
,
values
,
path
);
// If the custom formatter refuses to work - apply the default one
if
(
!
ret
)
{
ret
=
defaultFormatter
.
interpolate
(
message
,
values
,
path
);
}
// if interpolateMode is **not** 'string' ('row'),
// return the compiled data (e.g. ['foo', VNode, 'bar']) with formatter
return
interpolateMode
===
'
string
'
&&
!
isString
(
ret
)
?
ret
.
join
(
''
)
:
ret
};
VueI18n
.
prototype
.
_appendItemToChain
=
function
_appendItemToChain
(
chain
,
item
,
blocks
)
{
var
follow
=
false
;
if
(
!
includes
(
chain
,
item
))
{
follow
=
true
;
if
(
item
)
{
follow
=
item
[
item
.
length
-
1
]
!==
'
!
'
;
item
=
item
.
replace
(
/!/g
,
''
);
chain
.
push
(
item
);
if
(
blocks
&&
blocks
[
item
])
{
follow
=
blocks
[
item
];
}
}
}
return
follow
};
VueI18n
.
prototype
.
_appendLocaleToChain
=
function
_appendLocaleToChain
(
chain
,
locale
,
blocks
)
{
var
follow
;
var
tokens
=
locale
.
split
(
'
-
'
);
do
{
var
item
=
tokens
.
join
(
'
-
'
);
follow
=
this
.
_appendItemToChain
(
chain
,
item
,
blocks
);
tokens
.
splice
(
-
1
,
1
);
}
while
(
tokens
.
length
&&
(
follow
===
true
))
return
follow
};
VueI18n
.
prototype
.
_appendBlockToChain
=
function
_appendBlockToChain
(
chain
,
block
,
blocks
)
{
var
follow
=
true
;
for
(
var
i
=
0
;
(
i
<
block
.
length
)
&&
(
isBoolean
(
follow
));
i
++
)
{
var
locale
=
block
[
i
];
if
(
isString
(
locale
))
{
follow
=
this
.
_appendLocaleToChain
(
chain
,
locale
,
blocks
);
}
}
return
follow
};
VueI18n
.
prototype
.
_getLocaleChain
=
function
_getLocaleChain
(
start
,
fallbackLocale
)
{
if
(
start
===
''
)
{
return
[]
}
if
(
!
this
.
_localeChainCache
)
{
this
.
_localeChainCache
=
{};
}
var
chain
=
this
.
_localeChainCache
[
start
];
if
(
!
chain
)
{
if
(
!
fallbackLocale
)
{
fallbackLocale
=
this
.
fallbackLocale
;
}
chain
=
[];
// first block defined by start
var
block
=
[
start
];
// while any intervening block found
while
(
isArray
(
block
))
{
block
=
this
.
_appendBlockToChain
(
chain
,
block
,
fallbackLocale
);
}
// last block defined by default
var
defaults
;
if
(
isArray
(
fallbackLocale
))
{
defaults
=
fallbackLocale
;
}
else
if
(
isObject
(
fallbackLocale
))
{
/* $FlowFixMe */
if
(
fallbackLocale
[
'
default
'
])
{
defaults
=
fallbackLocale
[
'
default
'
];
}
else
{
defaults
=
null
;
}
}
else
{
defaults
=
fallbackLocale
;
}
// convert defaults to array
if
(
isString
(
defaults
))
{
block
=
[
defaults
];
}
else
{
block
=
defaults
;
}
if
(
block
)
{
this
.
_appendBlockToChain
(
chain
,
block
,
null
);
}
this
.
_localeChainCache
[
start
]
=
chain
;
}
return
chain
};
VueI18n
.
prototype
.
_translate
=
function
_translate
(
messages
,
locale
,
fallback
,
key
,
host
,
interpolateMode
,
args
)
{
var
chain
=
this
.
_getLocaleChain
(
locale
,
fallback
);
var
res
;
for
(
var
i
=
0
;
i
<
chain
.
length
;
i
++
)
{
var
step
=
chain
[
i
];
res
=
this
.
_interpolate
(
step
,
messages
[
step
],
key
,
host
,
interpolateMode
,
args
,
[
key
]);
if
(
!
isNull
(
res
))
{
if
(
step
!==
locale
&&
"
development
"
!==
'
production
'
&&
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to translate the keypath '
"
+
key
+
"
' with '
"
+
step
+
"
' locale.
"
));
}
return
res
}
}
return
null
};
VueI18n
.
prototype
.
_t
=
function
_t
(
key
,
_locale
,
messages
,
host
)
{
var
ref
;
var
values
=
[],
len
=
arguments
.
length
-
4
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
4
];
if
(
!
key
)
{
return
''
}
var
parsedArgs
=
parseArgs
.
apply
(
void
0
,
values
);
var
locale
=
parsedArgs
.
locale
||
_locale
;
var
ret
=
this
.
_translate
(
messages
,
locale
,
this
.
fallbackLocale
,
key
,
host
,
'
string
'
,
parsedArgs
.
params
);
if
(
this
.
_isFallbackRoot
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to translate the keypath '
"
+
key
+
"
' with root locale.
"
));
}
/* istanbul ignore if */
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
return
(
ref
=
this
.
_root
).
$t
.
apply
(
ref
,
[
key
].
concat
(
values
))
}
else
{
ret
=
this
.
_warnDefault
(
locale
,
key
,
ret
,
host
,
values
,
'
string
'
);
if
(
this
.
_postTranslation
&&
ret
!==
null
&&
ret
!==
undefined
)
{
ret
=
this
.
_postTranslation
(
ret
,
key
);
}
return
ret
}
};
VueI18n
.
prototype
.
t
=
function
t
(
key
)
{
var
ref
;
var
values
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
1
];
return
(
ref
=
this
).
_t
.
apply
(
ref
,
[
key
,
this
.
locale
,
this
.
_getMessages
(),
null
].
concat
(
values
))
};
VueI18n
.
prototype
.
_i
=
function
_i
(
key
,
locale
,
messages
,
host
,
values
)
{
var
ret
=
this
.
_translate
(
messages
,
locale
,
this
.
fallbackLocale
,
key
,
host
,
'
raw
'
,
values
);
if
(
this
.
_isFallbackRoot
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
))
{
warn
((
"
Fall back to interpolate the keypath '
"
+
key
+
"
' with root locale.
"
));
}
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
return
this
.
_root
.
$i18n
.
i
(
key
,
locale
,
values
)
}
else
{
return
this
.
_warnDefault
(
locale
,
key
,
ret
,
host
,
[
values
],
'
raw
'
)
}
};
VueI18n
.
prototype
.
i
=
function
i
(
key
,
locale
,
values
)
{
/* istanbul ignore if */
if
(
!
key
)
{
return
''
}
if
(
!
isString
(
locale
))
{
locale
=
this
.
locale
;
}
return
this
.
_i
(
key
,
locale
,
this
.
_getMessages
(),
null
,
values
)
};
VueI18n
.
prototype
.
_tc
=
function
_tc
(
key
,
_locale
,
messages
,
host
,
choice
)
{
var
ref
;
var
values
=
[],
len
=
arguments
.
length
-
5
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
5
];
if
(
!
key
)
{
return
''
}
if
(
choice
===
undefined
)
{
choice
=
1
;
}
var
predefined
=
{
'
count
'
:
choice
,
'
n
'
:
choice
};
var
parsedArgs
=
parseArgs
.
apply
(
void
0
,
values
);
parsedArgs
.
params
=
Object
.
assign
(
predefined
,
parsedArgs
.
params
);
values
=
parsedArgs
.
locale
===
null
?
[
parsedArgs
.
params
]
:
[
parsedArgs
.
locale
,
parsedArgs
.
params
];
return
this
.
fetchChoice
((
ref
=
this
).
_t
.
apply
(
ref
,
[
key
,
_locale
,
messages
,
host
].
concat
(
values
)),
choice
)
};
VueI18n
.
prototype
.
fetchChoice
=
function
fetchChoice
(
message
,
choice
)
{
/* istanbul ignore if */
if
(
!
message
&&
!
isString
(
message
))
{
return
null
}
var
choices
=
message
.
split
(
'
|
'
);
choice
=
this
.
getChoiceIndex
(
choice
,
choices
.
length
);
if
(
!
choices
[
choice
])
{
return
message
}
return
choices
[
choice
].
trim
()
};
VueI18n
.
prototype
.
tc
=
function
tc
(
key
,
choice
)
{
var
ref
;
var
values
=
[],
len
=
arguments
.
length
-
2
;
while
(
len
--
>
0
)
values
[
len
]
=
arguments
[
len
+
2
];
return
(
ref
=
this
).
_tc
.
apply
(
ref
,
[
key
,
this
.
locale
,
this
.
_getMessages
(),
null
,
choice
].
concat
(
values
))
};
VueI18n
.
prototype
.
_te
=
function
_te
(
key
,
locale
,
messages
)
{
var
args
=
[],
len
=
arguments
.
length
-
3
;
while
(
len
--
>
0
)
args
[
len
]
=
arguments
[
len
+
3
];
var
_locale
=
parseArgs
.
apply
(
void
0
,
args
).
locale
||
locale
;
return
this
.
_exist
(
messages
[
_locale
],
key
)
};
VueI18n
.
prototype
.
te
=
function
te
(
key
,
locale
)
{
return
this
.
_te
(
key
,
this
.
locale
,
this
.
_getMessages
(),
locale
)
};
VueI18n
.
prototype
.
getLocaleMessage
=
function
getLocaleMessage
(
locale
)
{
return
looseClone
(
this
.
_vm
.
messages
[
locale
]
||
{})
};
VueI18n
.
prototype
.
setLocaleMessage
=
function
setLocaleMessage
(
locale
,
message
)
{
if
(
this
.
_warnHtmlInMessage
===
'
warn
'
||
this
.
_warnHtmlInMessage
===
'
error
'
)
{
this
.
_checkLocaleMessage
(
locale
,
this
.
_warnHtmlInMessage
,
message
);
}
this
.
_vm
.
$set
(
this
.
_vm
.
messages
,
locale
,
message
);
};
VueI18n
.
prototype
.
mergeLocaleMessage
=
function
mergeLocaleMessage
(
locale
,
message
)
{
if
(
this
.
_warnHtmlInMessage
===
'
warn
'
||
this
.
_warnHtmlInMessage
===
'
error
'
)
{
this
.
_checkLocaleMessage
(
locale
,
this
.
_warnHtmlInMessage
,
message
);
}
this
.
_vm
.
$set
(
this
.
_vm
.
messages
,
locale
,
merge
({},
this
.
_vm
.
messages
[
locale
]
||
{},
message
));
};
VueI18n
.
prototype
.
getDateTimeFormat
=
function
getDateTimeFormat
(
locale
)
{
return
looseClone
(
this
.
_vm
.
dateTimeFormats
[
locale
]
||
{})
};
VueI18n
.
prototype
.
setDateTimeFormat
=
function
setDateTimeFormat
(
locale
,
format
)
{
this
.
_vm
.
$set
(
this
.
_vm
.
dateTimeFormats
,
locale
,
format
);
this
.
_clearDateTimeFormat
(
locale
,
format
);
};
VueI18n
.
prototype
.
mergeDateTimeFormat
=
function
mergeDateTimeFormat
(
locale
,
format
)
{
this
.
_vm
.
$set
(
this
.
_vm
.
dateTimeFormats
,
locale
,
merge
(
this
.
_vm
.
dateTimeFormats
[
locale
]
||
{},
format
));
this
.
_clearDateTimeFormat
(
locale
,
format
);
};
VueI18n
.
prototype
.
_clearDateTimeFormat
=
function
_clearDateTimeFormat
(
locale
,
format
)
{
for
(
var
key
in
format
)
{
var
id
=
locale
+
"
__
"
+
key
;
if
(
!
this
.
_dateTimeFormatters
.
hasOwnProperty
(
id
))
{
continue
}
delete
this
.
_dateTimeFormatters
[
id
];
}
};
VueI18n
.
prototype
.
_localizeDateTime
=
function
_localizeDateTime
(
value
,
locale
,
fallback
,
dateTimeFormats
,
key
)
{
var
_locale
=
locale
;
var
formats
=
dateTimeFormats
[
_locale
];
var
chain
=
this
.
_getLocaleChain
(
locale
,
fallback
);
for
(
var
i
=
0
;
i
<
chain
.
length
;
i
++
)
{
var
current
=
_locale
;
var
step
=
chain
[
i
];
formats
=
dateTimeFormats
[
step
];
_locale
=
step
;
// fallback locale
if
(
isNull
(
formats
)
||
isNull
(
formats
[
key
]))
{
if
(
step
!==
locale
&&
"
development
"
!==
'
production
'
&&
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to '
"
+
step
+
"
' datetime formats from '
"
+
current
+
"
' datetime formats.
"
));
}
}
else
{
break
}
}
if
(
isNull
(
formats
)
||
isNull
(
formats
[
key
]))
{
return
null
}
else
{
var
format
=
formats
[
key
];
var
id
=
_locale
+
"
__
"
+
key
;
var
formatter
=
this
.
_dateTimeFormatters
[
id
];
if
(
!
formatter
)
{
formatter
=
this
.
_dateTimeFormatters
[
id
]
=
new
Intl
.
DateTimeFormat
(
_locale
,
format
);
}
return
formatter
.
format
(
value
)
}
};
VueI18n
.
prototype
.
_d
=
function
_d
(
value
,
locale
,
key
)
{
/* istanbul ignore if */
if
(
!
VueI18n
.
availabilities
.
dateTimeFormat
)
{
warn
(
'
Cannot format a Date value due to not supported Intl.DateTimeFormat.
'
);
return
''
}
if
(
!
key
)
{
return
new
Intl
.
DateTimeFormat
(
locale
).
format
(
value
)
}
var
ret
=
this
.
_localizeDateTime
(
value
,
locale
,
this
.
fallbackLocale
,
this
.
_getDateTimeFormats
(),
key
);
if
(
this
.
_isFallbackRoot
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to datetime localization of root: key '
"
+
key
+
"
'.
"
));
}
/* istanbul ignore if */
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
return
this
.
_root
.
$i18n
.
d
(
value
,
key
,
locale
)
}
else
{
return
ret
||
''
}
};
VueI18n
.
prototype
.
d
=
function
d
(
value
)
{
var
args
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
args
[
len
]
=
arguments
[
len
+
1
];
var
locale
=
this
.
locale
;
var
key
=
null
;
if
(
args
.
length
===
1
)
{
if
(
isString
(
args
[
0
]))
{
key
=
args
[
0
];
}
else
if
(
isObject
(
args
[
0
]))
{
if
(
args
[
0
].
locale
)
{
locale
=
args
[
0
].
locale
;
}
if
(
args
[
0
].
key
)
{
key
=
args
[
0
].
key
;
}
}
}
else
if
(
args
.
length
===
2
)
{
if
(
isString
(
args
[
0
]))
{
key
=
args
[
0
];
}
if
(
isString
(
args
[
1
]))
{
locale
=
args
[
1
];
}
}
return
this
.
_d
(
value
,
locale
,
key
)
};
VueI18n
.
prototype
.
getNumberFormat
=
function
getNumberFormat
(
locale
)
{
return
looseClone
(
this
.
_vm
.
numberFormats
[
locale
]
||
{})
};
VueI18n
.
prototype
.
setNumberFormat
=
function
setNumberFormat
(
locale
,
format
)
{
this
.
_vm
.
$set
(
this
.
_vm
.
numberFormats
,
locale
,
format
);
this
.
_clearNumberFormat
(
locale
,
format
);
};
VueI18n
.
prototype
.
mergeNumberFormat
=
function
mergeNumberFormat
(
locale
,
format
)
{
this
.
_vm
.
$set
(
this
.
_vm
.
numberFormats
,
locale
,
merge
(
this
.
_vm
.
numberFormats
[
locale
]
||
{},
format
));
this
.
_clearNumberFormat
(
locale
,
format
);
};
VueI18n
.
prototype
.
_clearNumberFormat
=
function
_clearNumberFormat
(
locale
,
format
)
{
for
(
var
key
in
format
)
{
var
id
=
locale
+
"
__
"
+
key
;
if
(
!
this
.
_numberFormatters
.
hasOwnProperty
(
id
))
{
continue
}
delete
this
.
_numberFormatters
[
id
];
}
};
VueI18n
.
prototype
.
_getNumberFormatter
=
function
_getNumberFormatter
(
value
,
locale
,
fallback
,
numberFormats
,
key
,
options
)
{
var
_locale
=
locale
;
var
formats
=
numberFormats
[
_locale
];
var
chain
=
this
.
_getLocaleChain
(
locale
,
fallback
);
for
(
var
i
=
0
;
i
<
chain
.
length
;
i
++
)
{
var
current
=
_locale
;
var
step
=
chain
[
i
];
formats
=
numberFormats
[
step
];
_locale
=
step
;
// fallback locale
if
(
isNull
(
formats
)
||
isNull
(
formats
[
key
]))
{
if
(
step
!==
locale
&&
"
development
"
!==
'
production
'
&&
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to '
"
+
step
+
"
' number formats from '
"
+
current
+
"
' number formats.
"
));
}
}
else
{
break
}
}
if
(
isNull
(
formats
)
||
isNull
(
formats
[
key
]))
{
return
null
}
else
{
var
format
=
formats
[
key
];
var
formatter
;
if
(
options
)
{
// If options specified - create one time number formatter
formatter
=
new
Intl
.
NumberFormat
(
_locale
,
Object
.
assign
({},
format
,
options
));
}
else
{
var
id
=
_locale
+
"
__
"
+
key
;
formatter
=
this
.
_numberFormatters
[
id
];
if
(
!
formatter
)
{
formatter
=
this
.
_numberFormatters
[
id
]
=
new
Intl
.
NumberFormat
(
_locale
,
format
);
}
}
return
formatter
}
};
VueI18n
.
prototype
.
_n
=
function
_n
(
value
,
locale
,
key
,
options
)
{
/* istanbul ignore if */
if
(
!
VueI18n
.
availabilities
.
numberFormat
)
{
{
warn
(
'
Cannot format a Number value due to not supported Intl.NumberFormat.
'
);
}
return
''
}
if
(
!
key
)
{
var
nf
=
!
options
?
new
Intl
.
NumberFormat
(
locale
)
:
new
Intl
.
NumberFormat
(
locale
,
options
);
return
nf
.
format
(
value
)
}
var
formatter
=
this
.
_getNumberFormatter
(
value
,
locale
,
this
.
fallbackLocale
,
this
.
_getNumberFormats
(),
key
,
options
);
var
ret
=
formatter
&&
formatter
.
format
(
value
);
if
(
this
.
_isFallbackRoot
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
)
&&
!
this
.
_isSilentFallbackWarn
(
key
))
{
warn
((
"
Fall back to number localization of root: key '
"
+
key
+
"
'.
"
));
}
/* istanbul ignore if */
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
return
this
.
_root
.
$i18n
.
n
(
value
,
Object
.
assign
({},
{
key
:
key
,
locale
:
locale
},
options
))
}
else
{
return
ret
||
''
}
};
VueI18n
.
prototype
.
n
=
function
n
(
value
)
{
var
args
=
[],
len
=
arguments
.
length
-
1
;
while
(
len
--
>
0
)
args
[
len
]
=
arguments
[
len
+
1
];
var
locale
=
this
.
locale
;
var
key
=
null
;
var
options
=
null
;
if
(
args
.
length
===
1
)
{
if
(
isString
(
args
[
0
]))
{
key
=
args
[
0
];
}
else
if
(
isObject
(
args
[
0
]))
{
if
(
args
[
0
].
locale
)
{
locale
=
args
[
0
].
locale
;
}
if
(
args
[
0
].
key
)
{
key
=
args
[
0
].
key
;
}
// Filter out number format options only
options
=
Object
.
keys
(
args
[
0
]).
reduce
(
function
(
acc
,
key
)
{
var
obj
;
if
(
includes
(
numberFormatKeys
,
key
))
{
return
Object
.
assign
({},
acc
,
(
obj
=
{},
obj
[
key
]
=
args
[
0
][
key
],
obj
))
}
return
acc
},
null
);
}
}
else
if
(
args
.
length
===
2
)
{
if
(
isString
(
args
[
0
]))
{
key
=
args
[
0
];
}
if
(
isString
(
args
[
1
]))
{
locale
=
args
[
1
];
}
}
return
this
.
_n
(
value
,
locale
,
key
,
options
)
};
VueI18n
.
prototype
.
_ntp
=
function
_ntp
(
value
,
locale
,
key
,
options
)
{
/* istanbul ignore if */
if
(
!
VueI18n
.
availabilities
.
numberFormat
)
{
{
warn
(
'
Cannot format to parts a Number value due to not supported Intl.NumberFormat.
'
);
}
return
[]
}
if
(
!
key
)
{
var
nf
=
!
options
?
new
Intl
.
NumberFormat
(
locale
)
:
new
Intl
.
NumberFormat
(
locale
,
options
);
return
nf
.
formatToParts
(
value
)
}
var
formatter
=
this
.
_getNumberFormatter
(
value
,
locale
,
this
.
fallbackLocale
,
this
.
_getNumberFormats
(),
key
,
options
);
var
ret
=
formatter
&&
formatter
.
formatToParts
(
value
);
if
(
this
.
_isFallbackRoot
(
ret
))
{
if
(
!
this
.
_isSilentTranslationWarn
(
key
))
{
warn
((
"
Fall back to format number to parts of root: key '
"
+
key
+
"
' .
"
));
}
/* istanbul ignore if */
if
(
!
this
.
_root
)
{
throw
Error
(
'
unexpected error
'
)
}
return
this
.
_root
.
$i18n
.
_ntp
(
value
,
locale
,
key
,
options
)
}
else
{
return
ret
||
[]
}
};
Object
.
defineProperties
(
VueI18n
.
prototype
,
prototypeAccessors
);
var
availabilities
;
// $FlowFixMe
Object
.
defineProperty
(
VueI18n
,
'
availabilities
'
,
{
get
:
function
get
()
{
if
(
!
availabilities
)
{
var
intlDefined
=
typeof
Intl
!==
'
undefined
'
;
availabilities
=
{
dateTimeFormat
:
intlDefined
&&
typeof
Intl
.
DateTimeFormat
!==
'
undefined
'
,
numberFormat
:
intlDefined
&&
typeof
Intl
.
NumberFormat
!==
'
undefined
'
};
}
return
availabilities
}
});
VueI18n
.
install
=
install
;
VueI18n
.
version
=
'
8.18.2
'
;
return
VueI18n
;
})));
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment