mirror of https://github.com/mindoc-org/mindoc.git
实现导入Markdown
parent
7e9769dfbb
commit
4d1a03998a
|
@ -2,28 +2,29 @@ package commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
"log"
|
|
||||||
"flag"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
"github.com/astaxie/beego/orm"
|
|
||||||
"github.com/lifei6671/gocaptcha"
|
|
||||||
"github.com/lifei6671/mindoc/commands/migrate"
|
|
||||||
"github.com/lifei6671/mindoc/conf"
|
|
||||||
"github.com/lifei6671/mindoc/models"
|
|
||||||
"github.com/lifei6671/mindoc/utils"
|
|
||||||
"github.com/lifei6671/mindoc/cache"
|
|
||||||
beegoCache "github.com/astaxie/beego/cache"
|
beegoCache "github.com/astaxie/beego/cache"
|
||||||
_ "github.com/astaxie/beego/cache/memcache"
|
_ "github.com/astaxie/beego/cache/memcache"
|
||||||
_ "github.com/astaxie/beego/cache/redis"
|
_ "github.com/astaxie/beego/cache/redis"
|
||||||
|
"github.com/astaxie/beego/logs"
|
||||||
|
"github.com/astaxie/beego/orm"
|
||||||
|
"github.com/lifei6671/gocaptcha"
|
||||||
|
"github.com/lifei6671/mindoc/cache"
|
||||||
|
"github.com/lifei6671/mindoc/commands/migrate"
|
||||||
|
"github.com/lifei6671/mindoc/conf"
|
||||||
|
"github.com/lifei6671/mindoc/models"
|
||||||
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterDataBase 注册数据库
|
// RegisterDataBase 注册数据库
|
||||||
|
@ -42,16 +43,15 @@ func RegisterDataBase() {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
orm.DefaultTimeLoc = location
|
orm.DefaultTimeLoc = location
|
||||||
} else {
|
} else {
|
||||||
beego.Error("加载时区配置信息失败,请检查是否存在ZONEINFO环境变量:",err)
|
beego.Error("加载时区配置信息失败,请检查是否存在ZONEINFO环境变量:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
port := beego.AppConfig.String("db_port")
|
port := beego.AppConfig.String("db_port")
|
||||||
|
|
||||||
dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true&loc=%s", username, password, host, port, database, url.QueryEscape(timezone))
|
dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true&loc=%s", username, password, host, port, database, url.QueryEscape(timezone))
|
||||||
|
|
||||||
if err := orm.RegisterDataBase("default", "mysql", dataSource); err != nil {
|
if err := orm.RegisterDataBase("default", "mysql", dataSource); err != nil {
|
||||||
beego.Error("注册默认数据库失败:",err)
|
beego.Error("注册默认数据库失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
} else if adapter == "sqlite3" {
|
} else if adapter == "sqlite3" {
|
||||||
|
@ -67,9 +67,9 @@ func RegisterDataBase() {
|
||||||
err := orm.RegisterDataBase("default", "sqlite3", database)
|
err := orm.RegisterDataBase("default", "sqlite3", database)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("注册默认数据库失败:",err)
|
beego.Error("注册默认数据库失败:", err)
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
beego.Error("不支持的数据库类型.")
|
beego.Error("不支持的数据库类型.")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
@ -150,15 +150,15 @@ func RegisterFunction() {
|
||||||
}
|
}
|
||||||
//如果没有设置cdn,则使用baseURL拼接
|
//如果没有设置cdn,则使用baseURL拼接
|
||||||
if cdn == "" {
|
if cdn == "" {
|
||||||
baseUrl := beego.AppConfig.DefaultString("baseurl","")
|
baseUrl := beego.AppConfig.DefaultString("baseurl", "")
|
||||||
|
|
||||||
if strings.HasPrefix(p,"/") && strings.HasSuffix(baseUrl,"/") {
|
if strings.HasPrefix(p, "/") && strings.HasSuffix(baseUrl, "/") {
|
||||||
return baseUrl + p[1:]
|
return baseUrl + p[1:]
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(p,"/") && !strings.HasSuffix(baseUrl,"/") {
|
if !strings.HasPrefix(p, "/") && !strings.HasSuffix(baseUrl, "/") {
|
||||||
return baseUrl + "/" + p
|
return baseUrl + "/" + p
|
||||||
}
|
}
|
||||||
return baseUrl + p
|
return baseUrl + p
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
|
if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
|
||||||
return cdn + string(p[1:])
|
return cdn + string(p[1:])
|
||||||
|
@ -169,12 +169,12 @@ func RegisterFunction() {
|
||||||
return cdn + p
|
return cdn + p
|
||||||
})
|
})
|
||||||
|
|
||||||
beego.AddFuncMap("cdnjs",conf.URLForWithCdnJs)
|
beego.AddFuncMap("cdnjs", conf.URLForWithCdnJs)
|
||||||
beego.AddFuncMap("cdncss",conf.URLForWithCdnCss)
|
beego.AddFuncMap("cdncss", conf.URLForWithCdnCss)
|
||||||
beego.AddFuncMap("cdnimg", conf.URLForWithCdnImage)
|
beego.AddFuncMap("cdnimg", conf.URLForWithCdnImage)
|
||||||
//重写url生成,支持配置域名以及域名前缀
|
//重写url生成,支持配置域名以及域名前缀
|
||||||
beego.AddFuncMap("urlfor", conf.URLFor)
|
beego.AddFuncMap("urlfor", conf.URLFor)
|
||||||
beego.AddFuncMap("date_format", func(t time.Time,format string) string {
|
beego.AddFuncMap("date_format", func(t time.Time, format string) string {
|
||||||
return t.Local().Format(format)
|
return t.Local().Format(format)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -199,8 +199,8 @@ func ResolveCommand(args []string) {
|
||||||
if conf.ConfigurationFile == "" {
|
if conf.ConfigurationFile == "" {
|
||||||
conf.ConfigurationFile = filepath.Join(conf.WorkingDirectory, "conf", "app.conf")
|
conf.ConfigurationFile = filepath.Join(conf.WorkingDirectory, "conf", "app.conf")
|
||||||
config := filepath.Join(conf.WorkingDirectory, "conf", "app.conf.example")
|
config := filepath.Join(conf.WorkingDirectory, "conf", "app.conf.example")
|
||||||
if !utils.FileExists(conf.ConfigurationFile) && utils.FileExists(config) {
|
if !filetil.FileExists(conf.ConfigurationFile) && filetil.FileExists(config) {
|
||||||
utils.CopyFile(conf.ConfigurationFile, config)
|
filetil.CopyFile(conf.ConfigurationFile, config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gocaptcha.ReadFonts(filepath.Join(conf.WorkingDirectory, "static", "fonts"), ".ttf")
|
gocaptcha.ReadFonts(filepath.Join(conf.WorkingDirectory, "static", "fonts"), ".ttf")
|
||||||
|
@ -221,7 +221,7 @@ func ResolveCommand(args []string) {
|
||||||
|
|
||||||
fonts := filepath.Join(conf.WorkingDirectory, "static", "fonts")
|
fonts := filepath.Join(conf.WorkingDirectory, "static", "fonts")
|
||||||
|
|
||||||
if !utils.FileExists(fonts) {
|
if !filetil.FileExists(fonts) {
|
||||||
log.Fatal("Font path not exist.")
|
log.Fatal("Font path not exist.")
|
||||||
}
|
}
|
||||||
gocaptcha.ReadFonts(filepath.Join(conf.WorkingDirectory, "static", "fonts"), ".ttf")
|
gocaptcha.ReadFonts(filepath.Join(conf.WorkingDirectory, "static", "fonts"), ".ttf")
|
||||||
|
@ -233,31 +233,30 @@ func ResolveCommand(args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//注册缓存管道
|
//注册缓存管道
|
||||||
func RegisterCache() {
|
func RegisterCache() {
|
||||||
isOpenCache := beego.AppConfig.DefaultBool("cache",false)
|
isOpenCache := beego.AppConfig.DefaultBool("cache", false)
|
||||||
if !isOpenCache {
|
if !isOpenCache {
|
||||||
cache.Init(&cache.NullCache{})
|
cache.Init(&cache.NullCache{})
|
||||||
}
|
}
|
||||||
beego.Info("正常初始化缓存配置.")
|
beego.Info("正常初始化缓存配置.")
|
||||||
cacheProvider := beego.AppConfig.String("cache_provider")
|
cacheProvider := beego.AppConfig.String("cache_provider")
|
||||||
if cacheProvider == "file" {
|
if cacheProvider == "file" {
|
||||||
cacheFilePath := beego.AppConfig.DefaultString("cache_file_path","./runtime/cache/")
|
cacheFilePath := beego.AppConfig.DefaultString("cache_file_path", "./runtime/cache/")
|
||||||
if strings.HasPrefix(cacheFilePath, "./") {
|
if strings.HasPrefix(cacheFilePath, "./") {
|
||||||
cacheFilePath = filepath.Join(conf.WorkingDirectory, string(cacheFilePath[1:]))
|
cacheFilePath = filepath.Join(conf.WorkingDirectory, string(cacheFilePath[1:]))
|
||||||
}
|
}
|
||||||
fileCache := beegoCache.NewFileCache()
|
fileCache := beegoCache.NewFileCache()
|
||||||
|
|
||||||
|
fileConfig := make(map[string]string, 0)
|
||||||
|
|
||||||
fileConfig := make(map[string]string,0)
|
fileConfig["CachePath"] = cacheFilePath
|
||||||
|
fileConfig["DirectoryLevel"] = beego.AppConfig.DefaultString("cache_file_dir_level", "2")
|
||||||
|
fileConfig["EmbedExpiry"] = beego.AppConfig.DefaultString("cache_file_expiry", "120")
|
||||||
|
fileConfig["FileSuffix"] = beego.AppConfig.DefaultString("cache_file_suffix", ".bin")
|
||||||
|
|
||||||
fileConfig["CachePath"] = cacheFilePath
|
bc, err := json.Marshal(&fileConfig)
|
||||||
fileConfig["DirectoryLevel"] = beego.AppConfig.DefaultString("cache_file_dir_level","2")
|
|
||||||
fileConfig["EmbedExpiry"] = beego.AppConfig.DefaultString("cache_file_expiry","120")
|
|
||||||
fileConfig["FileSuffix"] = beego.AppConfig.DefaultString("cache_file_suffix",".bin")
|
|
||||||
|
|
||||||
bc,err := json.Marshal(&fileConfig)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("初始化Redis缓存失败:",err)
|
beego.Error("初始化Redis缓存失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,61 +264,61 @@ func RegisterCache() {
|
||||||
|
|
||||||
cache.Init(fileCache)
|
cache.Init(fileCache)
|
||||||
|
|
||||||
}else if cacheProvider == "memory" {
|
} else if cacheProvider == "memory" {
|
||||||
cacheInterval := beego.AppConfig.DefaultInt("cache_memory_interval",60)
|
cacheInterval := beego.AppConfig.DefaultInt("cache_memory_interval", 60)
|
||||||
memory := beegoCache.NewMemoryCache()
|
memory := beegoCache.NewMemoryCache()
|
||||||
beegoCache.DefaultEvery = cacheInterval
|
beegoCache.DefaultEvery = cacheInterval
|
||||||
cache.Init(memory)
|
cache.Init(memory)
|
||||||
}else if cacheProvider == "redis"{
|
} else if cacheProvider == "redis" {
|
||||||
var redisConfig struct{
|
var redisConfig struct {
|
||||||
Conn string `json:"conn"`
|
Conn string `json:"conn"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
DbNum int `json:"dbNum"`
|
DbNum int `json:"dbNum"`
|
||||||
}
|
}
|
||||||
redisConfig.DbNum = 0
|
redisConfig.DbNum = 0
|
||||||
redisConfig.Conn = beego.AppConfig.DefaultString("cache_redis_host","")
|
redisConfig.Conn = beego.AppConfig.DefaultString("cache_redis_host", "")
|
||||||
if pwd := beego.AppConfig.DefaultString("cache_redis_password","");pwd != "" {
|
if pwd := beego.AppConfig.DefaultString("cache_redis_password", ""); pwd != "" {
|
||||||
redisConfig.Password = pwd
|
redisConfig.Password = pwd
|
||||||
}
|
}
|
||||||
if dbNum := beego.AppConfig.DefaultInt("cache_redis_db",0); dbNum > 0 {
|
if dbNum := beego.AppConfig.DefaultInt("cache_redis_db", 0); dbNum > 0 {
|
||||||
redisConfig.DbNum = dbNum
|
redisConfig.DbNum = dbNum
|
||||||
}
|
}
|
||||||
|
|
||||||
bc,err := json.Marshal(&redisConfig)
|
bc, err := json.Marshal(&redisConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("初始化Redis缓存失败:",err)
|
beego.Error("初始化Redis缓存失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
redisCache,err := beegoCache.NewCache("redis",string(bc))
|
redisCache, err := beegoCache.NewCache("redis", string(bc))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("初始化Redis缓存失败:",err)
|
beego.Error("初始化Redis缓存失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
cache.Init(redisCache)
|
cache.Init(redisCache)
|
||||||
}else if cacheProvider == "memcache" {
|
} else if cacheProvider == "memcache" {
|
||||||
|
|
||||||
var memcacheConfig struct{
|
var memcacheConfig struct {
|
||||||
Conn string `json:"conn"`
|
Conn string `json:"conn"`
|
||||||
}
|
}
|
||||||
memcacheConfig.Conn = beego.AppConfig.DefaultString("cache_memcache_host","")
|
memcacheConfig.Conn = beego.AppConfig.DefaultString("cache_memcache_host", "")
|
||||||
|
|
||||||
bc,err := json.Marshal(&memcacheConfig)
|
bc, err := json.Marshal(&memcacheConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("初始化Redis缓存失败:",err)
|
beego.Error("初始化Redis缓存失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
memcache,err := beegoCache.NewCache("memcache",string(bc))
|
memcache, err := beegoCache.NewCache("memcache", string(bc))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("初始化Memcache缓存失败:",err)
|
beego.Error("初始化Memcache缓存失败:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
cache.Init(memcache)
|
cache.Init(memcache)
|
||||||
|
|
||||||
}else {
|
} else {
|
||||||
cache.Init(&cache.NullCache{})
|
cache.Init(&cache.NullCache{})
|
||||||
beego.Warn("不支持的缓存管道,缓存将禁用.")
|
beego.Warn("不支持的缓存管道,缓存将禁用.")
|
||||||
return
|
return
|
||||||
|
@ -329,7 +328,7 @@ func RegisterCache() {
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
if configPath ,err := filepath.Abs(conf.ConfigurationFile); err == nil {
|
if configPath, err := filepath.Abs(conf.ConfigurationFile); err == nil {
|
||||||
conf.ConfigurationFile = configPath
|
conf.ConfigurationFile = configPath
|
||||||
}
|
}
|
||||||
gocaptcha.ReadFonts("./static/fonts", ".ttf")
|
gocaptcha.ReadFonts("./static/fonts", ".ttf")
|
||||||
|
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/astaxie/beego/logs"
|
"github.com/astaxie/beego/logs"
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
|
@ -20,8 +22,6 @@ import (
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
"github.com/lifei6671/mindoc/utils/pagination"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"net/http"
|
|
||||||
"github.com/lifei6671/mindoc/converter"
|
|
||||||
"gopkg.in/russross/blackfriday.v2"
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -42,14 +42,14 @@ func (c *BookController) Index() {
|
||||||
c.Abort("500")
|
c.Abort("500")
|
||||||
}
|
}
|
||||||
|
|
||||||
for i,book := range books {
|
for i, book := range books {
|
||||||
books[i].Description = utils.StripTags(string(blackfriday.Run([]byte(book.Description))))
|
books[i].Description = utils.StripTags(string(blackfriday.Run([]byte(book.Description))))
|
||||||
books[i].ModifyTime = book.ModifyTime.Local()
|
books[i].ModifyTime = book.ModifyTime.Local()
|
||||||
books[i].CreateTime = book.CreateTime.Local()
|
books[i].CreateTime = book.CreateTime.Local()
|
||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize,c.BaseUrl())
|
pager := pagination.NewPagination(c.Ctx.Request, totalCount, conf.PageSize, c.BaseUrl())
|
||||||
c.Data["PageHtml"] = pager.HtmlPages()
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
|
@ -140,10 +140,10 @@ func (c *BookController) SaveBook() {
|
||||||
editor := strings.TrimSpace(c.GetString("editor"))
|
editor := strings.TrimSpace(c.GetString("editor"))
|
||||||
autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
|
autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
|
||||||
publisher := strings.TrimSpace(c.GetString("publisher"))
|
publisher := strings.TrimSpace(c.GetString("publisher"))
|
||||||
historyCount,_ := c.GetInt("history_count",0)
|
historyCount, _ := c.GetInt("history_count", 0)
|
||||||
isDownload := strings.TrimSpace(c.GetString("is_download")) == "on"
|
isDownload := strings.TrimSpace(c.GetString("is_download")) == "on"
|
||||||
enableShare := strings.TrimSpace(c.GetString("enable_share")) == "on"
|
enableShare := strings.TrimSpace(c.GetString("enable_share")) == "on"
|
||||||
isUseFirstDocument := strings.TrimSpace(c.GetString("is_use_first_document")) == "on"
|
isUseFirstDocument := strings.TrimSpace(c.GetString("is_use_first_document")) == "on"
|
||||||
|
|
||||||
if strings.Count(description, "") > 500 {
|
if strings.Count(description, "") > 500 {
|
||||||
c.JsonResult(6004, "项目描述不能大于500字")
|
c.JsonResult(6004, "项目描述不能大于500字")
|
||||||
|
@ -177,17 +177,17 @@ func (c *BookController) SaveBook() {
|
||||||
}
|
}
|
||||||
if isDownload {
|
if isDownload {
|
||||||
book.IsDownload = 0
|
book.IsDownload = 0
|
||||||
}else{
|
} else {
|
||||||
book.IsDownload = 1
|
book.IsDownload = 1
|
||||||
}
|
}
|
||||||
if enableShare {
|
if enableShare {
|
||||||
book.IsEnableShare = 0
|
book.IsEnableShare = 0
|
||||||
}else{
|
} else {
|
||||||
book.IsEnableShare = 1
|
book.IsEnableShare = 1
|
||||||
}
|
}
|
||||||
if isUseFirstDocument {
|
if isUseFirstDocument {
|
||||||
book.IsUseFirstDocument = 1
|
book.IsUseFirstDocument = 1
|
||||||
}else{
|
} else {
|
||||||
book.IsUseFirstDocument = 0
|
book.IsUseFirstDocument = 0
|
||||||
}
|
}
|
||||||
if err := book.Update(); err != nil {
|
if err := book.Update(); err != nil {
|
||||||
|
@ -397,7 +397,7 @@ func (c *BookController) Users() {
|
||||||
members, totalCount, err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId, pageIndex, 15)
|
members, totalCount, err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId, pageIndex, 15)
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize,c.BaseUrl())
|
pager := pagination.NewPagination(c.Ctx.Request, totalCount, conf.PageSize, c.BaseUrl())
|
||||||
c.Data["PageHtml"] = pager.HtmlPages()
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
|
@ -411,7 +411,6 @@ func (c *BookController) Users() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create 创建项目.
|
// Create 创建项目.
|
||||||
func (c *BookController) Create() {
|
func (c *BookController) Create() {
|
||||||
|
|
||||||
|
@ -446,9 +445,8 @@ func (c *BookController) Create() {
|
||||||
book := models.NewBook()
|
book := models.NewBook()
|
||||||
book.Cover = conf.GetDefaultCover()
|
book.Cover = conf.GetDefaultCover()
|
||||||
|
|
||||||
|
|
||||||
//如果客户端上传了项目封面则直接保存
|
//如果客户端上传了项目封面则直接保存
|
||||||
if file, moreFile, err := c.GetFile("image-file");err == nil {
|
if file, moreFile, err := c.GetFile("image-file"); err == nil {
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
ext := filepath.Ext(moreFile.Filename)
|
ext := filepath.Ext(moreFile.Filename)
|
||||||
|
@ -458,7 +456,7 @@ func (c *BookController) Create() {
|
||||||
|
|
||||||
fileName := "cover_" + strconv.FormatInt(time.Now().UnixNano(), 16)
|
fileName := "cover_" + strconv.FormatInt(time.Now().UnixNano(), 16)
|
||||||
|
|
||||||
filePath := filepath.Join("uploads", time.Now().Format("200601"), fileName + ext)
|
filePath := filepath.Join("uploads", time.Now().Format("200601"), fileName+ext)
|
||||||
|
|
||||||
path := filepath.Dir(filePath)
|
path := filepath.Dir(filePath)
|
||||||
|
|
||||||
|
@ -475,8 +473,6 @@ func (c *BookController) Create() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if books, _ := book.FindByField("identify", identify); len(books) > 0 {
|
if books, _ := book.FindByField("identify", identify); len(books) > 0 {
|
||||||
c.JsonResult(6006, "项目标识已存在")
|
c.JsonResult(6006, "项目标识已存在")
|
||||||
}
|
}
|
||||||
|
@ -495,9 +491,7 @@ func (c *BookController) Create() {
|
||||||
book.Editor = "markdown"
|
book.Editor = "markdown"
|
||||||
book.Theme = "default"
|
book.Theme = "default"
|
||||||
|
|
||||||
|
if err := book.Insert(); err != nil {
|
||||||
|
|
||||||
if err := book.Insert();err != nil {
|
|
||||||
logs.Error("Insert => ", err)
|
logs.Error("Insert => ", err)
|
||||||
c.JsonResult(6005, "保存项目失败")
|
c.JsonResult(6005, "保存项目失败")
|
||||||
}
|
}
|
||||||
|
@ -512,7 +506,7 @@ func (c *BookController) Create() {
|
||||||
c.JsonResult(6001, "error")
|
c.JsonResult(6001, "error")
|
||||||
}
|
}
|
||||||
|
|
||||||
//导入
|
//导入zip压缩包
|
||||||
func (c *BookController) Import() {
|
func (c *BookController) Import() {
|
||||||
|
|
||||||
file, moreFile, err := c.GetFile("import-file")
|
file, moreFile, err := c.GetFile("import-file")
|
||||||
|
@ -522,24 +516,44 @@ func (c *BookController) Import() {
|
||||||
|
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
|
bookName := strings.TrimSpace(c.GetString("book_name"))
|
||||||
|
identify := strings.TrimSpace(c.GetString("identify"))
|
||||||
|
|
||||||
|
if bookName == "" {
|
||||||
|
c.JsonResult(6001, "项目名称不能为空")
|
||||||
|
}
|
||||||
|
if len([]rune(bookName)) > 500 {
|
||||||
|
c.JsonResult(6002, "项目名称不能大于500字")
|
||||||
|
}
|
||||||
|
if identify == "" {
|
||||||
|
c.JsonResult(6002, "项目标识不能为空")
|
||||||
|
}
|
||||||
|
if ok, err := regexp.MatchString(`^[a-z]+[a-zA-Z0-9_\-]*$`, identify); !ok || err != nil {
|
||||||
|
c.JsonResult(6003, "项目标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头")
|
||||||
|
}
|
||||||
|
if strings.Count(identify, "") > 50 {
|
||||||
|
c.JsonResult(6004, "文档标识不能超过50字")
|
||||||
|
}
|
||||||
|
|
||||||
beego.Info(moreFile.Filename)
|
beego.Info(moreFile.Filename)
|
||||||
|
|
||||||
ext := filepath.Ext(moreFile.Filename)
|
ext := filepath.Ext(moreFile.Filename)
|
||||||
|
|
||||||
if !strings.EqualFold(ext,".doc") || !strings.EqualFold(ext,".docx") {
|
if !strings.EqualFold(ext, ".zip") {
|
||||||
c.JsonResult(6004,"不支持的文件类型")
|
c.JsonResult(6004, "不支持的文件类型")
|
||||||
}
|
}
|
||||||
|
|
||||||
tempPath := filepath.Join(os.TempDir(),c.CruSession.SessionID())
|
tempPath := filepath.Join(os.TempDir(), c.CruSession.SessionID())
|
||||||
|
|
||||||
os.MkdirAll(tempPath,0766)
|
os.MkdirAll(tempPath, 0766)
|
||||||
|
|
||||||
tempPath = filepath.Join(tempPath,moreFile.Filename)
|
tempPath = filepath.Join(tempPath, moreFile.Filename)
|
||||||
|
|
||||||
err = c.SaveToFile("import-file", tempPath)
|
err = c.SaveToFile("import-file", tempPath)
|
||||||
|
|
||||||
converter.Resolve(tempPath)
|
go models.NewBook().ImportBook(tempPath)
|
||||||
|
|
||||||
|
c.JsonResult(0, "项目正在后台转换中,请稍后查看")
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateToken 创建访问来令牌.
|
// CreateToken 创建访问来令牌.
|
||||||
|
|
|
@ -6,16 +6,18 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"math"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/astaxie/beego/logs"
|
"github.com/astaxie/beego/logs"
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
"path/filepath"
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
"strconv"
|
|
||||||
"github.com/lifei6671/mindoc/utils/pagination"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"math"
|
|
||||||
"gopkg.in/russross/blackfriday.v2"
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -52,7 +54,7 @@ func (c *ManagerController) Users() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize,c.BaseUrl())
|
pager := pagination.NewPagination(c.Ctx.Request, totalCount, conf.PageSize, c.BaseUrl())
|
||||||
c.Data["PageHtml"] = pager.HtmlPages()
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
|
@ -110,7 +112,7 @@ func (c *ManagerController) CreateMember() {
|
||||||
member.Avatar = conf.GetDefaultAvatar()
|
member.Avatar = conf.GetDefaultAvatar()
|
||||||
member.CreateAt = c.Member.MemberId
|
member.CreateAt = c.Member.MemberId
|
||||||
member.Email = email
|
member.Email = email
|
||||||
member.RealName = strings.TrimSpace(c.GetString("real_name",""))
|
member.RealName = strings.TrimSpace(c.GetString("real_name", ""))
|
||||||
if phone != "" {
|
if phone != "" {
|
||||||
member.Phone = phone
|
member.Phone = phone
|
||||||
}
|
}
|
||||||
|
@ -290,13 +292,13 @@ func (c *ManagerController) Books() {
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
//html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 8, totalCount)
|
//html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 8, totalCount)
|
||||||
|
|
||||||
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize, c.BaseUrl())
|
pager := pagination.NewPagination(c.Ctx.Request, totalCount, conf.PageSize, c.BaseUrl())
|
||||||
|
|
||||||
c.Data["PageHtml"] = pager.HtmlPages()
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
for i,book := range books {
|
for i, book := range books {
|
||||||
books[i].Description = utils.StripTags(string(blackfriday.Run([]byte(book.Description))))
|
books[i].Description = utils.StripTags(string(blackfriday.Run([]byte(book.Description))))
|
||||||
books[i].ModifyTime = book.ModifyTime.Local()
|
books[i].ModifyTime = book.ModifyTime.Local()
|
||||||
books[i].CreateTime = book.CreateTime.Local()
|
books[i].CreateTime = book.CreateTime.Local()
|
||||||
|
@ -328,10 +330,10 @@ func (c *ManagerController) EditBook() {
|
||||||
orderIndex, _ := c.GetInt("order_index", 0)
|
orderIndex, _ := c.GetInt("order_index", 0)
|
||||||
isDownload := strings.TrimSpace(c.GetString("is_download")) == "on"
|
isDownload := strings.TrimSpace(c.GetString("is_download")) == "on"
|
||||||
enableShare := strings.TrimSpace(c.GetString("enable_share")) == "on"
|
enableShare := strings.TrimSpace(c.GetString("enable_share")) == "on"
|
||||||
isUseFirstDocument := strings.TrimSpace(c.GetString("is_use_first_document")) == "on"
|
isUseFirstDocument := strings.TrimSpace(c.GetString("is_use_first_document")) == "on"
|
||||||
autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
|
autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
|
||||||
publisher := strings.TrimSpace(c.GetString("publisher"))
|
publisher := strings.TrimSpace(c.GetString("publisher"))
|
||||||
historyCount,_ := c.GetInt("history_count",0)
|
historyCount, _ := c.GetInt("history_count", 0)
|
||||||
|
|
||||||
if strings.Count(description, "") > 500 {
|
if strings.Count(description, "") > 500 {
|
||||||
c.JsonResult(6004, "项目描述不能大于500字")
|
c.JsonResult(6004, "项目描述不能大于500字")
|
||||||
|
@ -360,17 +362,17 @@ func (c *ManagerController) EditBook() {
|
||||||
}
|
}
|
||||||
if isDownload {
|
if isDownload {
|
||||||
book.IsDownload = 0
|
book.IsDownload = 0
|
||||||
}else{
|
} else {
|
||||||
book.IsDownload = 1
|
book.IsDownload = 1
|
||||||
}
|
}
|
||||||
if enableShare {
|
if enableShare {
|
||||||
book.IsEnableShare = 0
|
book.IsEnableShare = 0
|
||||||
}else{
|
} else {
|
||||||
book.IsEnableShare = 1
|
book.IsEnableShare = 1
|
||||||
}
|
}
|
||||||
if isUseFirstDocument {
|
if isUseFirstDocument {
|
||||||
book.IsUseFirstDocument = 1
|
book.IsUseFirstDocument = 1
|
||||||
}else{
|
} else {
|
||||||
book.IsUseFirstDocument = 0
|
book.IsUseFirstDocument = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,7 +615,7 @@ func (c *ManagerController) AttachList() {
|
||||||
|
|
||||||
p := filepath.Join(conf.WorkingDirectory, item.FilePath)
|
p := filepath.Join(conf.WorkingDirectory, item.FilePath)
|
||||||
|
|
||||||
item.IsExist = utils.FileExists(p)
|
item.IsExist = filetil.FileExists(p)
|
||||||
|
|
||||||
}
|
}
|
||||||
c.Data["Lists"] = attachList
|
c.Data["Lists"] = attachList
|
||||||
|
@ -643,7 +645,7 @@ func (c *ManagerController) AttachDetailed() {
|
||||||
attach.FilePath = filepath.Join(conf.WorkingDirectory, attach.FilePath)
|
attach.FilePath = filepath.Join(conf.WorkingDirectory, attach.FilePath)
|
||||||
attach.HttpPath = conf.URLForWithCdnImage(attach.HttpPath)
|
attach.HttpPath = conf.URLForWithCdnImage(attach.HttpPath)
|
||||||
|
|
||||||
attach.IsExist = utils.FileExists(attach.FilePath)
|
attach.IsExist = filetil.FileExists(attach.FilePath)
|
||||||
|
|
||||||
c.Data["Model"] = attach
|
c.Data["Model"] = attach
|
||||||
}
|
}
|
||||||
|
@ -691,43 +693,27 @@ func (c *ManagerController) LabelList() {
|
||||||
|
|
||||||
c.Data["Lists"] = labels
|
c.Data["Lists"] = labels
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除标签
|
//删除标签
|
||||||
func (c *ManagerController) LabelDelete(){
|
func (c *ManagerController) LabelDelete() {
|
||||||
labelId,err := strconv.Atoi(c.Ctx.Input.Param(":id"))
|
labelId, err := strconv.Atoi(c.Ctx.Input.Param(":id"))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("获取删除标签参数时出错:",err)
|
beego.Error("获取删除标签参数时出错:", err)
|
||||||
c.JsonResult(50001,"参数错误")
|
c.JsonResult(50001, "参数错误")
|
||||||
}
|
}
|
||||||
if labelId <= 0 {
|
if labelId <= 0 {
|
||||||
c.JsonResult(50001,"参数错误")
|
c.JsonResult(50001, "参数错误")
|
||||||
}
|
}
|
||||||
|
|
||||||
label,err := models.NewLabel().FindFirst("label_id",labelId)
|
label, err := models.NewLabel().FindFirst("label_id", labelId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("查询标签时出错:",err)
|
beego.Error("查询标签时出错:", err)
|
||||||
c.JsonResult(50001,"查询标签时出错:" + err.Error())
|
c.JsonResult(50001, "查询标签时出错:"+err.Error())
|
||||||
}
|
}
|
||||||
if err := label.Delete();err != nil {
|
if err := label.Delete(); err != nil {
|
||||||
c.JsonResult(50002,"删除失败:" + err.Error())
|
c.JsonResult(50002, "删除失败:"+err.Error())
|
||||||
}else{
|
} else {
|
||||||
c.JsonResult(0,"ok")
|
c.JsonResult(0, "ok")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
package converter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"github.com/lifei6671/mindoc/utils"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"crypto/md5"
|
|
||||||
"io"
|
|
||||||
"fmt"
|
|
||||||
"os/exec"
|
|
||||||
"github.com/lifei6671/mindoc/utils/ziptil"
|
|
||||||
"io/ioutil"
|
|
||||||
"encoding/xml"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ResolveResult struct {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlResult struct {
|
|
||||||
XMLName xml.Name `xml:"ncx"`
|
|
||||||
Head XmlHead `xml:"head"`
|
|
||||||
NavMap XmlTocNavMap `xml:"navMap"`
|
|
||||||
Title string `xml:"docTitle>text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlHead struct {
|
|
||||||
XMLName xml.Name `xml:"head"`
|
|
||||||
Meta []XmlMeta `xml:"meta"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlMeta struct {
|
|
||||||
XMLName xml.Name `xml:"meta"`
|
|
||||||
Content string `xml:"content,attr"`
|
|
||||||
Name string `xml:"name,attr"`
|
|
||||||
|
|
||||||
}
|
|
||||||
type XmlDocTitle struct {
|
|
||||||
Text string `xml:"text"`
|
|
||||||
}
|
|
||||||
type XmlTocNavMap struct {
|
|
||||||
XMLName xml.Name `xml:"navMap"`
|
|
||||||
NavPoint []XmlNavPoint `xml:"navPoint"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlNavPoint struct {
|
|
||||||
XMLName xml.Name `xml:"navPoint"`
|
|
||||||
Content XmlContent `xml:"content"`
|
|
||||||
NavLabel string `xml:"navLabel>text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlContent struct {
|
|
||||||
XMLName xml.Name `xml:"content"`
|
|
||||||
Src string `xml:"src,attr"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type XmlNavLabel struct {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func Resolve(p string) (ResolveResult,error) {
|
|
||||||
result := ResolveResult{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if !utils.FileExists(p) {
|
|
||||||
return result,errors.New("文件不存在 " + p)
|
|
||||||
}
|
|
||||||
|
|
||||||
w := md5.New()
|
|
||||||
io.WriteString(w, p) //将str写入到w中
|
|
||||||
md5str := fmt.Sprintf("%x", w.Sum(nil)) //w.Sum(nil)将w的hash转成[]byte格式
|
|
||||||
|
|
||||||
tempPath := filepath.Join(os.TempDir(),md5str)
|
|
||||||
|
|
||||||
os.MkdirAll(tempPath,0766)
|
|
||||||
|
|
||||||
epub := filepath.Join(tempPath , "book.epub")
|
|
||||||
|
|
||||||
args := []string{p,epub}
|
|
||||||
|
|
||||||
cmd := exec.Command(ebookConvert, args...)
|
|
||||||
|
|
||||||
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
fmt.Println("执行转换命令失败:" + err.Error())
|
|
||||||
return result,err
|
|
||||||
}
|
|
||||||
fmt.Println(epub)
|
|
||||||
|
|
||||||
unzipPath := filepath.Join(tempPath,"output")
|
|
||||||
|
|
||||||
if err := ziptil.Unzip(epub, unzipPath); err != nil {
|
|
||||||
fmt.Println("解压缩失败:" + err.Error())
|
|
||||||
return result,err
|
|
||||||
}
|
|
||||||
xmlPath := filepath.Join(unzipPath,"toc.ncx")
|
|
||||||
|
|
||||||
data,err := ioutil.ReadFile(xmlPath);
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("toc.ncx 文件不存在:" + err.Error())
|
|
||||||
return result,err
|
|
||||||
}
|
|
||||||
v := XmlResult{}
|
|
||||||
|
|
||||||
err = xml.Unmarshal([]byte(data), &v)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("解析XML失败:" + err.Error())
|
|
||||||
return result,err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(v)
|
|
||||||
|
|
||||||
return result,nil
|
|
||||||
}
|
|
|
@ -6,11 +6,12 @@ import (
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Attachment struct .
|
// Attachment struct .
|
||||||
|
@ -97,7 +98,7 @@ func (m *Attachment) FindToPager(pageIndex, pageSize int) (attachList []*Attachm
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
return nil,0,err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
totalCount = int(total)
|
totalCount = int(total)
|
||||||
offset := (pageIndex - 1) * pageSize
|
offset := (pageIndex - 1) * pageSize
|
||||||
|
@ -113,7 +114,7 @@ func (m *Attachment) FindToPager(pageIndex, pageSize int) (attachList []*Attachm
|
||||||
for _, item := range list {
|
for _, item := range list {
|
||||||
attach := &AttachmentResult{}
|
attach := &AttachmentResult{}
|
||||||
attach.Attachment = *item
|
attach.Attachment = *item
|
||||||
attach.FileShortSize = utils.FormatBytes(int64(attach.FileSize))
|
attach.FileShortSize = filetil.FormatBytes(int64(attach.FileSize))
|
||||||
|
|
||||||
book := NewBook()
|
book := NewBook()
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/astaxie/beego/orm"
|
|
||||||
"github.com/lifei6671/mindoc/utils"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego/orm"
|
||||||
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AttachmentResult struct {
|
type AttachmentResult struct {
|
||||||
|
@ -54,7 +55,7 @@ func (m *AttachmentResult) Find(id int) (*AttachmentResult, error) {
|
||||||
m.Account = member.Account
|
m.Account = member.Account
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.FileShortSize = utils.FormatBytes(int64(attach.FileSize))
|
m.FileShortSize = filetil.FormatBytes(int64(attach.FileSize))
|
||||||
m.LocalHttpPath = strings.Replace(m.FilePath, "\\", "/", -1)
|
m.LocalHttpPath = strings.Replace(m.FilePath, "\\", "/", -1)
|
||||||
|
|
||||||
return m, nil
|
return m, nil
|
||||||
|
|
143
models/book.go
143
models/book.go
|
@ -11,6 +11,17 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"crypto/md5"
|
||||||
|
"io"
|
||||||
|
"errors"
|
||||||
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
|
"github.com/lifei6671/mindoc/utils/ziptil"
|
||||||
|
"strings"
|
||||||
|
"regexp"
|
||||||
|
"io/ioutil"
|
||||||
|
"github.com/lifei6671/mindoc/utils/cryptil"
|
||||||
|
"github.com/lifei6671/mindoc/utils/requests"
|
||||||
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Book struct .
|
// Book struct .
|
||||||
|
@ -77,6 +88,7 @@ func NewBook() *Book {
|
||||||
return &Book{}
|
return &Book{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//添加一个项目
|
||||||
func (m *Book) Insert() error {
|
func (m *Book) Insert() error {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
// o.Begin()
|
// o.Begin()
|
||||||
|
@ -124,7 +136,7 @@ func (m *Book) Find(id int) (*Book, error) {
|
||||||
|
|
||||||
return m, err
|
return m, err
|
||||||
}
|
}
|
||||||
|
//更新一个项目
|
||||||
func (m *Book) Update(cols ...string) error {
|
func (m *Book) Update(cols ...string) error {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
@ -164,6 +176,7 @@ func (m *Book) FindByFieldFirst(field string, value interface{}) (*Book, error)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//根据项目标识查询项目
|
||||||
func (m *Book) FindByIdentify(identify string) (*Book, error) {
|
func (m *Book) FindByIdentify(identify string) (*Book, error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
@ -375,3 +388,131 @@ func (m *Book) ResetDocumentNumber(bookId int) {
|
||||||
beego.Error(err)
|
beego.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (book *Book)ImportBook(zipPath string) error {
|
||||||
|
if !filetil.FileExists(zipPath) {
|
||||||
|
return errors.New("文件不存在 => " + zipPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
w := md5.New()
|
||||||
|
io.WriteString(w, zipPath) //将str写入到w中
|
||||||
|
io.WriteString(w, time.Now().String())
|
||||||
|
io.WriteString(w,book.BookName)
|
||||||
|
md5str := fmt.Sprintf("%x", w.Sum(nil)) //w.Sum(nil)将w的hash转成[]byte格式
|
||||||
|
|
||||||
|
tempPath := strings.Replace(filepath.Join(os.TempDir(), md5str),"\\","/",-1)
|
||||||
|
|
||||||
|
os.MkdirAll(tempPath, 0766)
|
||||||
|
//如果加压缩失败
|
||||||
|
if err := ziptil.Unzip(zipPath,tempPath);err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
err := filepath.Walk(tempPath, func(path string, info os.FileInfo, err error) error {
|
||||||
|
path = strings.Replace(path,"\\","/",-1)
|
||||||
|
if path == tempPath {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !info.IsDir() {
|
||||||
|
ext := filepath.Ext(info.Name())
|
||||||
|
if strings.EqualFold(ext ,".md") || strings.EqualFold(ext , ".markdown" ) {
|
||||||
|
doc := NewDocument()
|
||||||
|
doc.BookId = book.BookId
|
||||||
|
docIdentify := strings.Replace(strings.TrimPrefix(path, tempPath+"/"), "/", "-", -1)
|
||||||
|
|
||||||
|
if ok, err := regexp.MatchString(`[a-z]+[a-zA-Z0-9_.\-]*$`, docIdentify); !ok || err != nil {
|
||||||
|
docIdentify = "import-" + docIdentify
|
||||||
|
}
|
||||||
|
|
||||||
|
doc.Identify = docIdentify
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`!\[(.*?)\]\((.*?)\)`)
|
||||||
|
markdown, err := ioutil.ReadFile(path);
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
doc.Markdown = re.ReplaceAllStringFunc(string(markdown), func(image string) string {
|
||||||
|
|
||||||
|
images := re.FindAllSubmatch([]byte(image), -1);
|
||||||
|
if len(images) <= 0 || len(images[0]) < 3 {
|
||||||
|
return image
|
||||||
|
}
|
||||||
|
originalImageUrl := string(images[0][2])
|
||||||
|
imageUrl := strings.Replace(string(originalImageUrl),"\\","/",-1)
|
||||||
|
|
||||||
|
//如果是本地路径,则需要将图片复制到项目目录
|
||||||
|
if !strings.HasPrefix(imageUrl, "http://") && !strings.HasPrefix(imageUrl, "https://") {
|
||||||
|
if strings.HasPrefix(imageUrl, "/") {
|
||||||
|
imageUrl = filepath.Join(tempPath, imageUrl)
|
||||||
|
} else if strings.HasPrefix(imageUrl, "./") {
|
||||||
|
imageUrl = filepath.Join(filepath.Dir(path), strings.TrimPrefix(imageUrl, "./"))
|
||||||
|
} else if strings.HasPrefix(imageUrl, "../") {
|
||||||
|
imageUrl = filepath.Join(filepath.Dir(path), imageUrl)
|
||||||
|
} else {
|
||||||
|
imageUrl = filepath.Join(filepath.Dir(path), imageUrl)
|
||||||
|
}
|
||||||
|
imageUrl = strings.Replace(imageUrl,"\\","/",-1)
|
||||||
|
dstFile := filepath.Join(conf.WorkingDirectory,"uploads",time.Now().Format("200601"),strings.TrimPrefix(imageUrl,tempPath))
|
||||||
|
|
||||||
|
if filetil.FileExists(imageUrl) {
|
||||||
|
filetil.CopyFile(imageUrl,dstFile)
|
||||||
|
|
||||||
|
imageUrl = strings.TrimPrefix(dstFile,conf.WorkingDirectory)
|
||||||
|
|
||||||
|
if !strings.HasPrefix(imageUrl,"/") && !strings.HasPrefix(imageUrl,"\\"){
|
||||||
|
imageUrl = "/" + imageUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
imageExt := cryptil.Md5Crypt(imageUrl) + filepath.Ext(imageUrl)
|
||||||
|
|
||||||
|
dstFile := filepath.Join(conf.WorkingDirectory,"uploads",time.Now().Format("200601"),imageExt)
|
||||||
|
|
||||||
|
if err := requests.DownloadAndSaveFile(imageUrl,dstFile) ;err == nil {
|
||||||
|
imageUrl = strings.TrimPrefix(strings.Replace(dstFile,"\\","/",-1),strings.Replace(conf.WorkingDirectory,"\\","/",-1))
|
||||||
|
if !strings.HasPrefix(imageUrl,"/") && !strings.HasPrefix(imageUrl,"\\"){
|
||||||
|
imageUrl = "/" + imageUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imageUrl = strings.Replace(strings.TrimSuffix(image,originalImageUrl + ")") + imageUrl + ")","\\","/",-1)
|
||||||
|
beego.Info(imageUrl)
|
||||||
|
return imageUrl
|
||||||
|
})
|
||||||
|
doc.Content = string(blackfriday.Run([]byte(doc.Markdown)))
|
||||||
|
doc.Release = doc.Content
|
||||||
|
|
||||||
|
//beego.Info(content)
|
||||||
|
//images := re.FindAllSubmatch(markdown,-1);
|
||||||
|
//
|
||||||
|
//for _,image := range images {
|
||||||
|
// originalImageUrl := string(image[1])
|
||||||
|
// imageUrl := string(originalImageUrl)
|
||||||
|
//
|
||||||
|
// if !strings.HasPrefix(imageUrl,"http://") && !strings.HasPrefix(imageUrl,"https://") {
|
||||||
|
// if strings.HasPrefix(imageUrl, "/") {
|
||||||
|
// imageUrl = filepath.Join(tempPath, imageUrl)
|
||||||
|
// } else if strings.HasPrefix(imageUrl, "./") {
|
||||||
|
// imageUrl = filepath.Join(filepath.Dir(path), strings.TrimPrefix(imageUrl, "./"))
|
||||||
|
// } else if strings.HasPrefix(imageUrl, "../") {
|
||||||
|
// imageUrl = filepath.Join(filepath.Dir(path), imageUrl)
|
||||||
|
// }else{
|
||||||
|
// imageUrl = filepath.Join(filepath.Dir(path), imageUrl)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// beego.Info(imageUrl)
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
|
@ -2,24 +2,24 @@ package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"time"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
|
||||||
"github.com/PuerkitoBio/goquery"
|
"github.com/PuerkitoBio/goquery"
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/astaxie/beego/logs"
|
"github.com/astaxie/beego/logs"
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/converter"
|
"github.com/lifei6671/mindoc/converter"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
|
||||||
"gopkg.in/russross/blackfriday.v2"
|
|
||||||
"github.com/lifei6671/mindoc/utils/ziptil"
|
|
||||||
"github.com/lifei6671/mindoc/utils/filetil"
|
"github.com/lifei6671/mindoc/utils/filetil"
|
||||||
|
"github.com/lifei6671/mindoc/utils/ziptil"
|
||||||
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BookResult struct {
|
type BookResult struct {
|
||||||
|
@ -36,7 +36,7 @@ type BookResult struct {
|
||||||
CommentCount int `json:"comment_count"`
|
CommentCount int `json:"comment_count"`
|
||||||
CreateTime time.Time `json:"create_time"`
|
CreateTime time.Time `json:"create_time"`
|
||||||
CreateName string `json:"create_name"`
|
CreateName string `json:"create_name"`
|
||||||
RealName string `json:"real_name"`
|
RealName string `json:"real_name"`
|
||||||
ModifyTime time.Time `json:"modify_time"`
|
ModifyTime time.Time `json:"modify_time"`
|
||||||
Cover string `json:"cover"`
|
Cover string `json:"cover"`
|
||||||
Theme string `json:"theme"`
|
Theme string `json:"theme"`
|
||||||
|
@ -44,18 +44,18 @@ type BookResult struct {
|
||||||
MemberId int `json:"member_id"`
|
MemberId int `json:"member_id"`
|
||||||
Editor string `json:"editor"`
|
Editor string `json:"editor"`
|
||||||
AutoRelease bool `json:"auto_release"`
|
AutoRelease bool `json:"auto_release"`
|
||||||
HistoryCount int `json:"history_count"`
|
HistoryCount int `json:"history_count"`
|
||||||
|
|
||||||
RelationshipId int `json:"relationship_id"`
|
RelationshipId int `json:"relationship_id"`
|
||||||
RoleId int `json:"role_id"`
|
RoleId int `json:"role_id"`
|
||||||
RoleName string `json:"role_name"`
|
RoleName string `json:"role_name"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
IsEnableShare bool `json:"is_enable_share"`
|
IsEnableShare bool `json:"is_enable_share"`
|
||||||
IsUseFirstDocument bool `json:"is_use_first_document"`
|
IsUseFirstDocument bool `json:"is_use_first_document"`
|
||||||
|
|
||||||
LastModifyText string `json:"last_modify_text"`
|
LastModifyText string `json:"last_modify_text"`
|
||||||
IsDisplayComment bool `json:"is_display_comment"`
|
IsDisplayComment bool `json:"is_display_comment"`
|
||||||
IsDownload bool `json:"is_download"`
|
IsDownload bool `json:"is_download"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBookResult() *BookResult {
|
func NewBookResult() *BookResult {
|
||||||
|
@ -211,7 +211,7 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
|
|
||||||
convertBookResult := ConvertBookResult{}
|
convertBookResult := ConvertBookResult{}
|
||||||
|
|
||||||
outputPath := filepath.Join(conf.WorkingDirectory,"uploads","books", strconv.Itoa(m.BookId))
|
outputPath := filepath.Join(conf.WorkingDirectory, "uploads", "books", strconv.Itoa(m.BookId))
|
||||||
viewPath := beego.BConfig.WebConfig.ViewsPath
|
viewPath := beego.BConfig.WebConfig.ViewsPath
|
||||||
|
|
||||||
pdfpath := filepath.Join(outputPath, "book.pdf")
|
pdfpath := filepath.Join(outputPath, "book.pdf")
|
||||||
|
@ -220,7 +220,7 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
docxpath := filepath.Join(outputPath, "book.docx")
|
docxpath := filepath.Join(outputPath, "book.docx")
|
||||||
|
|
||||||
//先将转换的文件储存到临时目录
|
//先将转换的文件储存到临时目录
|
||||||
tempOutputPath := filepath.Join(os.TempDir(),sessionId,m.Identify) //filepath.Abs(filepath.Join("cache", sessionId))
|
tempOutputPath := filepath.Join(os.TempDir(), sessionId, m.Identify) //filepath.Abs(filepath.Join("cache", sessionId))
|
||||||
|
|
||||||
os.MkdirAll(outputPath, 0766)
|
os.MkdirAll(outputPath, 0766)
|
||||||
os.MkdirAll(tempOutputPath, 0766)
|
os.MkdirAll(tempOutputPath, 0766)
|
||||||
|
@ -229,7 +229,7 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
os.RemoveAll(p)
|
os.RemoveAll(p)
|
||||||
}(tempOutputPath)
|
}(tempOutputPath)
|
||||||
|
|
||||||
if utils.FileExists(pdfpath) && utils.FileExists(epubpath) && utils.FileExists(mobipath) && utils.FileExists(docxpath) {
|
if filetil.FileExists(pdfpath) && filetil.FileExists(epubpath) && filetil.FileExists(mobipath) && filetil.FileExists(docxpath) {
|
||||||
convertBookResult.EpubPath = epubpath
|
convertBookResult.EpubPath = epubpath
|
||||||
convertBookResult.MobiPath = mobipath
|
convertBookResult.MobiPath = mobipath
|
||||||
convertBookResult.PDFPath = pdfpath
|
convertBookResult.PDFPath = pdfpath
|
||||||
|
@ -237,7 +237,6 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
return convertBookResult, nil
|
return convertBookResult, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
docs, err := NewDocument().FindListByBookId(m.BookId)
|
docs, err := NewDocument().FindListByBookId(m.BookId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return convertBookResult, err
|
return convertBookResult, err
|
||||||
|
@ -293,7 +292,7 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
More: []string{},
|
More: []string{},
|
||||||
}
|
}
|
||||||
if m.Publisher != "" {
|
if m.Publisher != "" {
|
||||||
ebookConfig.Footer = "<p style='color:#8E8E8E;font-size:12px;'>本文档由 <span style='text-decoration:none;color:#1abc9c;font-weight:bold;'>"+ m.Publisher +"</span> 生成<span style='float:right'>- _PAGENUM_ -</span></p>"
|
ebookConfig.Footer = "<p style='color:#8E8E8E;font-size:12px;'>本文档由 <span style='text-decoration:none;color:#1abc9c;font-weight:bold;'>" + m.Publisher + "</span> 生成<span style='float:right'>- _PAGENUM_ -</span></p>"
|
||||||
}
|
}
|
||||||
if m.RealName != "" {
|
if m.RealName != "" {
|
||||||
ebookConfig.Creator = m.RealName
|
ebookConfig.Creator = m.RealName
|
||||||
|
@ -354,35 +353,31 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
f.Close()
|
f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","css","kancloud.css"),filepath.Join(tempOutputPath,"styles","css","kancloud.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "css", "kancloud.css"), filepath.Join(tempOutputPath, "styles", "css", "kancloud.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","css","export.css"),filepath.Join(tempOutputPath,"styles","css","export.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "css", "export.css"), filepath.Join(tempOutputPath, "styles", "css", "export.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","editor.md","css","editormd.preview.css"),filepath.Join(tempOutputPath,"styles","editor.md","css","editormd.preview.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "editor.md", "css", "editormd.preview.css"), filepath.Join(tempOutputPath, "styles", "editor.md", "css", "editormd.preview.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","prettify","themes","prettify.css"),filepath.Join(tempOutputPath,"styles","prettify","themes","prettify.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "prettify", "themes", "prettify.css"), filepath.Join(tempOutputPath, "styles", "prettify", "themes", "prettify.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","css,","markdown.preview.css"),filepath.Join(tempOutputPath,"styles","css","markdown.preview.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "css,", "markdown.preview.css"), filepath.Join(tempOutputPath, "styles", "css", "markdown.preview.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","highlight","styles","vs.css"),filepath.Join(tempOutputPath,"styles","highlight","styles","vs.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "highlight", "styles", "vs.css"), filepath.Join(tempOutputPath, "styles", "highlight", "styles", "vs.css"))
|
||||||
filetil.CopyFile(filepath.Join(conf.WorkingDirectory,"static","katex","katex.min.css"),filepath.Join(tempOutputPath,"styles","katex","katex.min.css"))
|
filetil.CopyFile(filepath.Join(conf.WorkingDirectory, "static", "katex", "katex.min.css"), filepath.Join(tempOutputPath, "styles", "katex", "katex.min.css"))
|
||||||
|
|
||||||
|
|
||||||
eBookConverter := &converter.Converter{
|
eBookConverter := &converter.Converter{
|
||||||
BasePath: tempOutputPath,
|
BasePath: tempOutputPath,
|
||||||
OutputPath: strings.TrimSuffix(tempOutputPath,"sources"),
|
OutputPath: strings.TrimSuffix(tempOutputPath, "sources"),
|
||||||
Config: ebookConfig,
|
Config: ebookConfig,
|
||||||
Debug: true,
|
Debug: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if err := eBookConverter.Convert(); err != nil {
|
if err := eBookConverter.Convert(); err != nil {
|
||||||
beego.Error("转换文件错误:" + m.BookName + " => " + err.Error())
|
beego.Error("转换文件错误:" + m.BookName + " => " + err.Error())
|
||||||
return convertBookResult, err
|
return convertBookResult, err
|
||||||
}
|
}
|
||||||
beego.Info("文档转换完成:" + m.BookName)
|
beego.Info("文档转换完成:" + m.BookName)
|
||||||
|
|
||||||
|
filetil.CopyFile(mobipath, filepath.Join(tempOutputPath, "output", "book.mobi"))
|
||||||
utils.CopyFile(mobipath, filepath.Join(tempOutputPath, "output", "book.mobi"))
|
filetil.CopyFile(pdfpath, filepath.Join(tempOutputPath, "output", "book.pdf"))
|
||||||
utils.CopyFile(pdfpath, filepath.Join(tempOutputPath, "output", "book.pdf"))
|
filetil.CopyFile(epubpath, filepath.Join(tempOutputPath, "output", "book.epub"))
|
||||||
utils.CopyFile(epubpath, filepath.Join(tempOutputPath, "output", "book.epub"))
|
filetil.CopyFile(docxpath, filepath.Join(tempOutputPath, "output", "book.docx"))
|
||||||
utils.CopyFile(docxpath, filepath.Join(tempOutputPath, "output", "book.docx"))
|
|
||||||
|
|
||||||
convertBookResult.MobiPath = mobipath
|
convertBookResult.MobiPath = mobipath
|
||||||
convertBookResult.PDFPath = pdfpath
|
convertBookResult.PDFPath = pdfpath
|
||||||
|
@ -393,45 +388,45 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//导出Markdown原始文件
|
//导出Markdown原始文件
|
||||||
func (m *BookResult) ExportMarkdown(sessionId string)(string, error){
|
func (m *BookResult) ExportMarkdown(sessionId string) (string, error) {
|
||||||
outputPath := filepath.Join(conf.WorkingDirectory,"uploads","books", strconv.Itoa(m.BookId), "book.zip")
|
outputPath := filepath.Join(conf.WorkingDirectory, "uploads", "books", strconv.Itoa(m.BookId), "book.zip")
|
||||||
|
|
||||||
os.MkdirAll(filepath.Dir(outputPath),0644)
|
os.MkdirAll(filepath.Dir(outputPath), 0644)
|
||||||
|
|
||||||
tempOutputPath := filepath.Join(os.TempDir(),sessionId,"markdown")
|
tempOutputPath := filepath.Join(os.TempDir(), sessionId, "markdown")
|
||||||
|
|
||||||
defer os.RemoveAll(tempOutputPath)
|
defer os.RemoveAll(tempOutputPath)
|
||||||
|
|
||||||
err := exportMarkdown(tempOutputPath,0,m.BookId)
|
err := exportMarkdown(tempOutputPath, 0, m.BookId)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "",err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ziptil.Compress(outputPath,tempOutputPath);err != nil {
|
if err := ziptil.Compress(outputPath, tempOutputPath); err != nil {
|
||||||
beego.Error("导出Markdown失败=>",err)
|
beego.Error("导出Markdown失败=>", err)
|
||||||
return "",err
|
return "", err
|
||||||
}
|
}
|
||||||
return outputPath,nil
|
return outputPath, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func exportMarkdown(p string,parentId int,bookId int) (error){
|
func exportMarkdown(p string, parentId int, bookId int) error {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
var docs []*Document
|
var docs []*Document
|
||||||
|
|
||||||
_,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("book_id",bookId).Filter("parent_id",parentId).All(&docs)
|
_, err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("book_id", bookId).Filter("parent_id", parentId).All(&docs)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("导出Markdown失败=>",err)
|
beego.Error("导出Markdown失败=>", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _,doc := range docs {
|
for _, doc := range docs {
|
||||||
//获取当前文档的子文档数量,如果数量不为0,则将当前文档命名为READMD.md并设置成目录。
|
//获取当前文档的子文档数量,如果数量不为0,则将当前文档命名为READMD.md并设置成目录。
|
||||||
subDocCount,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("parent_id",doc.DocumentId).Count()
|
subDocCount, err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("parent_id", doc.DocumentId).Count()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error("导出Markdown失败=>",err)
|
beego.Error("导出Markdown失败=>", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,27 +434,27 @@ func exportMarkdown(p string,parentId int,bookId int) (error){
|
||||||
|
|
||||||
if subDocCount > 0 {
|
if subDocCount > 0 {
|
||||||
if doc.Identify != "" {
|
if doc.Identify != "" {
|
||||||
docPath = filepath.Join(p, doc.Identify,"README.md")
|
docPath = filepath.Join(p, doc.Identify, "README.md")
|
||||||
} else {
|
} else {
|
||||||
docPath = filepath.Join(p, strconv.Itoa(doc.DocumentId),"README.md")
|
docPath = filepath.Join(p, strconv.Itoa(doc.DocumentId), "README.md")
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
if doc.Identify != "" {
|
if doc.Identify != "" {
|
||||||
docPath = filepath.Join(p, doc.Identify + ".md")
|
docPath = filepath.Join(p, doc.Identify+".md")
|
||||||
} else {
|
} else {
|
||||||
docPath = filepath.Join(p, doc.DocumentName + ".md")
|
docPath = filepath.Join(p, doc.DocumentName+".md")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dirPath := filepath.Dir(docPath);
|
dirPath := filepath.Dir(docPath)
|
||||||
|
|
||||||
os.MkdirAll(dirPath,0766)
|
os.MkdirAll(dirPath, 0766)
|
||||||
|
|
||||||
if err := ioutil.WriteFile(docPath,[]byte(doc.Markdown),0644);err != nil {
|
if err := ioutil.WriteFile(docPath, []byte(doc.Markdown), 0644); err != nil {
|
||||||
beego.Error("导出Markdown失败=>",err)
|
beego.Error("导出Markdown失败=>", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if subDocCount > 0 {
|
if subDocCount > 0 {
|
||||||
if err = exportMarkdown(dirPath,doc.DocumentId,bookId);err != nil {
|
if err = exportMarkdown(dirPath, doc.DocumentId, bookId); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,36 +463,13 @@ func exportMarkdown(p string,parentId int,bookId int) (error){
|
||||||
}
|
}
|
||||||
|
|
||||||
//查询项目的第一篇文档
|
//查询项目的第一篇文档
|
||||||
func (m *BookResult) FindFirstDocumentByBookId(bookId int) (*Document,error) {
|
func (m *BookResult) FindFirstDocumentByBookId(bookId int) (*Document, error) {
|
||||||
|
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
doc := NewDocument()
|
doc := NewDocument()
|
||||||
|
|
||||||
err := o.QueryTable(doc.TableNameWithPrefix()).Filter("book_id", bookId).Filter("parent_id",0).OrderBy("order_sort").One(doc)
|
err := o.QueryTable(doc.TableNameWithPrefix()).Filter("book_id", bookId).Filter("parent_id", 0).OrderBy("order_sort").One(doc)
|
||||||
|
|
||||||
return doc,err
|
return doc, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,12 @@ type Document struct {
|
||||||
AttachList []*Attachment `orm:"-" json:"attach"`
|
AttachList []*Attachment `orm:"-" json:"attach"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 多字段唯一键
|
||||||
|
func (m *Document) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"book_id", "identify"},
|
||||||
|
}
|
||||||
|
}
|
||||||
// TableName 获取对应数据库表名.
|
// TableName 获取对应数据库表名.
|
||||||
func (m *Document) TableName() string {
|
func (m *Document) TableName() string {
|
||||||
return "documents"
|
return "documents"
|
||||||
|
@ -93,15 +99,6 @@ func (m *Document) InsertOrUpdate(cols ...string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
////根据指定字段查询一条文档.
|
|
||||||
//func (m *Document) FindByFieldFirst(field string, v interface{}) (*Document, error) {
|
|
||||||
//
|
|
||||||
// o := orm.NewOrm()
|
|
||||||
//
|
|
||||||
// err := o.QueryTable(m.TableNameWithPrefix()).Filter(field, v).One(m)
|
|
||||||
//
|
|
||||||
// return m, err
|
|
||||||
//}
|
|
||||||
//根据文档识别编号和项目id获取一篇文档
|
//根据文档识别编号和项目id获取一篇文档
|
||||||
func (m *Document) FindByIdentityFirst(identify string,bookId int) (*Document,error) {
|
func (m *Document) FindByIdentityFirst(identify string,bookId int) (*Document,error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
@ -120,11 +117,6 @@ func (m *Document) RecursiveDocument(docId int) error {
|
||||||
o.Delete(doc)
|
o.Delete(doc)
|
||||||
NewDocumentHistory().Clear(doc.DocumentId)
|
NewDocumentHistory().Clear(doc.DocumentId)
|
||||||
}
|
}
|
||||||
//
|
|
||||||
//var docs []*Document
|
|
||||||
//
|
|
||||||
//_, err := o.QueryTable(m.TableNameWithPrefix()).Filter("parent_id", doc_id).All(&docs)
|
|
||||||
|
|
||||||
var maps []orm.Params
|
var maps []orm.Params
|
||||||
|
|
||||||
_, err := o.Raw("SELECT document_id FROM " + m.TableNameWithPrefix() + " WHERE parent_id=" + strconv.Itoa(docId)).Values(&maps)
|
_, err := o.Raw("SELECT document_id FROM " + m.TableNameWithPrefix() + " WHERE parent_id=" + strconv.Itoa(docId)).Values(&maps)
|
||||||
|
@ -255,6 +247,7 @@ func (m *Document) FromCacheById(id int) (*Document,error) {
|
||||||
}()
|
}()
|
||||||
return m.Find(id)
|
return m.Find(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
//根据文档标识从缓存中查询文档
|
//根据文档标识从缓存中查询文档
|
||||||
func (m *Document) FromCacheByIdentify(identify string,bookId int) (*Document,error) {
|
func (m *Document) FromCacheByIdentify(identify string,bookId int) (*Document,error) {
|
||||||
b := cache.Get(fmt.Sprintf("Document.BookId.%d.Identify.%s",bookId , identify))
|
b := cache.Get(fmt.Sprintf("Document.BookId.%d.Identify.%s",bookId , identify))
|
||||||
|
@ -280,3 +273,4 @@ func (m *Document) FindListByBookId(bookId int) (docs []*Document, err error) {
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee RTL (Right To Left) default styling for bootstrap-fileinput.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
.kv-rtl .close, .kv-rtl .krajee-default .file-actions, .kv-rtl .krajee-default .file-other-error {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .krajee-default.file-preview-frame, .kv-rtl .krajee-default .file-drag-handle, .kv-rtl .krajee-default .file-upload-indicator {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .file-zoom-dialog, .kv-rtl .file-error-message pre, .kv-rtl .file-error-message ul {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .floating-buttons {
|
||||||
|
left: 10px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .floating-buttons .btn-kv {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .file-caption-icon {
|
||||||
|
left: auto;
|
||||||
|
right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .file-drop-zone {
|
||||||
|
margin: 12px 12px 12px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .btn-prev {
|
||||||
|
right: 1px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .btn-next {
|
||||||
|
left: 1px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .pull-right, .kv-rtl .float-right {
|
||||||
|
float: left !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .pull-left, .kv-rtl .float-left {
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .kv-zoom-title {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .krajee-default.file-preview-frame {
|
||||||
|
box-shadow: -1px 1px 5px 0 #a2958a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .krajee-default.file-preview-frame:not(.file-preview-error):hover {
|
||||||
|
box-shadow: -3px 3px 5px 0 #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .kv-zoom-actions .btn-kv {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .file-caption.icon-visible .file-caption-name {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .input-group-btn:last-child > .btn {
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .input-group .form-control:first-child {
|
||||||
|
border-radius: 0 4px 4px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-rtl .btn-file input[type=file] {
|
||||||
|
right: auto;
|
||||||
|
left: 0;
|
||||||
|
text-align: left;
|
||||||
|
background: none repeat scroll 100% 0 transparent;
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee RTL (Right To Left) default styling for bootstrap-fileinput.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/.kv-rtl .close,.kv-rtl .krajee-default .file-actions,.kv-rtl .krajee-default .file-other-error{float:left}.kv-rtl .krajee-default .file-drag-handle,.kv-rtl .krajee-default .file-upload-indicator,.kv-rtl .krajee-default.file-preview-frame{float:right}.kv-rtl .file-error-message pre,.kv-rtl .file-error-message ul,.kv-rtl .file-zoom-dialog{text-align:right}.kv-rtl{direction:rtl}.kv-rtl .floating-buttons{left:10px;right:auto}.kv-rtl .floating-buttons .btn-kv{margin-left:0;margin-right:3px}.kv-rtl .file-caption-icon{left:auto;right:8px}.kv-rtl .file-drop-zone{margin:12px 12px 12px 15px}.kv-rtl .btn-prev{right:1px;left:auto}.kv-rtl .btn-next{left:1px;right:auto}.kv-rtl .float-right,.kv-rtl .pull-right{float:left!important}.kv-rtl .float-left,.kv-rtl .pull-left{float:right!important}.kv-rtl .kv-zoom-title{direction:ltr}.kv-rtl .krajee-default.file-preview-frame{box-shadow:-1px 1px 5px 0 #a2958a}.kv-rtl .krajee-default.file-preview-frame:not(.file-preview-error):hover{box-shadow:-3px 3px 5px 0 #333}.kv-rtl .kv-zoom-actions .btn-kv{margin-left:0;margin-right:3px}.kv-rtl .file-caption.icon-visible .file-caption-name{padding-left:0;padding-right:15px}.kv-rtl .input-group-btn:last-child>.btn{border-radius:4px 0 0 4px}.kv-rtl .input-group .form-control:first-child{border-radius:0 4px 4px 0}.kv-rtl .btn-file input[type=file]{right:auto;left:0;text-align:left;background:100% 0 none}
|
|
@ -0,0 +1,552 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee default styling for bootstrap-fileinput.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
.file-loading input[type=file], input[type=file].file-loading {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-hidden, .file-caption-icon, .file-zoom-dialog .modal-header:before, .file-zoom-dialog .modal-header:after, .file-input-new .file-preview, .file-input-new .close, .file-input-new .glyphicon-file, .file-input-new .fileinput-remove-button, .file-input-new .fileinput-upload-button, .file-input-new .no-browse .input-group-btn, .file-input-ajax-new .fileinput-remove-button, .file-input-ajax-new .fileinput-upload-button, .file-input-ajax-new .no-browse .input-group-btn, .hide-content .kv-file-content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-file input[type=file], .file-caption-icon, .file-preview .fileinput-remove, .krajee-default .file-thumb-progress, .file-zoom-dialog .btn-navigate, .file-zoom-dialog .floating-buttons {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-loading:before, .btn-file, .file-caption, .file-preview, .krajee-default.file-preview-frame, .krajee-default .file-thumbnail-footer, .file-zoom-dialog .modal-dialog {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-error-message pre, .file-error-message ul, .krajee-default .file-actions, .krajee-default .file-other-error {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-error-message pre, .file-error-message ul {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-drag-handle, .krajee-default .file-upload-indicator {
|
||||||
|
float: left;
|
||||||
|
margin: 5px 0 -5px;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-thumb-progress .progress, .krajee-default .file-thumb-progress .progress-bar {
|
||||||
|
height: 11px;
|
||||||
|
font-size: 9px;
|
||||||
|
line-height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-caption-info, .krajee-default .file-size-info {
|
||||||
|
display: block;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 160px;
|
||||||
|
height: 15px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content > .file-object.type-video, .file-zoom-content > .file-object.type-flash, .file-zoom-content > .file-object.type-image {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content > .file-object.type-video, .file-zoom-content > .file-object.type-flash {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content > .file-object.type-pdf, .file-zoom-content > .file-object.type-html, .file-zoom-content > .file-object.type-text, .file-zoom-content > .file-object.type-default {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-2 {
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-3 {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-4 {
|
||||||
|
transform: rotate(180deg) rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-5 {
|
||||||
|
transform: rotate(270deg) rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-6 {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-7 {
|
||||||
|
transform: rotate(90deg) rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotate-8 {
|
||||||
|
transform: rotate(270deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-loading:before {
|
||||||
|
content: " Loading...";
|
||||||
|
display: inline-block;
|
||||||
|
padding-left: 20px;
|
||||||
|
line-height: 16px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-variant: small-caps;
|
||||||
|
color: #999;
|
||||||
|
background: transparent url(../img/loading.gif) top left no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-object {
|
||||||
|
margin: 0 0 -5px 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-file {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-file input[type=file] {
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
text-align: right;
|
||||||
|
opacity: 0;
|
||||||
|
background: none repeat scroll 0 0 transparent;
|
||||||
|
cursor: inherit;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-file ::-ms-browse {
|
||||||
|
font-size: 10000px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption .file-caption-name {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption.icon-visible .file-caption-icon {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption.icon-visible .file-caption-name {
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption-icon {
|
||||||
|
line-height: 1;
|
||||||
|
left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-error-message {
|
||||||
|
color: #a94442;
|
||||||
|
background-color: #f2dede;
|
||||||
|
margin: 5px;
|
||||||
|
border: 1px solid #ebccd1;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-error-message pre {
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption-disabled {
|
||||||
|
background-color: #eee;
|
||||||
|
cursor: not-allowed;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview {
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview .btn-xs {
|
||||||
|
padding: 1px 5px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview .fileinput-remove {
|
||||||
|
top: 1px;
|
||||||
|
right: 1px;
|
||||||
|
line-height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview .clickable {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview-image {
|
||||||
|
font: 40px Impact, Charcoal, sans-serif;
|
||||||
|
color: #008000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default.file-preview-frame {
|
||||||
|
margin: 8px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
box-shadow: 1px 1px 5px 0 #a2958a;
|
||||||
|
padding: 6px;
|
||||||
|
float: left;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default.file-preview-frame .kv-file-content {
|
||||||
|
width: 213px;
|
||||||
|
height: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default.file-preview-frame .file-thumbnail-footer {
|
||||||
|
height: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default.file-preview-frame:not(.file-preview-error):hover {
|
||||||
|
box-shadow: 3px 3px 5px 0 #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-preview-text {
|
||||||
|
display: block;
|
||||||
|
color: #428bca;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||||
|
outline: none;
|
||||||
|
padding: 8px;
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-preview-html {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-other-icon {
|
||||||
|
font-size: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-footer-buttons {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-footer-caption {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 4px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: #777;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-preview-error {
|
||||||
|
opacity: 0.65;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-thumb-progress {
|
||||||
|
height: 11px;
|
||||||
|
top: 37px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default.kvsortable-ghost {
|
||||||
|
background: #e1edf7;
|
||||||
|
border: 2px solid #a1abff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-preview-other:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-upload-progress .progress {
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin: 10px 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-upload-progress .progress-bar {
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*noinspection CssOverwrittenProperties*/
|
||||||
|
.file-zoom-dialog .file-other-icon {
|
||||||
|
font-size: 22em;
|
||||||
|
font-size: 50vmin;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .modal-dialog {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .modal-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .btn-navigate {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: transparent;
|
||||||
|
text-decoration: none;
|
||||||
|
outline: none;
|
||||||
|
opacity: 0.7;
|
||||||
|
top: 45%;
|
||||||
|
font-size: 4em;
|
||||||
|
color: #1c94c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .btn-navigate:not([disabled]):hover {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .floating-buttons {
|
||||||
|
top: 5px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .btn-navigate[disabled] {
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .btn-prev {
|
||||||
|
left: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .btn-next {
|
||||||
|
right: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .kv-zoom-title {
|
||||||
|
font-weight: 300;
|
||||||
|
color: #999;
|
||||||
|
max-width: 50%;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-input-new .no-browse .form-control {
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-input-ajax-new .no-browse .form-control {
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-caption-main {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-thumb-loading {
|
||||||
|
background: transparent url(../img/loading.gif) no-repeat scroll center center content-box !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-drop-zone {
|
||||||
|
border: 1px dashed #aaa;
|
||||||
|
border-radius: 4px;
|
||||||
|
height: 100%;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 12px 15px 12px 12px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-drop-zone.clickable:hover {
|
||||||
|
border: 2px dashed #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-drop-zone.clickable:focus {
|
||||||
|
border: 2px solid #5acde2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-drop-zone .file-preview-thumbnails {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-drop-zone-title {
|
||||||
|
color: #aaa;
|
||||||
|
font-size: 1.6em;
|
||||||
|
padding: 85px 10px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-highlighted {
|
||||||
|
border: 2px dashed #999 !important;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-uploading {
|
||||||
|
background: url(../img/loading-sm.gif) no-repeat center bottom 10px;
|
||||||
|
opacity: 0.65;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 576px) {
|
||||||
|
.file-zoom-dialog .modal-dialog {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.file-zoom-dialog .modal-lg {
|
||||||
|
max-width: 800px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-fullscreen.modal {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-fullscreen .modal-dialog {
|
||||||
|
position: fixed;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-fullscreen .modal-content {
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-fullscreen .modal-body {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-kv {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 90%;
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons {
|
||||||
|
z-index: 3000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons .btn-kv {
|
||||||
|
margin-left: 3px;
|
||||||
|
z-index: 3000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content {
|
||||||
|
height: 480px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content .file-preview-image {
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content .file-preview-video {
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content .is-portrait-gt4 {
|
||||||
|
margin-top: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content > .file-object.type-image {
|
||||||
|
height: auto;
|
||||||
|
min-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-content > .file-object.type-audio {
|
||||||
|
width: auto;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
.file-preview-thumbnails {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-zoom-dialog .modal-header {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 350px) {
|
||||||
|
.krajee-default.file-preview-frame .kv-file-content {
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-loading[dir=rtl]:before {
|
||||||
|
background: transparent url(../img/loading.gif) top right no-repeat;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-sortable .file-drag-handle {
|
||||||
|
cursor: move;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-sortable .file-drag-handle:hover {
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable .file-drop-zone-title {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kv-zoom-actions .btn-kv {
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-preview-initial.sortable-chosen {
|
||||||
|
background-color: #d9edf7;
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 847 B |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput <_LANG_> Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['_LANG_'] = {
|
||||||
|
fileSingle: 'file',
|
||||||
|
filePlural: 'files',
|
||||||
|
browseLabel: 'Browse …',
|
||||||
|
removeLabel: 'Remove',
|
||||||
|
removeTitle: 'Clear selected files',
|
||||||
|
cancelLabel: 'Cancel',
|
||||||
|
cancelTitle: 'Abort ongoing upload',
|
||||||
|
uploadLabel: 'Upload',
|
||||||
|
uploadTitle: 'Upload selected files',
|
||||||
|
msgNo: 'No',
|
||||||
|
msgNoFilesSelected: 'No files selected',
|
||||||
|
msgCancelled: 'Cancelled',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detailed Preview',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'You must select at least <b>{n}</b> {files} to upload.',
|
||||||
|
msgFilesTooMany: 'Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'File "{name}" not found!',
|
||||||
|
msgFileSecured: 'Security restrictions prevent reading the file "{name}".',
|
||||||
|
msgFileNotReadable: 'File "{name}" is not readable.',
|
||||||
|
msgFilePreviewAborted: 'File preview aborted for "{name}".',
|
||||||
|
msgFilePreviewError: 'An error occurred while reading the file "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.',
|
||||||
|
msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'The file upload was aborted',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Validation Error',
|
||||||
|
msgLoading: 'Loading file {index} of {files} …',
|
||||||
|
msgProgress: 'Loading file {index} of {files} - {name} - {percent}% completed.',
|
||||||
|
msgSelected: '{n} {files} selected',
|
||||||
|
msgFoldersNotAllowed: 'Drag & drop files only! Skipped {n} dropped folder(s).',
|
||||||
|
msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px.',
|
||||||
|
msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px.',
|
||||||
|
msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.',
|
||||||
|
msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.',
|
||||||
|
msgImageResizeError: 'Could not get the image dimensions to resize.',
|
||||||
|
msgImageResizeException: 'Error while resizing the image.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Drag & drop files here …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Remove file',
|
||||||
|
uploadTitle: 'Upload file',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'View details',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Not uploaded yet',
|
||||||
|
indicatorSuccessTitle: 'Uploaded',
|
||||||
|
indicatorErrorTitle: 'Upload Error',
|
||||||
|
indicatorLoadingTitle: 'Uploading ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Arabic Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Yasser Lotfy <y_l@live.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ar'] = {
|
||||||
|
fileSingle: 'ملف',
|
||||||
|
filePlural: 'ملفات',
|
||||||
|
browseLabel: 'تصفح …',
|
||||||
|
removeLabel: 'إزالة',
|
||||||
|
removeTitle: 'إزالة الملفات المختارة',
|
||||||
|
cancelLabel: 'إلغاء',
|
||||||
|
cancelTitle: 'إنهاء الرفع الحالي',
|
||||||
|
uploadLabel: 'رفع',
|
||||||
|
uploadTitle: 'رفع الملفات المختارة',
|
||||||
|
msgNo: 'لا',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'ألغيت',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'معاينة تفصيلية',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'الملف "{name}" (<b>{size} ك.ب</b>) تعدى الحد الأقصى المسموح للرفع <b>{maxSize} ك.ب</b>.',
|
||||||
|
msgFilesTooLess: 'يجب عليك اختيار <b>{n}</b> {files} على الأقل للرفع.',
|
||||||
|
msgFilesTooMany: 'عدد الملفات المختارة للرفع <b>({n})</b> تعدت الحد الأقصى المسموح به لعدد <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'الملف "{name}" غير موجود!',
|
||||||
|
msgFileSecured: 'قيود أمنية تمنع قراءة الملف "{name}".',
|
||||||
|
msgFileNotReadable: 'الملف "{name}" غير قابل للقراءة.',
|
||||||
|
msgFilePreviewAborted: 'تم إلغاء معاينة الملف "{name}".',
|
||||||
|
msgFilePreviewError: 'حدث خطأ أثناء قراءة الملف "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'نوعية غير صالحة للملف "{name}". فقط هذه النوعيات مدعومة "{types}".',
|
||||||
|
msgInvalidFileExtension: 'امتداد غير صالح للملف "{name}". فقط هذه الملفات مدعومة "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'تم إلغاء رفع الملف',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'خطأ التحقق من صحة',
|
||||||
|
msgLoading: 'تحميل ملف {index} من {files} …',
|
||||||
|
msgProgress: 'تحميل ملف {index} من {files} - {name} - {percent}% منتهي.',
|
||||||
|
msgSelected: '{n} {files} مختار(ة)',
|
||||||
|
msgFoldersNotAllowed: 'اسحب وأفلت الملفات فقط! تم تخطي {n} مجلد(ات).',
|
||||||
|
msgImageWidthSmall: 'عرض ملف الصورة "{name}" يجب أن يكون على الأقل {size} px.',
|
||||||
|
msgImageHeightSmall: 'طول ملف الصورة "{name}" يجب أن يكون على الأقل {size} px.',
|
||||||
|
msgImageWidthLarge: 'عرض ملف الصورة "{name}" لا يمكن أن يتعدى {size} px.',
|
||||||
|
msgImageHeightLarge: 'طول ملف الصورة "{name}" لا يمكن أن يتعدى {size} px.',
|
||||||
|
msgImageResizeError: 'لم يتمكن من معرفة أبعاد الصورة لتغييرها.',
|
||||||
|
msgImageResizeException: 'حدث خطأ أثناء تغيير أبعاد الصورة.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'اسحب وأفلت الملفات هنا …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'إزالة الملف',
|
||||||
|
uploadTitle: 'رفع الملف',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'مشاهدة التفاصيل',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'لم يتم الرفع بعد',
|
||||||
|
indicatorSuccessTitle: 'تم الرفع',
|
||||||
|
indicatorErrorTitle: 'خطأ بالرفع',
|
||||||
|
indicatorLoadingTitle: 'جارٍ الرفع ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Azerbaijan Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Elbrus <elbrusnt@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['az'] = {
|
||||||
|
fileSingle: 'fayl',
|
||||||
|
filePlural: 'fayl',
|
||||||
|
browseLabel: 'Seç …',
|
||||||
|
removeLabel: 'Sil',
|
||||||
|
removeTitle: 'Seçilmiş faylları təmizlə',
|
||||||
|
cancelLabel: 'İmtina et',
|
||||||
|
cancelTitle: 'Cari yükləməni dayandır',
|
||||||
|
uploadLabel: 'Yüklə',
|
||||||
|
uploadTitle: 'Seçilmiş faylları yüklə',
|
||||||
|
msgNo: 'xeyir',
|
||||||
|
msgNoFilesSelected: 'Heç bir fayl seçilməmişdir',
|
||||||
|
msgCancelled: 'İmtina edildi',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'İlkin baxış',
|
||||||
|
msgFileRequired: 'Yükləmə üçün fayl seçməlisiniz.',
|
||||||
|
msgSizeTooSmall: 'Seçdiyiniz "{name}" faylının həcmi (<b>{size} KB</b>)-dır, minimum <b>{minSize} KB</b> olmalıdır.',
|
||||||
|
msgSizeTooLarge: 'Seçdiyiniz "{name}" faylının həcmi (<b>{size} KB</b>)-dır, maksimum <b>{maxSize} KB</b> olmalıdır.',
|
||||||
|
msgFilesTooLess: 'Yükləmə üçün minimum <b>{n}</b> {files} seçməlisiniz.',
|
||||||
|
msgFilesTooMany: 'Seçilmiş fayl sayı <b>({n})</b>. Maksimum <b>{m}</b> fayl seçmək mümkündür.',
|
||||||
|
msgFileNotFound: 'Fayl "{name}" tapılmadı!',
|
||||||
|
msgFileSecured: '"{name}" faylının istifadəsinə yetginiz yoxdur.',
|
||||||
|
msgFileNotReadable: '"{name}" faylının istifadəsi mümkün deyil.',
|
||||||
|
msgFilePreviewAborted: '"{name}" faylı üçün ilkin baxış ləğv olunub.',
|
||||||
|
msgFilePreviewError: '"{name}" faylının oxunması mümkün olmadı.',
|
||||||
|
msgInvalidFileName: '"{name}" faylının adında qadağan olunmuş simvollardan istifadə olunmuşdur.',
|
||||||
|
msgInvalidFileType: '"{name}" faylının tipi dəstəklənmir. Yalnız "{types}" tipli faylları yükləmək mümkündür.',
|
||||||
|
msgInvalidFileExtension: '"{name}" faylının genişlənməsi yanlışdır. Yalnız "{extensions}" fayl genişlənmə(si / ləri) qəbul olunur.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Yükləmə dayandırılmışdır',
|
||||||
|
msgUploadThreshold: 'Yükləmə...',
|
||||||
|
msgUploadBegin: 'Yoxlama...',
|
||||||
|
msgUploadEnd: 'Fayl(lar) yükləndi',
|
||||||
|
msgUploadEmpty: 'Yükləmə üçün verilmiş məlumatlar yanlışdır',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Yoxlama nəticəsi səhvir',
|
||||||
|
msgLoading: '{files} fayldan {index} yüklənir …',
|
||||||
|
msgProgress: '{files} fayldan {index} - {name} - {percent}% yükləndi.',
|
||||||
|
msgSelected: 'Faylların sayı: {n}',
|
||||||
|
msgFoldersNotAllowed: 'Ancaq faylların daşınmasına icazə verilir! {n} qovluq yüklənmədi.',
|
||||||
|
msgImageWidthSmall: '{name} faylının eni {size} px -dən kiçik olmamalıdır.',
|
||||||
|
msgImageHeightSmall: '{name} faylının hündürlüyü {size} px -dən kiçik olmamalıdır.',
|
||||||
|
msgImageWidthLarge: '"{name}" faylının eni {size} px -dən böyük olmamalıdır.',
|
||||||
|
msgImageHeightLarge: '"{name}" faylının hündürlüyü {size} px -dən böyük olmamalıdır.',
|
||||||
|
msgImageResizeError: 'Faylın ölçülərini dəyişmək üçün ölçüləri hesablamaq mümkün olmadı.',
|
||||||
|
msgImageResizeException: 'Faylın ölçülərini dəyişmək mümkün olmadı.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: '{operation} əməliyyatı zamanı səhv baş verdi. Təkrar yoxlayın!',
|
||||||
|
msgAjaxProgressError: '{operation} əməliyyatı yerinə yetirmək mümkün olmadı.',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'faylı sil',
|
||||||
|
uploadThumb: 'faylı yüklə',
|
||||||
|
uploadBatch: 'bir neçə faylı yüklə',
|
||||||
|
uploadExtra: 'məlumatların yüklənməsi'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Faylları bura daşıyın …',
|
||||||
|
dropZoneClickTitle: '<br>(Və ya seçin {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Faylı sil',
|
||||||
|
uploadTitle: 'Faylı yüklə',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'məlumatlara bax',
|
||||||
|
dragTitle: 'Yerini dəyiş və ya sırala',
|
||||||
|
indicatorNewTitle: 'Davam edir',
|
||||||
|
indicatorSuccessTitle: 'Tamamlandı',
|
||||||
|
indicatorErrorTitle: 'Yükləmə xətası',
|
||||||
|
indicatorLoadingTitle: 'Yükləmə ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Əvvəlki fayla bax',
|
||||||
|
next: 'Növbəti fayla bax',
|
||||||
|
toggleheader: 'Başlığı dəyiş',
|
||||||
|
fullscreen: 'Tam ekranı dəyiş',
|
||||||
|
borderless: 'Bölmələrsiz rejimi dəyiş',
|
||||||
|
close: 'Ətraflı baxışı bağla'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Bulgarian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['bg'] = {
|
||||||
|
fileSingle: 'файл',
|
||||||
|
filePlural: 'файла',
|
||||||
|
browseLabel: 'Избери …',
|
||||||
|
removeLabel: 'Премахни',
|
||||||
|
removeTitle: 'Изчисти избраните',
|
||||||
|
cancelLabel: 'Откажи',
|
||||||
|
cancelTitle: 'Откажи качването',
|
||||||
|
uploadLabel: 'Качи',
|
||||||
|
uploadTitle: 'Качи избраните файлове',
|
||||||
|
msgNo: 'Не',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Отменен',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Детайлен преглед',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Файла "{name}" (<b>{size} KB</b>) надвишава максималните разрешени <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Трябва да изберете поне <b>{n}</b> {files} файла.',
|
||||||
|
msgFilesTooMany: 'Броя файлове избрани за качване <b>({n})</b> надвишава ограниченито от максимум <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Файлът "{name}" не може да бъде намерен!',
|
||||||
|
msgFileSecured: 'От съображения за сигурност не може да прочетем файла "{name}".',
|
||||||
|
msgFileNotReadable: 'Файлът "{name}" не е четим.',
|
||||||
|
msgFilePreviewAborted: 'Прегледа на файла е прекратен за "{name}".',
|
||||||
|
msgFilePreviewError: 'Грешка при опит за четене на файла "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Невалиден тип на файла "{name}". Разрешени са само "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Невалидно разрешение на "{name}". Разрешени са само "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Качите файла, бе прекратена',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'утвърждаване грешка',
|
||||||
|
msgLoading: 'Зареждане на файл {index} от общо {files} …',
|
||||||
|
msgProgress: 'Зареждане на файл {index} от общо {files} - {name} - {percent}% завършени.',
|
||||||
|
msgSelected: '{n} {files} избрани',
|
||||||
|
msgFoldersNotAllowed: 'Само пуснати файлове! Пропуснати {n} пуснати папки.',
|
||||||
|
msgImageWidthSmall: 'Широчината на изображението "{name}" трябва да е поне {size} px.',
|
||||||
|
msgImageHeightSmall: 'Височината на изображението "{name}" трябва да е поне {size} px.',
|
||||||
|
msgImageWidthLarge: 'Широчината на изображението "{name}" не може да е по-голяма от {size} px.',
|
||||||
|
msgImageHeightLarge: 'Височината на изображението "{name}" нее може да е по-голяма от {size} px.',
|
||||||
|
msgImageResizeError: 'Не може да размерите на изображението, за да промените размера.',
|
||||||
|
msgImageResizeException: 'Грешка при промяна на размера на изображението.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Пуснете файловете тук …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Махни файл',
|
||||||
|
uploadTitle: 'Качване на файл',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Вижте детайли',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Все още не е качил',
|
||||||
|
indicatorSuccessTitle: 'Качено',
|
||||||
|
indicatorErrorTitle: 'Качи Error',
|
||||||
|
indicatorLoadingTitle: 'Качва се ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Català Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ca'] = {
|
||||||
|
fileSingle: 'arxiu',
|
||||||
|
filePlural: 'arxius',
|
||||||
|
browseLabel: 'Examinar …',
|
||||||
|
removeLabel: 'Treure',
|
||||||
|
removeTitle: 'Treure arxius seleccionats',
|
||||||
|
cancelLabel: 'Cancel',
|
||||||
|
cancelTitle: 'Avortar la pujada en curs',
|
||||||
|
uploadLabel: 'Pujar arxiu',
|
||||||
|
uploadTitle: 'Pujar arxius seleccionats',
|
||||||
|
msgNo: 'No',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'cancel·lat',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Vista prèvia detallada',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Arxiu "{name}" (<b>{size} KB</b>) excedeix la mida màxima permès de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Heu de seleccionar almenys <b>{n}</b> {files} a carregar.',
|
||||||
|
msgFilesTooMany: 'El nombre d\'arxius seleccionats a carregar <b>({n})</b> excedeix el límit màxim permès de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Arxiu "{name}" no trobat.',
|
||||||
|
msgFileSecured: 'No es pot accedir a l\'arxiu "{name}" perquè estarà sent usat per una altra aplicació o no tinguem permisos de lectura.',
|
||||||
|
msgFileNotReadable: 'No es pot accedir a l\'arxiu "{name}".',
|
||||||
|
msgFilePreviewAborted: 'Previsualització de l\'arxiu "{name}" cancel·lada.',
|
||||||
|
msgFilePreviewError: 'S\'ha produït un error mentre es llegia el fitxer "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipus de fitxer no vàlid per a "{name}". Només arxius "{types}" són permesos.',
|
||||||
|
msgInvalidFileExtension: 'Extensió de fitxer no vàlid per a "{name}". Només arxius "{extensions}" són permesos.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'La càrrega d\'arxius s\'ha cancel·lat',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Error de validació',
|
||||||
|
msgLoading: 'Pujant fitxer {index} de {files} …',
|
||||||
|
msgProgress: 'Pujant fitxer {index} de {files} - {name} - {percent}% completat.',
|
||||||
|
msgSelected: '{n} {files} seleccionat(s)',
|
||||||
|
msgFoldersNotAllowed: 'Arrossegueu i deixeu anar únicament arxius. Omesa(es) {n} carpeta(es).',
|
||||||
|
msgImageWidthSmall: 'L\'ample de la imatge "{name}" ha de ser almenys {size} px.',
|
||||||
|
msgImageHeightSmall: 'L\'alçada de la imatge "{name}" ha de ser almenys {size} px.',
|
||||||
|
msgImageWidthLarge: 'L\'ample de la imatge "{name}" no pot excedir de {size} px.',
|
||||||
|
msgImageHeightLarge: 'L\'alçada de la imatge "{name}" no pot excedir de {size} px.',
|
||||||
|
msgImageResizeError: 'No s\'ha pogut obtenir les dimensions d\'imatge per canviar la mida.',
|
||||||
|
msgImageResizeException: 'Error en canviar la mida de la imatge.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Arrossegueu i deixeu anar aquí els arxius …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Eliminar arxiu',
|
||||||
|
uploadTitle: 'Pujar arxiu',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Veure detalls',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'No pujat encara',
|
||||||
|
indicatorSuccessTitle: 'Subido',
|
||||||
|
indicatorErrorTitle: 'Pujar Error',
|
||||||
|
indicatorLoadingTitle: 'Pujant ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Croatian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Milos Stojanovic <stojanovic.loshmi@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['cr'] = {
|
||||||
|
fileSingle: 'datoteka',
|
||||||
|
filePlural: 'datoteke',
|
||||||
|
browseLabel: 'Izaberi …',
|
||||||
|
removeLabel: 'Ukloni',
|
||||||
|
removeTitle: 'Ukloni označene datoteke',
|
||||||
|
cancelLabel: 'Odustani',
|
||||||
|
cancelTitle: 'Prekini trenutno otpremanje',
|
||||||
|
uploadLabel: 'Otpremi',
|
||||||
|
uploadTitle: 'Otpremi označene datoteke',
|
||||||
|
msgNo: 'Ne',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Otkazan',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detaljni pregled',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Datoteka "{name}" (<b>{size} KB</b>) prekoračuje maksimalnu dozvoljenu veličinu datoteke od <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Morate odabrati najmanje <b>{n}</b> {files} za otpremanje.',
|
||||||
|
msgFilesTooMany: 'Broj datoteka označenih za otpremanje <b>({n})</b> prekoračuje maksimalni dozvoljeni limit od <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Datoteka "{name}" nije pronađena!',
|
||||||
|
msgFileSecured: 'Datoteku "{name}" nije moguće pročitati zbog bezbednosnih ograničenja.',
|
||||||
|
msgFileNotReadable: 'Datoteku "{name}" nije moguće pročitati.',
|
||||||
|
msgFilePreviewAborted: 'Generisanje prikaza nije moguće za "{name}".',
|
||||||
|
msgFilePreviewError: 'Došlo je do greške prilikom čitanja datoteke "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Datoteka "{name}" je pogrešnog formata. Dozvoljeni formati su "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Ekstenzija datoteke "{name}" nije dozvoljena. Dozvoljene ekstenzije su "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Prijenos datoteka je prekinut',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Provjera pogrešaka',
|
||||||
|
msgLoading: 'Učitavanje datoteke {index} od {files} …',
|
||||||
|
msgProgress: 'Učitavanje datoteke {index} od {files} - {name} - {percent}% završeno.',
|
||||||
|
msgSelected: '{n} {files} je označeno',
|
||||||
|
msgFoldersNotAllowed: 'Moguće je prevlačiti samo datoteke! Preskočeno je {n} fascikla.',
|
||||||
|
msgImageWidthSmall: 'Širina slikovnu datoteku "{name}" moraju biti najmanje {size} px.',
|
||||||
|
msgImageHeightSmall: 'Visina slikovnu datoteku "{name}" moraju biti najmanje {size} px.',
|
||||||
|
msgImageWidthLarge: 'Širina slikovnu datoteku "{name}" ne može prelaziti {size} px.',
|
||||||
|
msgImageHeightLarge: 'Visina slikovnu datoteku "{name}" ne može prelaziti {size} px.',
|
||||||
|
msgImageResizeError: 'Nije mogao dobiti dimenzije slike na veličinu.',
|
||||||
|
msgImageResizeException: 'Greška prilikom promjene veličine slike.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Prevucite datoteke ovde …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Uklonite datoteku',
|
||||||
|
uploadTitle: 'Postavi datoteku',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Pregledavati pojedinosti',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Još nije učitao',
|
||||||
|
indicatorSuccessTitle: 'Preneseno',
|
||||||
|
indicatorErrorTitle: 'Postavi Greška',
|
||||||
|
indicatorLoadingTitle: 'Prijenos ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Czech Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['cs'] = {
|
||||||
|
fileSingle: 'soubor',
|
||||||
|
filePlural: 'soubory',
|
||||||
|
browseLabel: 'Vybrat …',
|
||||||
|
removeLabel: 'Odstranit',
|
||||||
|
removeTitle: 'Vyčistit vybrané soubory',
|
||||||
|
cancelLabel: 'Storno',
|
||||||
|
cancelTitle: 'Přerušit nahrávání',
|
||||||
|
uploadLabel: 'Nahrát',
|
||||||
|
uploadTitle: 'Nahrát vybrané soubory',
|
||||||
|
msgNo: 'Ne',
|
||||||
|
msgNoFilesSelected: 'Nevybrány žádné soubory',
|
||||||
|
msgCancelled: 'Zrušeno',
|
||||||
|
msgPlaceholder: 'Vybrat {files}...',
|
||||||
|
msgZoomModalHeading: 'Detailní náhled',
|
||||||
|
msgFileRequired: 'Musíte vybrat soubor, který chcete nahrát.',
|
||||||
|
msgSizeTooSmall: 'Soubor "{name}" (<b>{size} KB</b>) je příliš malý, musí mít velikost nejméně <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Soubor "{name}" (<b>{size} KB</b>) je příliš velký, maximální povolená velikost <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Musíte vybrat nejméně <b>{n}</b> {files} souborů.',
|
||||||
|
msgFilesTooMany: 'Počet vybraných souborů <b>({n})</b> překročil maximální povolený limit <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Soubor "{name}" nebyl nalezen!',
|
||||||
|
msgFileSecured: 'Zabezpečení souboru znemožnilo číst soubor "{name}".',
|
||||||
|
msgFileNotReadable: 'Soubor "{name}" není čitelný.',
|
||||||
|
msgFilePreviewAborted: 'Náhled souboru byl přerušen pro "{name}".',
|
||||||
|
msgFilePreviewError: 'Nastala chyba při načtení souboru "{name}".',
|
||||||
|
msgInvalidFileName: 'Neplatné nebo nepovolené znaky ve jménu souboru "{name}".',
|
||||||
|
msgInvalidFileType: 'Neplatný typ souboru "{name}". Pouze "{types}" souborů jsou podporovány.',
|
||||||
|
msgInvalidFileExtension: 'Neplatná extenze souboru "{name}". Pouze "{extensions}" souborů jsou podporovány.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'obrázek',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Nahrávání souboru bylo přerušeno',
|
||||||
|
msgUploadThreshold: 'Zpracovávám...',
|
||||||
|
msgUploadBegin: 'Inicializujem...',
|
||||||
|
msgUploadEnd: 'Hotovo',
|
||||||
|
msgUploadEmpty: 'Pro nahrávání nejsou k dispozici žádné platné údaje.',
|
||||||
|
msgUploadError: 'Chyba',
|
||||||
|
msgValidationError: 'Chyba ověření',
|
||||||
|
msgLoading: 'Nahrávání souboru {index} z {files} …',
|
||||||
|
msgProgress: 'Nahrávání souboru {index} z {files} - {name} - {percent}% dokončeno.',
|
||||||
|
msgSelected: '{n} {files} vybráno',
|
||||||
|
msgFoldersNotAllowed: 'Táhni a pusť pouze soubory! Vynechané {n} pustěné složk(y).',
|
||||||
|
msgImageWidthSmall: 'Šířka obrázku "{name}", musí být alespoň {size} px.',
|
||||||
|
msgImageHeightSmall: 'Výška obrázku "{name}", musí být alespoň {size} px.',
|
||||||
|
msgImageWidthLarge: 'Šířka obrázku "{name}" nesmí být větší než {size} px.',
|
||||||
|
msgImageHeightLarge: 'Výška obrázku "{name}" nesmí být větší než {size} px.',
|
||||||
|
msgImageResizeError: 'Nelze získat rozměry obrázku pro změnu velikosti.',
|
||||||
|
msgImageResizeException: 'Chyba při změně velikosti obrázku.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Došlo k chybě v {operation}. Prosím zkuste to znovu později!',
|
||||||
|
msgAjaxProgressError: '{operation} - neúspěšné',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'odstranit soubor',
|
||||||
|
uploadThumb: 'nahrát soubor',
|
||||||
|
uploadBatch: 'nahrát várku souborů',
|
||||||
|
uploadExtra: 'odesílání dat formuláře'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Přetáhni soubory sem …',
|
||||||
|
dropZoneClickTitle: '<br>(nebo klikni sem a vyber je)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Odstranit soubor',
|
||||||
|
uploadTitle: 'Nahrát soubor',
|
||||||
|
uploadRetryTitle: 'Opakovat nahrávání',
|
||||||
|
downloadTitle: 'Stáhnout soubor',
|
||||||
|
zoomTitle: 'Zobrazit podrobnosti',
|
||||||
|
dragTitle: 'Posunout / Přeskládat',
|
||||||
|
indicatorNewTitle: 'Ještě nenahrál',
|
||||||
|
indicatorSuccessTitle: 'Nahraný',
|
||||||
|
indicatorErrorTitle: 'Chyba nahrávání',
|
||||||
|
indicatorLoadingTitle: 'Nahrávání ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Zobrazit předchozí soubor',
|
||||||
|
next: 'Zobrazit následující soubor',
|
||||||
|
toggleheader: 'Přepnout záhlaví',
|
||||||
|
fullscreen: 'Přepnout celoobrazovkové zobrazení',
|
||||||
|
borderless: 'Přepnout bezrámečkové zobrazení',
|
||||||
|
close: 'Zavřít detailní náhled'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Danish Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['da'] = {
|
||||||
|
fileSingle: 'fil',
|
||||||
|
filePlural: 'filer',
|
||||||
|
browseLabel: 'Browse …',
|
||||||
|
removeLabel: 'Fjern',
|
||||||
|
removeTitle: 'Fjern valgte filer',
|
||||||
|
cancelLabel: 'Fortryd',
|
||||||
|
cancelTitle: 'Afbryd nuværende upload',
|
||||||
|
uploadLabel: 'Upload',
|
||||||
|
uploadTitle: 'Upload valgte filer',
|
||||||
|
msgNo: 'Ingen',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'aflyst',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detaljeret visning',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Fil "{name}" (<b>{size} KB</b>) er større end de tilladte <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Du skal mindst vælge <b>{n}</b> {files} til upload.',
|
||||||
|
msgFilesTooMany: '<b>({n})</b> filer valgt til upload, men maks. <b>{m}</b> er tilladt.',
|
||||||
|
msgFileNotFound: 'Filen "{name}" blev ikke fundet!',
|
||||||
|
msgFileSecured: 'Sikkerhedsrestriktioner forhindrer læsning af "{name}".',
|
||||||
|
msgFileNotReadable: 'Filen "{name}" kan ikke indlæses.',
|
||||||
|
msgFilePreviewAborted: 'Filpreview annulleret for "{name}".',
|
||||||
|
msgFilePreviewError: 'Der skete en fejl under læsningen af filen "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Ukendt type for filen "{name}". Kun "{types}" kan bruges.',
|
||||||
|
msgInvalidFileExtension: 'Ukendt filtype for filen "{name}". Kun "{extensions}" filer kan bruges.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Filupload annulleret',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Validering Fejl',
|
||||||
|
msgLoading: 'Henter fil {index} af {files} …',
|
||||||
|
msgProgress: 'Henter fil {index} af {files} - {name} - {percent}% færdiggjort.',
|
||||||
|
msgSelected: '{n} {files} valgt',
|
||||||
|
msgFoldersNotAllowed: 'Drag & drop kun filer! {n} mappe(r) sprunget over.',
|
||||||
|
msgImageWidthSmall: 'Bredden af billedet "{name}" skal være på mindst {size} px.',
|
||||||
|
msgImageHeightSmall: 'Højden af billedet "{name}" skal være på mindst {size} px.',
|
||||||
|
msgImageWidthLarge: 'Bredden af billedet "{name}" må ikke være over {size} px.',
|
||||||
|
msgImageHeightLarge: 'Højden af billedet "{name}" må ikke være over {size} px.',
|
||||||
|
msgImageResizeError: 'Kunne ikke få billedets dimensioner for at ændre størrelsen.',
|
||||||
|
msgImageResizeException: 'Fejl ved at ændre størrelsen på billedet.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Drag & drop filer her …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Fjern fil',
|
||||||
|
uploadTitle: 'Upload fil',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Se detaljer',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Ikke uploadet endnu',
|
||||||
|
indicatorSuccessTitle: 'Uploadet',
|
||||||
|
indicatorErrorTitle: 'Upload fejl',
|
||||||
|
indicatorLoadingTitle: 'Uploader ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*!
|
||||||
|
* FileInput German Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['de'] = {
|
||||||
|
fileSingle: 'Datei',
|
||||||
|
filePlural: 'Dateien',
|
||||||
|
browseLabel: 'Auswählen …',
|
||||||
|
removeLabel: 'Löschen',
|
||||||
|
removeTitle: 'Ausgewählte löschen',
|
||||||
|
cancelLabel: 'Abbrechen',
|
||||||
|
cancelTitle: 'Hochladen abbrechen',
|
||||||
|
uploadLabel: 'Hochladen',
|
||||||
|
uploadTitle: 'Hochladen der ausgewählten Dateien',
|
||||||
|
msgNo: 'Keine',
|
||||||
|
msgNoFilesSelected: 'Keine Dateien ausgewählt',
|
||||||
|
msgCancelled: 'Abgebrochen',
|
||||||
|
msgPlaceholder: '{files} auswählen...',
|
||||||
|
msgZoomModalHeading: 'ausführliche Vorschau',
|
||||||
|
msgFileRequired: 'Sie müssen eine Datei zum Hochladen auswählen.',
|
||||||
|
msgSizeTooSmall: 'Datei "{name}" (<b>{size} KB</b>) unterschreitet mindestens notwendige Upload-Größe von <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Datei "{name}" (<b>{size} KB</b>) überschreitet maximal zulässige Upload-Größe von <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Sie müssen mindestens <b>{n}</b> {files} zum Hochladen auswählen.',
|
||||||
|
msgFilesTooMany: 'Anzahl der zum Hochladen ausgewählten Dateien <b>({n})</b>, überschreitet maximal zulässige Grenze von <b>{m}</b> Stück.',
|
||||||
|
msgFileNotFound: 'Datei "{name}" wurde nicht gefunden!',
|
||||||
|
msgFileSecured: 'Sicherheitseinstellungen verhindern das Lesen der Datei "{name}".',
|
||||||
|
msgFileNotReadable: 'Die Datei "{name}" ist nicht lesbar.',
|
||||||
|
msgFilePreviewAborted: 'Dateivorschau abgebrochen für "{name}".',
|
||||||
|
msgFilePreviewError: 'Beim Lesen der Datei "{name}" ein Fehler aufgetreten.',
|
||||||
|
msgInvalidFileName: 'Ungültige oder nicht unterstützte Zeichen im Dateinamen "{name}".',
|
||||||
|
msgInvalidFileType: 'Ungültiger Typ für Datei "{name}". Nur Dateien der Typen "{types}" werden unterstützt.',
|
||||||
|
msgInvalidFileExtension: 'Ungültige Erweiterung für Datei "{name}". Nur Dateien mit der Endung "{extensions}" werden unterstützt.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Der Datei-Upload wurde abgebrochen',
|
||||||
|
msgUploadThreshold: 'Wird bearbeitet ...',
|
||||||
|
msgUploadBegin: 'Wird initialisiert ...',
|
||||||
|
msgUploadEnd: 'Erledigt',
|
||||||
|
msgUploadEmpty: 'Keine gültigen Daten zum Hochladen verfügbar.',
|
||||||
|
msgUploadError: 'Fehler',
|
||||||
|
msgValidationError: 'Validierungsfehler',
|
||||||
|
msgLoading: 'Lade Datei {index} von {files} hoch…',
|
||||||
|
msgProgress: 'Datei {index} von {files} - {name} - zu {percent}% fertiggestellt.',
|
||||||
|
msgSelected: '{n} {files} ausgewählt',
|
||||||
|
msgFoldersNotAllowed: 'Drag & Drop funktioniert nur bei Dateien! {n} Ordner übersprungen.',
|
||||||
|
msgImageWidthSmall: 'Breite der Bilddatei "{name}" muss mindestens {size} px betragen.',
|
||||||
|
msgImageHeightSmall: 'Höhe der Bilddatei "{name}" muss mindestens {size} px betragen.',
|
||||||
|
msgImageWidthLarge: 'Breite der Bilddatei "{name}" nicht überschreiten {size} px.',
|
||||||
|
msgImageHeightLarge: 'Höhe der Bilddatei "{name}" nicht überschreiten {size} px.',
|
||||||
|
msgImageResizeError: 'Konnte nicht die Bildabmessungen zu ändern.',
|
||||||
|
msgImageResizeException: 'Fehler beim Ändern der Größe des Bildes.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Bei der Aktion {operation} ist ein Fehler aufgetreten. Bitte versuche es später noch einmal!',
|
||||||
|
msgAjaxProgressError: '{operation} fehlgeschlagen',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'Datei löschen',
|
||||||
|
uploadThumb: 'Datei hochladen',
|
||||||
|
uploadBatch: 'Batch-Datei-Upload',
|
||||||
|
uploadExtra: 'Formular-Datei-Upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Dateien hierher ziehen …',
|
||||||
|
dropZoneClickTitle: '<br>(oder klicken um {files} auszuwählen)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Datei entfernen',
|
||||||
|
uploadTitle: 'Datei hochladen',
|
||||||
|
uploadRetryTitle: 'Upload erneut versuchen',
|
||||||
|
downloadTitle: 'Datei herunterladen',
|
||||||
|
zoomTitle: 'Details anzeigen',
|
||||||
|
dragTitle: 'Verschieben / Neuordnen',
|
||||||
|
indicatorNewTitle: 'Noch nicht hochgeladen',
|
||||||
|
indicatorSuccessTitle: 'Hochgeladen',
|
||||||
|
indicatorErrorTitle: 'Upload Fehler',
|
||||||
|
indicatorLoadingTitle: 'Hochladen ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Vorherige Datei anzeigen',
|
||||||
|
next: 'Nächste Datei anzeigen',
|
||||||
|
toggleheader: 'Header umschalten',
|
||||||
|
fullscreen: 'Vollbildmodus umschalten',
|
||||||
|
borderless: 'Randlosen Modus umschalten',
|
||||||
|
close: 'Detailansicht schließen'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Greek Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['el'] = {
|
||||||
|
fileSingle: 'αρχείο',
|
||||||
|
filePlural: 'αρχεία',
|
||||||
|
browseLabel: 'Αναζήτηση …',
|
||||||
|
removeLabel: 'Διαγραφή',
|
||||||
|
removeTitle: 'Εκκαθάριση αρχείων',
|
||||||
|
cancelLabel: 'Ακύρωση',
|
||||||
|
cancelTitle: 'Ακύρωση μεταφόρτωσης',
|
||||||
|
uploadLabel: 'Μεταφόρτωση',
|
||||||
|
uploadTitle: 'Μεταφόρτωση επιλεγμένων αρχείων',
|
||||||
|
msgNo: 'Όχι',
|
||||||
|
msgNoFilesSelected: 'Δεν επιλέχθηκαν αρχεία',
|
||||||
|
msgCancelled: 'Ακυρώθηκε',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Λεπτομερής Προεπισκόπηση',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'Το "{name}" (<b>{size} KB</b>) είναι πολύ μικρό, πρέπει να είναι μεγαλύτερο από <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Το αρχείο "{name}" (<b>{size} KB</b>) υπερβαίνει το μέγιστο επιτρεπόμενο μέγεθος μεταφόρτωσης <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Πρέπει να επιλέξετε τουλάχιστον <b>{n}</b> {files} για να ξεκινήσει η μεταφόρτωση.',
|
||||||
|
msgFilesTooMany: 'Ο αριθμός των αρχείων που έχουν επιλεγεί για μεταφόρτωση <b>({n})</b> υπερβαίνει το μέγιστο επιτρεπόμενο αριθμό <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Το αρχείο "{name}" δεν βρέθηκε!',
|
||||||
|
msgFileSecured: 'Περιορισμοί ασφαλείας εμπόδισαν την ανάγνωση του αρχείου "{name}".',
|
||||||
|
msgFileNotReadable: 'Το αρχείο "{name}" δεν είναι αναγνώσιμο.',
|
||||||
|
msgFilePreviewAborted: 'Η προεπισκόπηση του αρχείου "{name}" ακυρώθηκε.',
|
||||||
|
msgFilePreviewError: 'Παρουσιάστηκε σφάλμα κατά την ανάγνωση του αρχείου "{name}".',
|
||||||
|
msgInvalidFileName: 'Μη έγκυροι χαρακτήρες στο όνομα του αρχείου "{name}".',
|
||||||
|
msgInvalidFileType: 'Μη έγκυρος ο τύπος του αρχείου "{name}". Οι τύποι αρχείων που υποστηρίζονται είναι : "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Μη έγκυρη η επέκταση του αρχείου "{name}". Οι επεκτάσεις που υποστηρίζονται είναι : "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Η μεταφόρτωση του αρχείου ματαιώθηκε',
|
||||||
|
msgUploadThreshold: 'Μεταφόρτωση ...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Σφάλμα Επικύρωσης',
|
||||||
|
msgLoading: 'Φόρτωση αρχείου {index} από {files} …',
|
||||||
|
msgProgress: 'Φόρτωση αρχείου {index} απο {files} - {name} - {percent}% ολοκληρώθηκε.',
|
||||||
|
msgSelected: '{n} {files} επιλέχθηκαν',
|
||||||
|
msgFoldersNotAllowed: 'Μπορείτε να σύρετε μόνο αρχεία! Παραβλέφθηκαν {n} φάκελος(οι).',
|
||||||
|
msgImageWidthSmall: 'Το πλάτος του αρχείου εικόνας "{name}" πρέπει να είναι τουλάχιστον {size} px.',
|
||||||
|
msgImageHeightSmall: 'Το ύψος του αρχείου εικόνας "{name}" πρέπει να είναι τουλάχιστον {size} px.',
|
||||||
|
msgImageWidthLarge: 'Το πλάτος του αρχείου εικόνας "{name}" δεν μπορεί να υπερβαίνει το {size} px.',
|
||||||
|
msgImageHeightLarge: 'Το ύψος του αρχείου εικόνας "{name}" δεν μπορεί να υπερβαίνει το {size} px.',
|
||||||
|
msgImageResizeError: 'Δεν μπορούν να βρεθούν οι διαστάσεις της εικόνας για να αλλάγή μεγέθους.',
|
||||||
|
msgImageResizeException: 'Σφάλμα κατά την αλλαγή μεγέθους της εικόνας. <pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Σύρετε τα αρχεία εδώ …',
|
||||||
|
dropZoneClickTitle: '<br>(ή πατήστε για επιλογή {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Αφαιρέστε το αρχείο',
|
||||||
|
uploadTitle: 'Μεταφορτώστε το αρχείο',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Δείτε λεπτομέρειες',
|
||||||
|
dragTitle: 'Μετακίνηση/Προσπαρμογή',
|
||||||
|
indicatorNewTitle: 'Δεν μεταφορτώθηκε ακόμα',
|
||||||
|
indicatorSuccessTitle: 'Μεταφορτώθηκε',
|
||||||
|
indicatorErrorTitle: 'Σφάλμα Μεταφόρτωσης',
|
||||||
|
indicatorLoadingTitle: 'Μεταφόρτωση ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Προηγούμενο αρχείο',
|
||||||
|
next: 'Επόμενο αρχείο',
|
||||||
|
toggleheader: 'Εμφάνιση/Απόκρυψη τίτλου',
|
||||||
|
fullscreen: 'Εναλλαγή πλήρους οθόνης',
|
||||||
|
borderless: 'Με ή χωρίς πλαίσιο',
|
||||||
|
close: 'Κλείσιμο προβολής'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Spanish Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['es'] = {
|
||||||
|
fileSingle: 'archivo',
|
||||||
|
filePlural: 'archivos',
|
||||||
|
browseLabel: 'Examinar …',
|
||||||
|
removeLabel: 'Quitar',
|
||||||
|
removeTitle: 'Quitar archivos seleccionados',
|
||||||
|
cancelLabel: 'Cancelar',
|
||||||
|
cancelTitle: 'Abortar la subida en curso',
|
||||||
|
uploadLabel: 'Subir archivo',
|
||||||
|
uploadTitle: 'Subir archivos seleccionados',
|
||||||
|
msgNo: 'No',
|
||||||
|
msgNoFilesSelected: 'No hay archivos seleccionados',
|
||||||
|
msgCancelled: 'Cancelado',
|
||||||
|
msgPlaceholder: 'Seleccionar {files}...',
|
||||||
|
msgZoomModalHeading: 'Vista previa detallada',
|
||||||
|
msgFileRequired: 'Debes seleccionar un archivo para subir.',
|
||||||
|
msgSizeTooSmall: 'El archivo "{name}" (<b>{size} KB</b>) es demasiado pequeño y debe ser mayor de <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'El archivo "{name}" (<b>{size} KB</b>) excede el tamaño máximo permitido de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Debe seleccionar al menos <b>{n}</b> {files} a cargar.',
|
||||||
|
msgFilesTooMany: 'El número de archivos seleccionados a cargar <b>({n})</b> excede el límite máximo permitido de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Archivo "{name}" no encontrado.',
|
||||||
|
msgFileSecured: 'No es posible acceder al archivo "{name}" porque está siendo usado por otra aplicación o no tiene permisos de lectura.',
|
||||||
|
msgFileNotReadable: 'No es posible acceder al archivo "{name}".',
|
||||||
|
msgFilePreviewAborted: 'Previsualización del archivo "{name}" cancelada.',
|
||||||
|
msgFilePreviewError: 'Ocurrió un error mientras se leía el archivo "{name}".',
|
||||||
|
msgInvalidFileName: 'Caracteres no válidos o no soportados en el nombre del archivo "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipo de archivo no válido para "{name}". Sólo se permiten archivos de tipo "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Extensión de archivo no válida para "{name}". Sólo se permiten archivos "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'La carga de archivos se ha cancelado',
|
||||||
|
msgUploadThreshold: 'Procesando...',
|
||||||
|
msgUploadBegin: 'Inicializando...',
|
||||||
|
msgUploadEnd: 'Hecho',
|
||||||
|
msgUploadEmpty: 'No existen datos válidos para el envío.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Error de validación',
|
||||||
|
msgLoading: 'Subiendo archivo {index} de {files} …',
|
||||||
|
msgProgress: 'Subiendo archivo {index} de {files} - {name} - {percent}% completado.',
|
||||||
|
msgSelected: '{n} {files} seleccionado(s)',
|
||||||
|
msgFoldersNotAllowed: 'Arrastre y suelte únicamente archivos. Omitida(s) {n} carpeta(s).',
|
||||||
|
msgImageWidthSmall: 'El ancho de la imagen "{name}" debe ser de al menos {size} px.',
|
||||||
|
msgImageHeightSmall: 'La altura de la imagen "{name}" debe ser de al menos {size} px.',
|
||||||
|
msgImageWidthLarge: 'El ancho de la imagen "{name}" no puede exceder de {size} px.',
|
||||||
|
msgImageHeightLarge: 'La altura de la imagen "{name}" no puede exceder de {size} px.',
|
||||||
|
msgImageResizeError: 'No se pudieron obtener las dimensiones de la imagen para cambiar el tamaño.',
|
||||||
|
msgImageResizeException: 'Error al cambiar el tamaño de la imagen.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Algo ha ido mal con la operación {operation}. Por favor, inténtelo de nuevo mas tarde.',
|
||||||
|
msgAjaxProgressError: 'La operación {operation} ha fallado',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'Archivo borrado',
|
||||||
|
uploadThumb: 'Archivo subido',
|
||||||
|
uploadBatch: 'Datos subidos en lote',
|
||||||
|
uploadExtra: 'Datos del formulario subidos '
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Arrastre y suelte aquí los archivos …',
|
||||||
|
dropZoneClickTitle: '<br>(o haga clic para seleccionar {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Eliminar archivo',
|
||||||
|
uploadTitle: 'Subir archivo',
|
||||||
|
uploadRetryTitle: 'Reintentar subir',
|
||||||
|
downloadTitle: 'Descargar archivo',
|
||||||
|
zoomTitle: 'Ver detalles',
|
||||||
|
dragTitle: 'Mover / Reordenar',
|
||||||
|
indicatorNewTitle: 'No subido todavía',
|
||||||
|
indicatorSuccessTitle: 'Subido',
|
||||||
|
indicatorErrorTitle: 'Error al subir',
|
||||||
|
indicatorLoadingTitle: 'Subiendo...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Anterior',
|
||||||
|
next: 'Siguiente',
|
||||||
|
toggleheader: 'Mostrar encabezado',
|
||||||
|
fullscreen: 'Pantalla completa',
|
||||||
|
borderless: 'Modo sin bordes',
|
||||||
|
close: 'Cerrar vista detallada'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Estonian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['et'] = {
|
||||||
|
fileSingle: 'fail',
|
||||||
|
filePlural: 'failid',
|
||||||
|
browseLabel: 'Sirvi …',
|
||||||
|
removeLabel: 'Eemalda',
|
||||||
|
removeTitle: 'Clear selected files',
|
||||||
|
cancelLabel: 'Tühista',
|
||||||
|
cancelTitle: 'Abort ongoing upload',
|
||||||
|
uploadLabel: 'Salvesta',
|
||||||
|
uploadTitle: 'Salvesta valitud failid',
|
||||||
|
msgNo: 'No',
|
||||||
|
msgNoFilesSelected: 'No files selected',
|
||||||
|
msgCancelled: 'Cancelled',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detailed Preview',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Fail "{name}" (<b>{size} KB</b>) ületab lubatu suuruse <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'You must select at least <b>{n}</b> {files} to upload.',
|
||||||
|
msgFilesTooMany: 'Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'File "{name}" not found!',
|
||||||
|
msgFileSecured: 'Security restrictions prevent reading the file "{name}".',
|
||||||
|
msgFileNotReadable: 'File "{name}" is not readable.',
|
||||||
|
msgFilePreviewAborted: 'File preview aborted for "{name}".',
|
||||||
|
msgFilePreviewError: 'An error occurred while reading the file "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: '"{name}" on vale tüüpi. Ainult "{types}" on lubatud.',
|
||||||
|
msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'The file upload was aborted',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Validation Error',
|
||||||
|
msgLoading: 'Loading file {index} of {files} …',
|
||||||
|
msgProgress: 'Loading file {index} of {files} - {name} - {percent}% completed.',
|
||||||
|
msgSelected: '{n} {files} selected',
|
||||||
|
msgFoldersNotAllowed: 'Drag & drop files only! Skipped {n} dropped folder(s).',
|
||||||
|
msgImageWidthSmall: 'Pildi laius peab olema vähemalt {size} px.',
|
||||||
|
msgImageHeightSmall: 'Pildi kõrgus peab olema vähemalt {size} px.',
|
||||||
|
msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.',
|
||||||
|
msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.',
|
||||||
|
msgImageResizeError: 'Could not get the image dimensions to resize.',
|
||||||
|
msgImageResizeException: 'Error while resizing the image.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Lohista failid siia …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Eemalda fail',
|
||||||
|
uploadTitle: 'Salvesta fail',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
zoomTitle: 'Vaata detaile',
|
||||||
|
dragTitle: 'Liiguta / Korralda',
|
||||||
|
indicatorNewTitle: 'Pole veel salvestatud',
|
||||||
|
indicatorSuccessTitle: 'Uploaded',
|
||||||
|
indicatorErrorTitle: 'Salvestamise viga',
|
||||||
|
indicatorLoadingTitle: 'Salvestan ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Persian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Milad Nekofar <milad@nekofar.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['fa'] = {
|
||||||
|
fileSingle: 'فایل',
|
||||||
|
filePlural: 'فایلها',
|
||||||
|
browseLabel: 'مرور …',
|
||||||
|
removeLabel: 'حذف',
|
||||||
|
removeTitle: 'پاکسازی فایلهای انتخاب شده',
|
||||||
|
cancelLabel: 'لغو',
|
||||||
|
cancelTitle: 'لغو بارگزاری جاری',
|
||||||
|
uploadLabel: 'بارگذاری',
|
||||||
|
uploadTitle: 'بارگذاری فایلهای انتخاب شده',
|
||||||
|
msgNo: 'نه',
|
||||||
|
msgNoFilesSelected: 'هیچ فایلی انتخاب نشده است',
|
||||||
|
msgCancelled: 'لغو شد',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'نمایش با جزییات',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'فایل "{name}" (<b>{size} کیلوبایت</b>) خیلی کوچک است و باید از <b>{minSize} کیلوبایت بزرگتر باشد</b>.',
|
||||||
|
msgSizeTooLarge: 'فایل "{name}" (<b>{size} کیلوبایت</b>) از حداکثر مجاز <b>{maxSize} کیلوبایت</b> بزرگتر است.',
|
||||||
|
msgFilesTooLess: 'شما باید حداقل <b>{n}</b> {files} فایل برای بارگذاری انتخاب کنید.',
|
||||||
|
msgFilesTooMany: 'تعداد فایلهای انتخاب شده برای بارگذاری <b>({n})</b> از حداکثر مجاز عبور کرده است <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'فایل "{name}" یافت نشد!',
|
||||||
|
msgFileSecured: 'محدودیت های امنیتی مانع خواندن فایل "{name}" است.',
|
||||||
|
msgFileNotReadable: 'فایل "{name}" قابل نوشتن نیست.',
|
||||||
|
msgFilePreviewAborted: 'پیش نمایش فایل "{name}". به مشکل خورد',
|
||||||
|
msgFilePreviewError: 'در هنگام خواندن فایل "{name}" خطایی رخ داد.',
|
||||||
|
msgInvalidFileName: 'کاراکترهای غیرمجاز و یا ناشناخته در نام فایل "{name}".',
|
||||||
|
msgInvalidFileType: 'نوع فایل "{name}" معتبر نیست. فقط "{types}" پشیبانی میشوند.',
|
||||||
|
msgInvalidFileExtension: 'پسوند فایل "{name}" معتبر نیست. فقط "{extensions}" پشتیبانی میشوند.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'عکس',
|
||||||
|
'html': 'اچ تا ام ال',
|
||||||
|
'text': 'متن',
|
||||||
|
'video': 'ویدئو',
|
||||||
|
'audio': 'صدا',
|
||||||
|
'flash': 'فلش',
|
||||||
|
'pdf': 'پی دی اف',
|
||||||
|
'object': 'دیگر'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'بارگذاری فایل به مشکل خورد.',
|
||||||
|
msgUploadThreshold: 'در حال پردازش...',
|
||||||
|
msgUploadBegin: 'در حال شروع...',
|
||||||
|
msgUploadEnd: 'انجام شد',
|
||||||
|
msgUploadEmpty: 'هیچ داده معتبری برای بارگذاری موجود نیست.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'خطای اعتبار سنجی',
|
||||||
|
msgLoading: 'بارگیری فایل {index} از {files} …',
|
||||||
|
msgProgress: 'بارگیری فایل {index} از {files} - {name} - {percent}% تمام شد.',
|
||||||
|
msgSelected: '{n} {files} انتخاب شده',
|
||||||
|
msgFoldersNotAllowed: 'فقط فایلها را بکشید و رها کنید! {n} پوشه نادیده گرفته شد.',
|
||||||
|
msgImageWidthSmall: 'عرض فایل تصویر "{name}" باید حداقل {size} پیکسل باشد.',
|
||||||
|
msgImageHeightSmall: 'ارتفاع فایل تصویر "{name}" باید حداقل {size} پیکسل باشد.',
|
||||||
|
msgImageWidthLarge: 'عرض فایل تصویر "{name}" نمیتواند از {size} پیکسل بیشتر باشد.',
|
||||||
|
msgImageHeightLarge: 'ارتفاع فایل تصویر "{name}" نمیتواند از {size} پیکسل بیشتر باشد.',
|
||||||
|
msgImageResizeError: 'یافت نشد ابعاد تصویر را برای تغییر اندازه.',
|
||||||
|
msgImageResizeException: 'خطا در هنگام تغییر اندازه تصویر.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'به نظر مشکلی در حین {operation} روی داده است. لطفا دوباره تلاش کنید!',
|
||||||
|
msgAjaxProgressError: '{operation} لغو شد',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'حذف فایل',
|
||||||
|
uploadThumb: 'بارگذاری فایل',
|
||||||
|
uploadBatch: 'بارگذاری جمعی فایلها',
|
||||||
|
uploadExtra: 'بارگذاری با کمک فُرم'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'فایلها را بکشید و در اینجا رها کنید …',
|
||||||
|
dropZoneClickTitle: '<br>(یا برای انتخاب {files} کلیک کنید)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'حذف فایل',
|
||||||
|
uploadTitle: 'آپلود فایل',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'دیدن جزئیات',
|
||||||
|
dragTitle: 'جابجایی / چیدمان',
|
||||||
|
indicatorNewTitle: 'آپلود نشده است',
|
||||||
|
indicatorSuccessTitle: 'آپلود شده',
|
||||||
|
indicatorErrorTitle: 'بارگذاری خطا',
|
||||||
|
indicatorLoadingTitle: 'آپلود ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'مشاهده فایل قبلی',
|
||||||
|
next: 'مشاهده فایل بعدی',
|
||||||
|
toggleheader: 'نمایش عنوان',
|
||||||
|
fullscreen: 'نمایش تمام صفحه',
|
||||||
|
borderless: 'نمایش حاشیه',
|
||||||
|
close: 'بستن نمایش با جزییات'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Finnish Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales.fi = {
|
||||||
|
fileSingle: 'tiedosto',
|
||||||
|
filePlural: 'tiedostot',
|
||||||
|
browseLabel: 'Selaa …',
|
||||||
|
removeLabel: 'Poista',
|
||||||
|
removeTitle: 'Tyhjännä valitut tiedostot',
|
||||||
|
cancelLabel: 'Peruuta',
|
||||||
|
cancelTitle: 'Peruuta lataus',
|
||||||
|
uploadLabel: 'Lataa',
|
||||||
|
uploadTitle: 'Lataa valitut tiedostot',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Tiedosto "{name}" (<b>{size} Kt</b>) ylittää suurimman sallitun tiedoston koon, joka on <b>{maxSize} Kt</b>. Yritä uudelleen!',
|
||||||
|
msgFilesTooLess: 'Vähintään <b>{n}</b> {files} tiedostoa on valittava ladattavaksi. Ole hyvä ja yritä uudelleen!',
|
||||||
|
msgFilesTooMany: 'Valittujen tiedostojen lukumäärä <b>({n})</b> ylittää suurimman sallitun määrän <b>{m}</b>. Ole hyvä ja yritä uudelleen!',
|
||||||
|
msgFileNotFound: 'Tiedostoa "{name}" ei löydy!',
|
||||||
|
msgFileSecured: 'Tietoturvarajoitukset estävät tiedoston "{name}" lukemisen.',
|
||||||
|
msgFileNotReadable: 'Tiedosto "{name}" ei ole luettavissa.',
|
||||||
|
msgFilePreviewAborted: 'Tiedoston "{name}" esikatselu keskeytetty.',
|
||||||
|
msgFilePreviewError: 'Virhe on tapahtunut luettaessa tiedostoa "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Tiedosto "{name}" on väärän tyyppinen. Ainoastaan tiedostot tyyppiä "{types}" ovat tuettuja.',
|
||||||
|
msgInvalidFileExtension: 'Tiedoston "{name}" tarkenne on epäkelpo. Ainoastaan tarkenteet "{extensions}" ovat tuettuja.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'Kuva',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'Teksti',
|
||||||
|
'video': 'Video',
|
||||||
|
'audio': 'Ääni',
|
||||||
|
'flash': 'Flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'Olio'
|
||||||
|
},
|
||||||
|
msgUploadThreshold: 'Käsitellään...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'Ei ladattavaa dataa.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Tiedoston latausvirhe',
|
||||||
|
msgLoading: 'Ladataan tiedostoa {index} / {files} …',
|
||||||
|
msgProgress: 'Ladataan tiedostoa {index} / {files} - {name} - {percent}% valmistunut.',
|
||||||
|
msgSelected: '{n} tiedostoa valittu',
|
||||||
|
msgFoldersNotAllowed: 'Raahaa ja pudota ainoastaan tiedostoja! Ohitettu {n} raahattua kansiota.',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Raahaa ja pudota tiedostot tähän …',
|
||||||
|
dropZoneClickTitle: '<br>(tai valitse hiirellä {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Poista tiedosto',
|
||||||
|
uploadTitle: 'Upload file',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Yksityiskohdat',
|
||||||
|
dragTitle: 'Siirrä / Järjestele',
|
||||||
|
indicatorNewTitle: 'Ei ladattu',
|
||||||
|
indicatorSuccessTitle: 'Ladattu',
|
||||||
|
indicatorErrorTitle: 'Lataus epäonnistui',
|
||||||
|
indicatorLoadingTitle: 'Ladataan ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Seuraava tiedosto',
|
||||||
|
next: 'Edellinen tiedosto',
|
||||||
|
toggleheader: 'Näytä otsikko',
|
||||||
|
fullscreen: 'Kokonäytön tila',
|
||||||
|
borderless: 'Rajaton tila',
|
||||||
|
close: 'Sulje esikatselu'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.extend($.fn.fileinput.defaults, $.fn.fileinputLocales.fi);
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*!
|
||||||
|
* FileInput French Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['fr'] = {
|
||||||
|
fileSingle: 'fichier',
|
||||||
|
filePlural: 'fichiers',
|
||||||
|
browseLabel: 'Parcourir…',
|
||||||
|
removeLabel: 'Retirer',
|
||||||
|
removeTitle: 'Retirer les fichiers sélectionnés',
|
||||||
|
cancelLabel: 'Annuler',
|
||||||
|
cancelTitle: "Annuler l'envoi en cours",
|
||||||
|
uploadLabel: 'Transférer',
|
||||||
|
uploadTitle: 'Transférer les fichiers sélectionnés',
|
||||||
|
msgNo: 'Non',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Annulé',
|
||||||
|
msgPlaceholder: 'Sélectionner le(s) {files}...',
|
||||||
|
msgZoomModalHeading: 'Aperçu détaillé',
|
||||||
|
msgFileRequired: 'Vous devez sélectionner un fichier à uploader.',
|
||||||
|
msgSizeTooSmall: 'Le fichier "{name}" (<b>{size} KB</b>) est inférieur à la taille minimale de <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Le fichier "{name}" (<b>{size} Ko</b>) dépasse la taille maximale autorisée qui est de <b>{maxSize} Ko</b>.',
|
||||||
|
msgFilesTooLess: 'Vous devez sélectionner au moins <b>{n}</b> {files} à transmettre.',
|
||||||
|
msgFilesTooMany: 'Le nombre de fichier sélectionné <b>({n})</b> dépasse la quantité maximale autorisée qui est de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Le fichier "{name}" est introuvable !',
|
||||||
|
msgFileSecured: "Des restrictions de sécurité vous empêchent d'accéder au fichier \"{name}\".",
|
||||||
|
msgFileNotReadable: 'Le fichier "{name}" est illisible.',
|
||||||
|
msgFilePreviewAborted: 'Prévisualisation du fichier "{name}" annulée.',
|
||||||
|
msgFilePreviewError: 'Une erreur est survenue lors de la lecture du fichier "{name}".',
|
||||||
|
msgInvalidFileName: 'Caractères invalides ou non supportés dans le nom de fichier "{name}".',
|
||||||
|
msgInvalidFileType: 'Type de document invalide pour "{name}". Seulement les documents de type "{types}" sont autorisés.',
|
||||||
|
msgInvalidFileExtension: 'Extension invalide pour le fichier "{name}". Seules les extensions "{extensions}" sont autorisées.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Le transfert du fichier a été interrompu',
|
||||||
|
msgUploadThreshold: 'En cours...',
|
||||||
|
msgUploadBegin: 'Initialisation...',
|
||||||
|
msgUploadEnd: 'Terminé',
|
||||||
|
msgUploadEmpty: 'Aucune donnée valide disponible pour transmission.',
|
||||||
|
msgUploadError: 'Erreur',
|
||||||
|
msgValidationError: 'Erreur de validation',
|
||||||
|
msgLoading: 'Transmission du fichier {index} sur {files}…',
|
||||||
|
msgProgress: 'Transmission du fichier {index} sur {files} - {name} - {percent}%.',
|
||||||
|
msgSelected: '{n} {files} sélectionné(s)',
|
||||||
|
msgFoldersNotAllowed: 'Glissez et déposez uniquement des fichiers ! {n} répertoire(s) exclu(s).',
|
||||||
|
msgImageWidthSmall: 'La largeur de l\'image "{name}" doit être d\'au moins {size} px.',
|
||||||
|
msgImageHeightSmall: 'La hauteur de l\'image "{name}" doit être d\'au moins {size} px.',
|
||||||
|
msgImageWidthLarge: 'La largeur de l\'image "{name}" ne peut pas dépasser {size} px.',
|
||||||
|
msgImageHeightLarge: 'La hauteur de l\'image "{name}" ne peut pas dépasser {size} px.',
|
||||||
|
msgImageResizeError: "Impossible d'obtenir les dimensions de l'image à redimensionner.",
|
||||||
|
msgImageResizeException: "Erreur lors du redimensionnement de l'image.<pre>{errors}</pre>",
|
||||||
|
msgAjaxError: "Une erreur s'est produite pendant l'opération de {operation}. Veuillez réessayer plus tard.",
|
||||||
|
msgAjaxProgressError: 'L\'opération "{operation}" a échoué',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'suppression du fichier',
|
||||||
|
uploadThumb: 'transfert du fichier',
|
||||||
|
uploadBatch: 'transfert des fichiers',
|
||||||
|
uploadExtra: 'soumission des données de formulaire'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Glissez et déposez les fichiers ici…',
|
||||||
|
dropZoneClickTitle: '<br>(ou cliquez pour sélectionner manuellement)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Supprimer le fichier',
|
||||||
|
uploadTitle: 'Transférer le fichier',
|
||||||
|
uploadRetryTitle: 'Relancer le transfert',
|
||||||
|
zoomTitle: 'Voir les détails',
|
||||||
|
dragTitle: 'Déplacer / Réarranger',
|
||||||
|
indicatorNewTitle: 'Pas encore transféré',
|
||||||
|
indicatorSuccessTitle: 'Posté',
|
||||||
|
indicatorErrorTitle: 'Ajouter erreur',
|
||||||
|
indicatorLoadingTitle: 'En cours...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Voir le fichier précédent',
|
||||||
|
next: 'Voir le fichier suivant',
|
||||||
|
toggleheader: 'Masquer le titre',
|
||||||
|
fullscreen: 'Mode plein écran',
|
||||||
|
borderless: 'Mode cinéma',
|
||||||
|
close: "Fermer l'aperçu"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Galician Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['gl'] = {
|
||||||
|
fileSingle: 'arquivo',
|
||||||
|
filePlural: 'arquivos',
|
||||||
|
browseLabel: 'Examinar …',
|
||||||
|
removeLabel: 'Quitar',
|
||||||
|
removeTitle: 'Quitar aquivos seleccionados',
|
||||||
|
cancelLabel: 'Cancelar',
|
||||||
|
cancelTitle: 'Abortar a subida en curso',
|
||||||
|
uploadLabel: 'Subir arquivo',
|
||||||
|
uploadTitle: 'Subir arquivos seleccionados',
|
||||||
|
msgNo: 'Non',
|
||||||
|
msgNoFilesSelected: 'Non hay arquivos seleccionados',
|
||||||
|
msgCancelled: 'Cancelado',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Vista previa detallada',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'O arquivo "{name}" (<b>{size} KB</b>) é demasiado pequeño e debe ser maior de <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'El arquivo "{name}" (<b>{size} KB</b>) excede o tamaño máximo permitido de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Debe seleccionar al menos <b>{n}</b> {files} a cargar.',
|
||||||
|
msgFilesTooMany: 'O número de arquivos seleccionados a cargar <b>({n})</b> excede do límite máximo permitido de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Arquivo "{name}" non encontrado.',
|
||||||
|
msgFileSecured: 'Non é posible acceder o arquivo "{name}" porque estará sendo usado por outra aplicación ou non teñamos permisos de lectura.',
|
||||||
|
msgFileNotReadable: 'Non é posible acceder o archivo "{name}".',
|
||||||
|
msgFilePreviewAborted: 'Previsualización do arquivo "{name}" cancelada.',
|
||||||
|
msgFilePreviewError: 'Ocurriu un erro mentras se lía o arquivo "{name}".',
|
||||||
|
msgInvalidFileName: 'Caracteres non válidos o no soportados no nome do arquivos "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipo de archivo no válido para "{name}". Sólo se permiten arquivos do tipo "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Extensión de arquivo non válido para "{name}". Só se permiten arquivos "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'imaxe',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'A carga de arquivos cancelouse',
|
||||||
|
msgUploadThreshold: 'Procesando...',
|
||||||
|
msgUploadBegin: 'Inicialicando...',
|
||||||
|
msgUploadEnd: 'Feito',
|
||||||
|
msgUploadEmpty: 'Non existen datos válidos para o envío.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Erro de validación',
|
||||||
|
msgLoading: 'Subindo arquivo {index} de {files} …',
|
||||||
|
msgProgress: 'Subiendo arquivo {index} de {files} - {name} - {percent}% completado.',
|
||||||
|
msgSelected: '{n} {files} seleccionado(s)',
|
||||||
|
msgFoldersNotAllowed: 'Arrastra e solta únicamente arquivoa. Omitida(s) {n} carpeta(s).',
|
||||||
|
msgImageWidthSmall: 'O ancho da imaxe "{name}" debe ser de al menos {size} px.',
|
||||||
|
msgImageHeightSmall: 'A altura de la imaxe "{name}" debe ser de al menos {size} px.',
|
||||||
|
msgImageWidthLarge: 'El ancho de la imaxe "{name}" no puede exceder de {size} px.',
|
||||||
|
msgImageHeightLarge: 'La altura de la imaxe "{name}" no puede exceder de {size} px.',
|
||||||
|
msgImageResizeError: 'No se pudieron obtener las dimensiones de la imaxe para cambiar el tamaño.',
|
||||||
|
msgImageResizeException: 'Erro o cambiar o tamaño da imaxe.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Algo foi mal ca operación {operation}. Por favor, intentao de novo mais tarde.',
|
||||||
|
msgAjaxProgressError: 'A operación {operation} fallou',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'Arquivo borrado',
|
||||||
|
uploadThumb: 'Arquivo subido',
|
||||||
|
uploadBatch: 'Datos subidos en lote',
|
||||||
|
uploadExtra: 'Datos do formulario subidos'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Arrasta e solte aquí os arquivos …',
|
||||||
|
dropZoneClickTitle: '<br>(ou fai clic para seleccionar {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Eliminar arquivo',
|
||||||
|
uploadTitle: 'Subir arquivo',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Ver detalles',
|
||||||
|
dragTitle: 'Mover / Reordenar',
|
||||||
|
indicatorNewTitle: 'Non subido todavía',
|
||||||
|
indicatorSuccessTitle: 'Subido',
|
||||||
|
indicatorErrorTitle: 'Erro o subir',
|
||||||
|
indicatorLoadingTitle: 'Subiendo...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Ver arquivo anterior',
|
||||||
|
next: 'Ver arquivo siguinte',
|
||||||
|
toggleheader: 'Mostrar encabezado',
|
||||||
|
fullscreen: 'Mostrar a pantalla completa',
|
||||||
|
borderless: 'Activar o modo sen bordes',
|
||||||
|
close: 'Cerrar vista detallada'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Hungarian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['hu'] = {
|
||||||
|
fileSingle: 'fájl',
|
||||||
|
filePlural: 'fájlok',
|
||||||
|
browseLabel: 'Tallóz …',
|
||||||
|
removeLabel: 'Eltávolít',
|
||||||
|
removeTitle: 'Kijelölt fájlok törlése',
|
||||||
|
cancelLabel: 'Mégse',
|
||||||
|
cancelTitle: 'Feltöltés megszakítása',
|
||||||
|
uploadLabel: 'Feltöltés',
|
||||||
|
uploadTitle: 'Kijelölt fájlok feltöltése',
|
||||||
|
msgNo: 'Nem',
|
||||||
|
msgNoFilesSelected: 'Nincs fájl kiválasztva',
|
||||||
|
msgCancelled: 'Megszakítva',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Részletes Előnézet',
|
||||||
|
msgFileRequired: 'Kötelező fájlt kiválasztani a feltöltéshez.',
|
||||||
|
msgSizeTooSmall: 'A fájl: "{name}" (<b>{size} KB</b>) mérete túl kicsi, nagyobbnak kell lennie, mint <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: '"{name}" fájl (<b>{size} KB</b>) mérete nagyobb a megengedettnél <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Legalább <b>{n}</b> {files} ki kell választania a feltöltéshez.',
|
||||||
|
msgFilesTooMany: 'A feltölteni kívánt fájlok száma <b>({n})</b> elérte a megengedett maximumot <b>{m}</b>.',
|
||||||
|
msgFileNotFound: '"{name}" fájl nem található!',
|
||||||
|
msgFileSecured: 'Biztonsági beállítások nem engedik olvasni a fájlt "{name}".',
|
||||||
|
msgFileNotReadable: '"{name}" fájl nem olvasható.',
|
||||||
|
msgFilePreviewAborted: '"{name}" fájl feltöltése megszakítva.',
|
||||||
|
msgFilePreviewError: 'Hiba lépett fel a "{name}" fájl olvasása közben.',
|
||||||
|
msgInvalidFileName: 'Hibás vagy nem támogatott karakterek a fájl nevében "{name}".',
|
||||||
|
msgInvalidFileType: 'Nem megengedett fájl "{name}". Csak a "{types}" fájl típusok támogatottak.',
|
||||||
|
msgInvalidFileExtension: 'Nem megengedett kiterjesztés / fájltípus "{name}". Csak a "{extensions}" kiterjesztés(ek) / fájltípus(ok) támogatottak.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'A fájl feltöltés megszakítva',
|
||||||
|
msgUploadThreshold: 'Folyamatban...',
|
||||||
|
msgUploadBegin: 'Inicializálás...',
|
||||||
|
msgUploadEnd: 'Kész',
|
||||||
|
msgUploadEmpty: 'Nincs érvényes adat a feltöltéshez.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Érvényesítés hiba',
|
||||||
|
msgLoading: '{index} / {files} töltése …',
|
||||||
|
msgProgress: 'Feltöltés: {index} / {files} - {name} - {percent}% kész.',
|
||||||
|
msgSelected: '{n} {files} kiválasztva.',
|
||||||
|
msgFoldersNotAllowed: 'Csak fájlokat húzzon ide! Kihagyva {n} könyvtár.',
|
||||||
|
msgImageWidthSmall: 'A kép szélességének "{name}" legalább {size} pixelnek kell lennie.',
|
||||||
|
msgImageHeightSmall: 'A kép magasságának "{name}" legalább {size} pixelnek kell lennie.',
|
||||||
|
msgImageWidthLarge: 'A kép szélessége "{name}" nem haladhatja meg a {size} pixelt.',
|
||||||
|
msgImageHeightLarge: 'A kép magassága "{name}" nem haladhatja meg a {size} pixelt.',
|
||||||
|
msgImageResizeError: 'Nem lehet megállapítani a kép méreteit az átméretezéshez.',
|
||||||
|
msgImageResizeException: 'Hiba történt a méretezés közben.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Hiba történt a művelet közben ({operation}). Kérjük, próbálja később!',
|
||||||
|
msgAjaxProgressError: 'Hiba! ({operation})',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'fájl törlés',
|
||||||
|
uploadThumb: 'fájl feltöltés',
|
||||||
|
uploadBatch: 'csoportos fájl feltöltés',
|
||||||
|
uploadExtra: 'űrlap adat feltöltés'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Húzzon ide fájlokat …',
|
||||||
|
dropZoneClickTitle: '<br>(vagy kattintson ide a {files} tallózásához...)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'A fájl eltávolítása',
|
||||||
|
uploadTitle: 'fájl feltöltése',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Részletek megtekintése',
|
||||||
|
dragTitle: 'Mozgatás / Átrendezés',
|
||||||
|
indicatorNewTitle: 'Nem feltöltött',
|
||||||
|
indicatorSuccessTitle: 'Feltöltött',
|
||||||
|
indicatorErrorTitle: 'Feltöltés hiba',
|
||||||
|
indicatorLoadingTitle: 'Feltöltés ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Elöző fájl megnézése',
|
||||||
|
next: 'Következő fájl megnézése',
|
||||||
|
toggleheader: 'Fejléc mutatása',
|
||||||
|
fullscreen: 'Teljes képernyős mód bekapcsolása',
|
||||||
|
borderless: 'Keret nélküli ablak mód bekapcsolása',
|
||||||
|
close: 'Részletes előnézet bezárása'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Indonesian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Bambang Riswanto <bamz3r@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['id'] = {
|
||||||
|
fileSingle: 'berkas',
|
||||||
|
filePlural: 'berkas',
|
||||||
|
browseLabel: 'Pilih File …',
|
||||||
|
removeLabel: 'Hapus',
|
||||||
|
removeTitle: 'Hapus berkas terpilih',
|
||||||
|
cancelLabel: 'Batal',
|
||||||
|
cancelTitle: 'Batalkan proses pengunggahan',
|
||||||
|
uploadLabel: 'Unggah',
|
||||||
|
uploadTitle: 'Unggah berkas terpilih',
|
||||||
|
msgNo: 'Tidak',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Dibatalkan',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Pratinjau terperinci',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Berkas "{name}" (<b>{size} KB</b>) melebihi ukuran upload maksimal yaitu <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Anda harus memilih setidaknya <b>{n}</b> {files} untuk diunggah.',
|
||||||
|
msgFilesTooMany: '<b>({n})</b> berkas yang dipilih untuk diunggah melebihi ukuran upload maksimal yaitu <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Berkas "{name}" tak ditemukan!',
|
||||||
|
msgFileSecured: 'Sistem keamanan mencegah untuk membaca berkas "{name}".',
|
||||||
|
msgFileNotReadable: 'Berkas "{name}" tak dapat dibaca.',
|
||||||
|
msgFilePreviewAborted: 'Pratinjau untuk berkas "{name}" dibatalkan.',
|
||||||
|
msgFilePreviewError: 'Kesalahan saat membaca berkas "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Jenis berkas "{name}" tidak sah. Hanya berkas "{types}" yang didukung.',
|
||||||
|
msgInvalidFileExtension: 'Ekstensi berkas "{name}" tidak sah. Hanya ekstensi "{extensions}" yang didukung.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Pengunggahan berkas dibatalkan',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Kesalahan validasi',
|
||||||
|
msgLoading: 'Memuat {index} dari {files} berkas …',
|
||||||
|
msgProgress: 'Memuat {index} dari {files} berkas - {name} - {percent}% selesai.',
|
||||||
|
msgSelected: '{n} {files} dipilih',
|
||||||
|
msgFoldersNotAllowed: 'Hanya tahan dan lepas file saja! {n} folder diabaikan.',
|
||||||
|
msgImageWidthSmall: 'Lebar dari gambar "{name}" harus sekurangnya {size} px.',
|
||||||
|
msgImageHeightSmall: 'Tinggi dari gambar "{name}" harus sekurangnya {size} px.',
|
||||||
|
msgImageWidthLarge: 'Lebar dari gambar "{name}" tak boleh melebihi {size} px.',
|
||||||
|
msgImageHeightLarge: 'Tinggi dari gambar "{name}" tak boleh melebihi {size} px.',
|
||||||
|
msgImageResizeError: 'Tak dapat menentukan dimensi gambar untuk mengubah ukuran.',
|
||||||
|
msgImageResizeException: 'Kesalahan saat mengubah ukuran gambar.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Tarik dan lepaskan berkas disini …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Hapus berkas',
|
||||||
|
uploadTitle: 'Unggah berkas',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Tampilkan Rincian',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Belum diunggah',
|
||||||
|
indicatorSuccessTitle: 'Sudah diunggah',
|
||||||
|
indicatorErrorTitle: 'Kesalahan pengunggahan',
|
||||||
|
indicatorLoadingTitle: 'Mengunggah ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Italian Translation
|
||||||
|
*
|
||||||
|
* Author: Lorenzo Milesi <maxxer@yetopen.it>
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['it'] = {
|
||||||
|
fileSingle: 'file',
|
||||||
|
filePlural: 'file',
|
||||||
|
browseLabel: 'Sfoglia…',
|
||||||
|
removeLabel: 'Rimuovi',
|
||||||
|
removeTitle: 'Rimuovi i file selezionati',
|
||||||
|
cancelLabel: 'Annulla',
|
||||||
|
cancelTitle: 'Annulla i caricamenti in corso',
|
||||||
|
uploadLabel: 'Carica',
|
||||||
|
uploadTitle: 'Carica i file selezionati',
|
||||||
|
msgNo: 'No',
|
||||||
|
msgNoFilesSelected: 'Nessun file selezionato',
|
||||||
|
msgCancelled: 'Annullato',
|
||||||
|
msgPlaceholder: 'Seleziona {files}...',
|
||||||
|
msgZoomModalHeading: 'Anteprima dettagliata',
|
||||||
|
msgFileRequired: 'Devi selezionare un file da caricare.',
|
||||||
|
msgSizeTooSmall: 'Il file "{name}" (<b>{size} KB</b>) è troppo piccolo, deve essere almeno di <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Il file "{name}" (<b>{size} KB</b>) eccede la dimensione massima di caricamento di <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Devi selezionare almeno <b>{n}</b> {files} da caricare.',
|
||||||
|
msgFilesTooMany: 'Il numero di file selezionati per il caricamento <b>({n})</b> eccede il numero massimo di file accettati <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'File "{name}" non trovato!',
|
||||||
|
msgFileSecured: 'Restrizioni di sicurezza impediscono la lettura del file "{name}".',
|
||||||
|
msgFileNotReadable: 'Il file "{name}" non è leggibile.',
|
||||||
|
msgFilePreviewAborted: 'Generazione anteprima per "{name}" annullata.',
|
||||||
|
msgFilePreviewError: 'Errore durante la lettura del file "{name}".',
|
||||||
|
msgInvalidFileName: 'Carattere non valido o non supportato nel file "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipo non valido per il file "{name}". Sono ammessi solo file di tipo "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Estensione non valida per il file "{name}". Sono ammessi solo file con estensione "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Il caricamento del file è stato interrotto',
|
||||||
|
msgUploadThreshold: 'In lavorazione...',
|
||||||
|
msgUploadBegin: 'Inizializzazione...',
|
||||||
|
msgUploadEnd: 'Fatto',
|
||||||
|
msgUploadEmpty: 'Dati non disponibili',
|
||||||
|
msgUploadError: 'Errore',
|
||||||
|
msgValidationError: 'Errore di convalida',
|
||||||
|
msgLoading: 'Caricamento file {index} di {files}…',
|
||||||
|
msgProgress: 'Caricamento file {index} di {files} - {name} - {percent}% completato.',
|
||||||
|
msgSelected: '{n} {files} selezionati',
|
||||||
|
msgFoldersNotAllowed: 'Trascina solo file! Ignorata/e {n} cartella/e.',
|
||||||
|
msgImageWidthSmall: 'La larghezza dell\'immagine "{name}" deve essere di almeno {size} px.',
|
||||||
|
msgImageHeightSmall: 'L\'altezza dell\'immagine "{name}" deve essere di almeno {size} px.',
|
||||||
|
msgImageWidthLarge: 'La larghezza dell\'immagine "{name}" non può superare {size} px.',
|
||||||
|
msgImageHeightLarge: 'L\'altezza dell\'immagine "{name}" non può superare {size} px.',
|
||||||
|
msgImageResizeError: 'Impossibile ottenere le dimensioni dell\'immagine per ridimensionare.',
|
||||||
|
msgImageResizeException: 'Errore durante il ridimensionamento dell\'immagine.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Qualcosa non ha funzionato con l\'operazione {operation}. Per favore riprova più tardi!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'eliminazione file',
|
||||||
|
uploadThumb: 'caricamento file',
|
||||||
|
uploadBatch: 'caricamento file in batch',
|
||||||
|
uploadExtra: 'upload dati del form'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Trascina i file qui…',
|
||||||
|
dropZoneClickTitle: '<br>(o clicca per selezionare {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Rimuovere il file',
|
||||||
|
uploadTitle: 'Caricare un file',
|
||||||
|
uploadRetryTitle: 'Riprova il caricamento',
|
||||||
|
downloadTitle: 'Scarica file',
|
||||||
|
zoomTitle: 'Guarda i dettagli',
|
||||||
|
dragTitle: 'Muovi / Riordina',
|
||||||
|
indicatorNewTitle: 'Non ancora caricato',
|
||||||
|
indicatorSuccessTitle: 'Caricati',
|
||||||
|
indicatorErrorTitle: 'Carica Errore',
|
||||||
|
indicatorLoadingTitle: 'Caricamento ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Vedi il file precedente',
|
||||||
|
next: 'Vedi il file seguente',
|
||||||
|
toggleheader: 'Attiva header',
|
||||||
|
fullscreen: 'Attiva full screen',
|
||||||
|
borderless: 'Abilita modalità senza bordi',
|
||||||
|
close: 'Chiudi'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,109 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Japanese Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Yuta Hoshina <hoshina@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
* slugCallback
|
||||||
|
* \u4e00-\u9fa5 : Kanji (Chinese characters)
|
||||||
|
* \u3040-\u309f : Hiragana (Japanese syllabary)
|
||||||
|
* \u30a0-\u30ff\u31f0-\u31ff : Katakana (including phonetic extension)
|
||||||
|
* \u3200-\u32ff : Enclosed CJK Letters and Months
|
||||||
|
* \uff00-\uffef : Halfwidth and Fullwidth Forms
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ja'] = {
|
||||||
|
fileSingle: 'ファイル',
|
||||||
|
filePlural: 'ファイル',
|
||||||
|
browseLabel: 'ファイルを選択…',
|
||||||
|
removeLabel: '削除',
|
||||||
|
removeTitle: '選択したファイルを削除',
|
||||||
|
cancelLabel: 'キャンセル',
|
||||||
|
cancelTitle: 'アップロードをキャンセル',
|
||||||
|
uploadLabel: 'アップロード',
|
||||||
|
uploadTitle: '選択したファイルをアップロード',
|
||||||
|
msgNo: 'いいえ',
|
||||||
|
msgNoFilesSelected: 'ファイルが選択されていません',
|
||||||
|
msgCancelled: 'キャンセル',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'プレビュー',
|
||||||
|
msgFileRequired: 'ファイルを選択してください',
|
||||||
|
msgSizeTooSmall: 'ファイル"{name}" (<b>{size} KB</b>)はアップロード可能な下限容量<b>{minSize} KB</b>より小さいです',
|
||||||
|
msgSizeTooLarge: 'ファイル"{name}" (<b>{size} KB</b>)はアップロード可能な上限容量<b>{maxSize} KB</b>を超えています',
|
||||||
|
msgFilesTooLess: '最低<b>{n}</b>個の{files}を選択してください',
|
||||||
|
msgFilesTooMany: '選択したファイルの数<b>({n}個)</b>はアップロード可能な上限数<b>({m}個)</b>を超えています',
|
||||||
|
msgFileNotFound: 'ファイル"{name}"はありませんでした',
|
||||||
|
msgFileSecured: 'ファイル"{name}"は読み取り権限がないため取得できません',
|
||||||
|
msgFileNotReadable: 'ファイル"{name}"は読み込めません',
|
||||||
|
msgFilePreviewAborted: 'ファイル"{name}"のプレビューを中止しました',
|
||||||
|
msgFilePreviewError: 'ファイル"{name}"の読み込み中にエラーが発生しました',
|
||||||
|
msgInvalidFileName: 'ファイル名に無効な文字が含まれています "{name}".',
|
||||||
|
msgInvalidFileType: '"{name}"は無効なファイル形式です。"{types}"形式のファイルのみサポートしています',
|
||||||
|
msgInvalidFileExtension: '"{name}"は無効な拡張子です。拡張子が"{extensions}"のファイルのみサポートしています',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'ファイルのアップロードが中止されました',
|
||||||
|
msgUploadThreshold: '処理中...',
|
||||||
|
msgUploadBegin: '初期化中...',
|
||||||
|
msgUploadEnd: '完了',
|
||||||
|
msgUploadEmpty: 'アップロードに有効なデータがありません',
|
||||||
|
msgUploadError: 'エラー',
|
||||||
|
msgValidationError: '検証エラー',
|
||||||
|
msgLoading: '{files}個中{index}個目のファイルを読み込み中…',
|
||||||
|
msgProgress: '{files}個中{index}個のファイルを読み込み中 - {name} - {percent}% 完了',
|
||||||
|
msgSelected: '{n}個の{files}を選択',
|
||||||
|
msgFoldersNotAllowed: 'ドラッグ&ドロップが可能なのはファイルのみです。{n}個のフォルダ-は無視されました',
|
||||||
|
msgImageWidthSmall: '画像ファイル"{name}"の幅が小さすぎます。画像サイズの幅は少なくとも{size}px必要です',
|
||||||
|
msgImageHeightSmall: '画像ファイル"{name}"の高さが小さすぎます。画像サイズの高さは少なくとも{size}px必要です',
|
||||||
|
msgImageWidthLarge: '画像ファイル"{name}"の幅がアップロード可能な画像サイズ({size}px)を超えています',
|
||||||
|
msgImageHeightLarge: '画像ファイル"{name}"の高さがアップロード可能な画像サイズ({size}px)を超えています',
|
||||||
|
msgImageResizeError: 'リサイズ時に画像サイズが取得できませんでした',
|
||||||
|
msgImageResizeException: '画像のリサイズ時にエラーが発生しました。<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: '{operation}実行中にエラーが発生しました。時間をおいてもう一度お試しください。',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'ファイル削除',
|
||||||
|
uploadThumb: 'ファイルアップロード',
|
||||||
|
uploadBatch: '一括ファイルアップロード',
|
||||||
|
uploadExtra: 'フォームデータアップロード'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'ファイルをドラッグ&ドロップ…',
|
||||||
|
dropZoneClickTitle: '<br>(または クリックして{files}を選択 )',
|
||||||
|
slugCallback: function(text) {
|
||||||
|
return text ? text.split(/(\\|\/)/g).pop().replace(/[^\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\u31f0-\u31ff\u3200-\u32ff\uff00-\uffef\-.\\\/ ]+/g, '') : '';
|
||||||
|
},
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'ファイルを削除',
|
||||||
|
uploadTitle: 'ファイルをアップロード',
|
||||||
|
uploadRetryTitle: '再アップロード',
|
||||||
|
zoomTitle: 'プレビュー',
|
||||||
|
dragTitle: '移動 / 再配置',
|
||||||
|
indicatorNewTitle: 'まだアップロードされていません',
|
||||||
|
indicatorSuccessTitle: 'アップロード済み',
|
||||||
|
indicatorErrorTitle: 'アップロード失敗',
|
||||||
|
indicatorLoadingTitle: 'アップロード中...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: '前のファイルを表示',
|
||||||
|
next: '次のファイルを表示',
|
||||||
|
toggleheader: 'ファイル情報の表示/非表示',
|
||||||
|
fullscreen: 'フルスクリーン表示の開始/終了',
|
||||||
|
borderless: 'フルウィンドウ表示の開始/終了',
|
||||||
|
close: 'プレビューを閉じる'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Georgian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ka'] = {
|
||||||
|
fileSingle: 'ფაილი',
|
||||||
|
filePlural: 'ფაილები',
|
||||||
|
browseLabel: 'არჩევა …',
|
||||||
|
removeLabel: 'წაშლა',
|
||||||
|
removeTitle: 'არჩეული ფაილების წაშლა',
|
||||||
|
cancelLabel: 'გაუქმება',
|
||||||
|
cancelTitle: 'მიმდინარე ატვირთვის გაუქმება',
|
||||||
|
uploadLabel: 'ატვირთვა',
|
||||||
|
uploadTitle: 'არჩეული ფაილების ატვირთვა',
|
||||||
|
msgNo: 'არა',
|
||||||
|
msgNoFilesSelected: 'ფაილები არ არის არჩეული',
|
||||||
|
msgCancelled: 'გაუქმებულია',
|
||||||
|
msgPlaceholder: 'აირჩიეთ {files}...',
|
||||||
|
msgZoomModalHeading: 'დეტალურად ნახვა',
|
||||||
|
msgFileRequired: 'ატვირთვისთვის აუცილებელია ფაილის არჩევა.',
|
||||||
|
msgSizeTooSmall: 'ფაილი "{name}" (<b>{size} KB</b>) არის ძალიან პატარა. მისი ზომა უნდა იყოს არანაკლებ <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'ფაილი "{name}" (<b>{size} KB</b>) აჭარბებს მაქსიმალურ დასაშვებ ზომას <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'უნდა აირჩიოთ მინიმუმ <b>{n}</b> {file} ატვირთვისთვის.',
|
||||||
|
msgFilesTooMany: 'არჩეული ფაილების რაოდენობა <b>({n})</b> აჭარბებს დასაშვებ ლიმიტს <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'ფაილი "{name}" არ მოიძებნა!',
|
||||||
|
msgFileSecured: 'უსაფრთხოებით გამოწვეული შეზღუდვები კრძალავს ფაილის "{name}" წაკითხვას.',
|
||||||
|
msgFileNotReadable: 'ფაილის "{name}" წაკითხვა შეუძლებელია.',
|
||||||
|
msgFilePreviewAborted: 'პრევიუ გაუქმებულია ფაილისათვის "{name}".',
|
||||||
|
msgFilePreviewError: 'დაფიქსირდა შეცდომა ფაილის "{name}" კითხვისას.',
|
||||||
|
msgInvalidFileName: 'ნაპოვნია დაუშვებელი სიმბოლოები ფაილის "{name}" სახელში.',
|
||||||
|
msgInvalidFileType: 'ფაილს "{name}" გააჩნია დაუშვებელი ტიპი. მხოლოდ "{types}" ტიპის ფაილები არის დაშვებული.',
|
||||||
|
msgInvalidFileExtension: 'ფაილს "{name}" გააჩნია დაუშვებელი გაფართოება. მხოლოდ "{extensions}" გაფართოების ფაილები არის დაშვებული.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'ფაილის ატვირთვა შეწყდა',
|
||||||
|
msgUploadThreshold: 'მუშავდება...',
|
||||||
|
msgUploadBegin: 'ინიციალიზაცია...',
|
||||||
|
msgUploadEnd: 'დასრულებულია',
|
||||||
|
msgUploadEmpty: 'ატვირთვისთვის დაუშვებელი მონაცემები.',
|
||||||
|
msgUploadError: 'ატვირთვის შეცდომა',
|
||||||
|
msgValidationError: 'ვალიდაციის შეცდომა',
|
||||||
|
msgLoading: 'ატვირთვა {index} / {files} …',
|
||||||
|
msgProgress: 'ფაილის ატვირთვა დასრულებულია {index} / {files} - {name} - {percent}%.',
|
||||||
|
msgSelected: 'არჩეულია {n} {file}',
|
||||||
|
msgFoldersNotAllowed: 'დაშვებულია მხოლოდ ფაილების გადმოთრევა! გამოტოვებულია {n} გადმოთრეული ფოლდერი.',
|
||||||
|
msgImageWidthSmall: 'სურათის "{name}" სიგანე უნდა იყოს არანაკლებ {size} px.',
|
||||||
|
msgImageHeightSmall: 'სურათის "{name}" სიმაღლე უნდა იყოს არანაკლებ {size} px.',
|
||||||
|
msgImageWidthLarge: 'სურათის "{name}" სიგანე არ უნდა აღემატებოდეს {size} px-ს.',
|
||||||
|
msgImageHeightLarge: 'სურათის "{name}" სიმაღლე არ უნდა აღემატებოდეს {size} px-ს.',
|
||||||
|
msgImageResizeError: 'ვერ მოხერხდა სურათის ზომის შეცვლისთვის საჭირო მონაცემების გარკვევა.',
|
||||||
|
msgImageResizeException: 'შეცდომა სურათის ზომის შეცვლისას.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'დაფიქსირდა შეცდომა ოპერაციის {operation} შესრულებისას. ცადეთ მოგვიანებით!',
|
||||||
|
msgAjaxProgressError: 'ვერ მოხერხდა ოპერაციის {operation} შესრულება',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'ფაილის წაშლა',
|
||||||
|
uploadThumb: 'ფაილის ატვირთვა',
|
||||||
|
uploadBatch: 'ფაილების ატვირთვა',
|
||||||
|
uploadExtra: 'მონაცემების გაგზავნა ფორმიდან'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'გადმოათრიეთ ფაილები აქ …',
|
||||||
|
dropZoneClickTitle: '<br>(ან დააჭირეთ რათა აირჩიოთ {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'ფაილის წაშლა',
|
||||||
|
uploadTitle: 'ფაილის ატვირთვა',
|
||||||
|
uploadRetryTitle: 'ატვირთვის გამეორება',
|
||||||
|
downloadTitle: 'ფაილის ჩამოტვირთვა',
|
||||||
|
zoomTitle: 'დეტალურად ნახვა',
|
||||||
|
dragTitle: 'გადაადგილება / მიმდევრობის შეცვლა',
|
||||||
|
indicatorNewTitle: 'ჯერ არ ატვირთულა',
|
||||||
|
indicatorSuccessTitle: 'ატვირთულია',
|
||||||
|
indicatorErrorTitle: 'ატვირთვის შეცდომა',
|
||||||
|
indicatorLoadingTitle: 'ატვირთვა ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'წინა ფაილის ნახვა',
|
||||||
|
next: 'შემდეგი ფაილის ნახვა',
|
||||||
|
toggleheader: 'სათაურის დამალვა',
|
||||||
|
fullscreen: 'მთელ ეკრანზე გაშლა',
|
||||||
|
borderless: 'მთელ გვერდზე გაშლა',
|
||||||
|
close: 'დახურვა'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Korean Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['kr'] = {
|
||||||
|
fileSingle: '파일',
|
||||||
|
filePlural: '파일들',
|
||||||
|
browseLabel: '찾기 …',
|
||||||
|
removeLabel: '지우기',
|
||||||
|
removeTitle: '선택한 파일들 지우기',
|
||||||
|
cancelLabel: '취소',
|
||||||
|
cancelTitle: '업로드 중단하기',
|
||||||
|
uploadLabel: '업로드',
|
||||||
|
uploadTitle: '선택한 파일 업로드하기',
|
||||||
|
msgNo: '아니요',
|
||||||
|
msgNoFilesSelected: '선택한 파일이 없습니다.',
|
||||||
|
msgCancelled: '취소되었습니다.',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: '자세한 미리보기',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: '파일 "{name}" (<b>{size} KB</b>)이 너무 작습니다. <b>{minSize} KB</b>보다 용량이 커야 합니다..',
|
||||||
|
msgSizeTooLarge: '파일 "{name}" (<b>{size} KB</b>)이 너무 큽니다. 허용 파일 사이즈는 <b>{maxSize} KB</b>.입니다.',
|
||||||
|
msgFilesTooLess: '업로드하기 위해 최소 <b>{n}</b> {files}개의 파일을 선택해야 합니다.',
|
||||||
|
msgFilesTooMany: '선택한 파일의 수 <b>({n})</b>가 업로드 허용 최고치인 <b>{m}</b>를 넘었습니다..',
|
||||||
|
msgFileNotFound: '파일 "{name}"을 찾을 수 없습니다.!',
|
||||||
|
msgFileSecured: '보안상의 이유로 파일 "{name}"을/를 읽을 수 없습니다..',
|
||||||
|
msgFileNotReadable: '파일 "{name}"은/는 읽을 수 없습니다.',
|
||||||
|
msgFilePreviewAborted: '파일 "{name}"의 미리보기가 중단되었습니다.',
|
||||||
|
msgFilePreviewError: '파일 "{name}"을/를 읽다가 에러가 발생했습니다.',
|
||||||
|
msgInvalidFileName: '파일 "{name}" 중 지원 불가능한 문자가 포함되어 있습니다.',
|
||||||
|
msgInvalidFileType: '파일 "{name}"의 타입은 지원하지 않습니다. "{types}" 타입의 파일을 선택해 주십시요.',
|
||||||
|
msgInvalidFileExtension: '파일 "{name}"의 익스텐션은 지원하지 않습니다. "{extensions}" 타입의 익스텐션을 선택해 주십시요.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: '파일 업로드가 중단되었습니다.',
|
||||||
|
msgUploadThreshold: '업로드 중...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: '업로드 가능 데이터가 존재하지 않습니다.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: '유효성 오류',
|
||||||
|
msgLoading: '파일 {files} 중 {index}번째를 로딩하고 있습니다. …',
|
||||||
|
msgProgress: '파일 {files}의 {name}이 {percent}% 로딩되었습니다. ',
|
||||||
|
msgSelected: '{n} {files}이 선택 되었습니다.',
|
||||||
|
msgFoldersNotAllowed: '드래그 앤 드랍 파일만 가능합니다! 드랍한 {n}번째 폴더를 건너 뛰었습니다.',
|
||||||
|
msgImageWidthSmall: '이미지 파일 "{name}"의 가로는 최소 {size} px가 되어야 합니다.',
|
||||||
|
msgImageHeightSmall: '이미지 파일 "{name}"의 세로는 최소 {size} px가 되어야 합니다.',
|
||||||
|
msgImageWidthLarge: '이미지 파일 "{name}"의 가로는 최대 {size} px를 넘을수 없습니다.',
|
||||||
|
msgImageHeightLarge: '이미지 파일 "{name}"의 세로는 최대 {size} px를 넘을수 없습니다.',
|
||||||
|
msgImageResizeError: '이미지의 사이즈를 재조정을 위한 이미지 사이즈를 가져올 수 없습니다.',
|
||||||
|
msgImageResizeException: '이미지 사이즈 재조정이 다음 이유로 실패했습니다.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: '파일을 여기에 드래그인 드랍을 하십시요 …',
|
||||||
|
dropZoneClickTitle: '<br>(또는 {files} 선택을 위해 클릭하십시요)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: '파일 지우기',
|
||||||
|
uploadTitle: '파일 업로드 하기',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: '세부 정보 보기',
|
||||||
|
dragTitle: '옭기기 / 재배열하기',
|
||||||
|
indicatorNewTitle: '아직 업로드가 안되었습니다.',
|
||||||
|
indicatorSuccessTitle: '업로드가 성공하였습니다.',
|
||||||
|
indicatorErrorTitle: '업로드 중 에러가 발행했습니다.',
|
||||||
|
indicatorLoadingTitle: '업로드 중 ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: '전 파일 보기',
|
||||||
|
next: '다음 파일 보기',
|
||||||
|
toggleheader: '머릿글 토글하기',
|
||||||
|
fullscreen: '전채화면 토글하기',
|
||||||
|
borderless: '무 테두리 토글하기',
|
||||||
|
close: '세부 정보 미리보기 토글하기'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Kazakh Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Kali Toleugazy <almatytol@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['kz'] = {
|
||||||
|
fileSingle: 'файл',
|
||||||
|
filePlural: 'файлдар',
|
||||||
|
browseLabel: 'Таңдау …',
|
||||||
|
removeLabel: 'Жою',
|
||||||
|
removeTitle: 'Таңдалған файлдарды жою',
|
||||||
|
cancelLabel: 'Күшін жою',
|
||||||
|
cancelTitle: 'Ағымдағы жүктеуді болдырмау',
|
||||||
|
uploadLabel: 'Жүктеу',
|
||||||
|
uploadTitle: 'Таңдалған файлдарды жүктеу',
|
||||||
|
msgNo: 'жоқ',
|
||||||
|
msgNoFilesSelected: 'Файл таңдалмады',
|
||||||
|
msgCancelled: 'Күші жойылған',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Алдын ала толық көру',
|
||||||
|
msgSizeTooLarge: 'Файл "{name}" (<b>{size} KB</b>) ең үлкен <b>{maxSize} KB</b> өлшемінен асады.',
|
||||||
|
msgFilesTooLess: 'Жүктеу үшіy кемінде <b>{n}</b> {files} таңдау керек.',
|
||||||
|
msgFilesTooMany: 'Таңдалған <b>({n})</b> файлдардың саны берілген <b>{m}</b> саннан асып кетті.',
|
||||||
|
msgFileNotFound: 'Файл "{name}" табылмады!',
|
||||||
|
msgFileSecured: 'Шектеу қауіпсіздігі "{name}" файлын оқуға тыйым салады.',
|
||||||
|
msgFileNotReadable: '"{name}" файлды оқу мүмкін емес.',
|
||||||
|
msgFilePreviewAborted: '"{name}" файл үшін алдын ала қарап көру тыйым салынған.',
|
||||||
|
msgFilePreviewError: '"{name}" файлды оқығанда қате пайда болды.',
|
||||||
|
msgInvalidFileType: '"{name}" тыйым салынған файл түрі. Тек мынаналарға рұқсат етілген: "{types}"',
|
||||||
|
msgInvalidFileExtension: '"{name}" тыйым салынған файл кеңейтімі. Тек "{extensions}" рұқсат.',
|
||||||
|
msgUploadAborted: 'Файлды жүктеу доғарылды',
|
||||||
|
msgUploadThreshold: 'Өңдеу...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Тексеру қатесі',
|
||||||
|
msgLoading: '{index} файлды {files} … жүктеу',
|
||||||
|
msgProgress: '{index} файлды {files} - {name} - {percent}% жүктеу аяқталды.',
|
||||||
|
msgSelected: 'Таңдалған файлдар саны: {n}',
|
||||||
|
msgFoldersNotAllowed: 'Тек файлдарды сүйреу рұқсат! {n} папка өткізілген.',
|
||||||
|
msgImageWidthSmall: '{name} суреттің ені {size} px. аз болмау керек',
|
||||||
|
msgImageHeightSmall: '{name} суреттің биіктігі {size} px. аз болмау керек',
|
||||||
|
msgImageWidthLarge: '"{name}" суреттің ені {size} px. аспау керек',
|
||||||
|
msgImageHeightLarge: '"{name}" суреттің биіктігі {size} px. аспау керек',
|
||||||
|
msgImageResizeError: 'Суреттің өлшемін өзгерту үшін, мөлшері алынбады',
|
||||||
|
msgImageResizeException: 'Суреттің мөлшерлерін өзгерткен кезде қателік пайда болды.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Файлдарды осында сүйреу …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Файлды өшіру',
|
||||||
|
uploadTitle: 'Файлды жүктеу',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'мәліметтерді көру',
|
||||||
|
dragTitle: 'Орнын ауыстыру',
|
||||||
|
indicatorNewTitle: 'Жүктелген жоқ',
|
||||||
|
indicatorSuccessTitle: 'Жүктелген',
|
||||||
|
indicatorErrorTitle: 'Жүктелу қатесі ',
|
||||||
|
indicatorLoadingTitle: 'Жүктелу ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Алдыңғы файлды қарау',
|
||||||
|
next: 'Келесі файлды қарау',
|
||||||
|
toggleheader: 'Тақырыпты ауыстыру',
|
||||||
|
fullscreen: 'Толық экран режимін қосу',
|
||||||
|
borderless: 'Жиексіз режиміне ауысу',
|
||||||
|
close: 'Толық көрінісін жабу'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput <_LANG_> Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Mindaugas Varkalys <varkalys.mindaugas@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['lt'] = {
|
||||||
|
fileSingle: 'failas',
|
||||||
|
filePlural: 'failai',
|
||||||
|
browseLabel: 'Naršyti …',
|
||||||
|
removeLabel: 'Šalinti',
|
||||||
|
removeTitle: 'Pašalinti pasirinktus failus',
|
||||||
|
cancelLabel: 'Atšaukti',
|
||||||
|
cancelTitle: 'Atšaukti vykstantį įkėlimą',
|
||||||
|
uploadLabel: 'Įkelti',
|
||||||
|
uploadTitle: 'Įkelti pasirinktus failus',
|
||||||
|
msgNo: 'Ne',
|
||||||
|
msgNoFilesSelected: 'Nepasirinkta jokių failų',
|
||||||
|
msgCancelled: 'Atšaukta',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detali Peržiūra',
|
||||||
|
msgFileRequired: 'Pasirinkite failą įkėlimui.',
|
||||||
|
msgSizeTooSmall: 'Failas "{name}" (<b>{size} KB</b>) yra per mažas ir turi būti didesnis nei <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Failas "{name}" (<b>{size} KB</b>) viršija maksimalų leidžiamą įkeliamo failo dydį <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Turite pasirinkti bent <b>{n}</b> failus įkėlimui.',
|
||||||
|
msgFilesTooMany: 'Įkėlimui pasirinktų failų skaičius <b>({n})</b> viršija maksimalų leidžiamą limitą <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Failas "{name}" nerastas!',
|
||||||
|
msgFileSecured: 'Saugumo apribojimai neleidžia perskaityti failo "{name}".',
|
||||||
|
msgFileNotReadable: 'Failas "{name}" neperskaitomas.',
|
||||||
|
msgFilePreviewAborted: 'Failo peržiūra nutraukta "{name}".',
|
||||||
|
msgFilePreviewError: 'Įvyko klaida skaitant failą "{name}".',
|
||||||
|
msgInvalidFileName: 'Klaidingi arba nepalaikomi simboliai failo pavadinime "{name}".',
|
||||||
|
msgInvalidFileType: 'Klaidingas failo "{name}" tipas. Tik "{types}" tipai yra palaikomi.',
|
||||||
|
msgInvalidFileExtension: 'Klaidingas failo "{name}" plėtinys. Tik "{extensions}" plėtiniai yra palaikomi.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'paveikslėlis',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'tekstas',
|
||||||
|
'video': 'vaizdo įrašas',
|
||||||
|
'audio': 'garso įrašas',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'objektas'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Failo įkėlimas buvo nutrauktas',
|
||||||
|
msgUploadThreshold: 'Vykdoma...',
|
||||||
|
msgUploadBegin: 'Inicijuojama...',
|
||||||
|
msgUploadEnd: 'Baigta',
|
||||||
|
msgUploadEmpty: 'Nėra teisingų duomenų įkėlimui.',
|
||||||
|
msgUploadError: 'Klaida',
|
||||||
|
msgValidationError: 'Validacijos Klaida',
|
||||||
|
msgLoading: 'Keliamas failas {index} iš {files} …',
|
||||||
|
msgProgress: 'Keliamas failas {index} iš {files} - {name} - {percent}% baigta.',
|
||||||
|
msgSelected: 'Pasirinkti {n} {files}',
|
||||||
|
msgFoldersNotAllowed: 'Tempkite tik failus! Praleisti {n} nutempti aplankalas(-i).',
|
||||||
|
msgImageWidthSmall: 'Paveikslėlio "{name}" plotis turi būti bent {size} px.',
|
||||||
|
msgImageHeightSmall: 'Paveikslėlio "{name}" aukštis turi būti bent {size} px.',
|
||||||
|
msgImageWidthLarge: 'Paveikslėlio "{name}" plotis negali viršyti {size} px.',
|
||||||
|
msgImageHeightLarge: 'Paveikslėlio "{name}" aukštis negali viršyti {size} px.',
|
||||||
|
msgImageResizeError: 'Nepavyksta gauti paveikslėlio matmetų, kad pakeisti jo matmemis.',
|
||||||
|
msgImageResizeException: 'Klaida keičiant paveikslėlio matmenis.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Kažkas nutiko vykdant {operation} operaciją. Prašome pabandyti vėliau!',
|
||||||
|
msgAjaxProgressError: '{operation} operacija nesėkminga',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'failo trynimo',
|
||||||
|
uploadThumb: 'failo įkėlimo',
|
||||||
|
uploadBatch: 'failų rinkinio įkėlimo',
|
||||||
|
uploadExtra: 'formos duomenų įkėlimo'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Tempkite failus čia …',
|
||||||
|
dropZoneClickTitle: '<br>(arba paspauskite, kad pasirinktumėte failus)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Šalinti failą',
|
||||||
|
uploadTitle: 'Įkelti failą',
|
||||||
|
uploadRetryTitle: 'Bandyti įkelti vėl',
|
||||||
|
zoomTitle: 'Peržiūrėti detales',
|
||||||
|
dragTitle: 'Perstumti',
|
||||||
|
indicatorNewTitle: 'Dar neįkelta',
|
||||||
|
indicatorSuccessTitle: 'Įkelta',
|
||||||
|
indicatorErrorTitle: 'Įkėlimo Klaida',
|
||||||
|
indicatorLoadingTitle: 'Įkeliama ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Peržiūrėti ankstesnį failą',
|
||||||
|
next: 'Peržiūrėti kitą failą',
|
||||||
|
toggleheader: 'Perjungti viršutinę juostą',
|
||||||
|
fullscreen: 'Perjungti pilno ekrano rėžimą',
|
||||||
|
borderless: 'Perjungti berėmį režimą',
|
||||||
|
close: 'Uždaryti detalią peržiūrą'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Dutch Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['nl'] = {
|
||||||
|
fileSingle: 'bestand',
|
||||||
|
filePlural: 'bestanden',
|
||||||
|
browseLabel: 'Zoek …',
|
||||||
|
removeLabel: 'Verwijder',
|
||||||
|
removeTitle: 'Verwijder geselecteerde bestanden',
|
||||||
|
cancelLabel: 'Annuleren',
|
||||||
|
cancelTitle: 'Annuleer upload',
|
||||||
|
uploadLabel: 'Upload',
|
||||||
|
uploadTitle: 'Upload geselecteerde bestanden',
|
||||||
|
msgNo: 'Nee',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Geannuleerd',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Gedetailleerd voorbeeld',
|
||||||
|
msgFileRequired: 'U moet een bestand kiezen om te uploaden.',
|
||||||
|
msgSizeTooSmall: 'Bestand "{name}" (<b>{size} KB</b>) is te klein en moet groter zijn dan <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Bestand "{name}" (<b>{size} KB</b>) is groter dan de toegestane <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'U moet minstens <b>{n}</b> {files} selecteren om te uploaden.',
|
||||||
|
msgFilesTooMany: 'Aantal geselecteerde bestanden <b>({n})</b> is meer dan de toegestane <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Bestand "{name}" niet gevonden!',
|
||||||
|
msgFileSecured: 'Bestand kan niet gelezen worden in verband met beveiligings redenen "{name}".',
|
||||||
|
msgFileNotReadable: 'Bestand "{name}" is niet leesbaar.',
|
||||||
|
msgFilePreviewAborted: 'Bestand weergaven geannuleerd voor "{name}".',
|
||||||
|
msgFilePreviewError: 'Er is een fout opgetreden met het lezen van "{name}".',
|
||||||
|
msgInvalidFileName: 'Ongeldige of niet ondersteunde karakters in bestandsnaam "{name}".',
|
||||||
|
msgInvalidFileType: 'Geen geldig bestand "{name}". Alleen "{types}" zijn toegestaan.',
|
||||||
|
msgInvalidFileExtension: 'Geen geldige extensie "{name}". Alleen "{extensions}" zijn toegestaan.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'afbeelding',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'tekst',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'geluid',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Het uploaden van bestanden is afgebroken',
|
||||||
|
msgUploadThreshold: 'Verwerken...',
|
||||||
|
msgUploadBegin: 'Initialiseren...',
|
||||||
|
msgUploadEnd: 'Gedaan',
|
||||||
|
msgUploadEmpty: 'Geen geldige data beschikbaar voor upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Bevestiging fout',
|
||||||
|
msgLoading: 'Bestanden laden {index} van de {files} …',
|
||||||
|
msgProgress: 'Bestanden laden {index} van de {files} - {name} - {percent}% compleet.',
|
||||||
|
msgSelected: '{n} {files} geselecteerd',
|
||||||
|
msgFoldersNotAllowed: 'Drag & drop alleen bestanden! {n} overgeslagen map(pen).',
|
||||||
|
msgImageWidthSmall: 'Breedte van het foto-bestand "{name}" moet minstens {size} px zijn.',
|
||||||
|
msgImageHeightSmall: 'Hoogte van het foto-bestand "{name}" moet minstens {size} px zijn.',
|
||||||
|
msgImageWidthLarge: 'Breedte van het foto-bestand "{name}" kan niet hoger zijn dan {size} px.',
|
||||||
|
msgImageHeightLarge: 'Hoogte van het foto bestand "{name}" kan niet hoger zijn dan {size} px.',
|
||||||
|
msgImageResizeError: 'Kon de foto afmetingen niet lezen om te verkleinen.',
|
||||||
|
msgImageResizeException: 'Fout bij het verkleinen van de foto.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Er ging iets mis met de {operation} actie. Gelieve later opnieuw te proberen!',
|
||||||
|
msgAjaxProgressError: '{operation} mislukt',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'bestand verwijderen',
|
||||||
|
uploadThumb: 'bestand uploaden',
|
||||||
|
uploadBatch: 'alle bestanden uploaden',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Drag & drop bestanden hier …',
|
||||||
|
dropZoneClickTitle: '<br>(of klik hier om {files} te selecteren)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Verwijder bestand',
|
||||||
|
uploadTitle: 'bestand uploaden',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Bekijk details',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Nog niet geupload',
|
||||||
|
indicatorSuccessTitle: 'geupload',
|
||||||
|
indicatorErrorTitle: 'fout uploaden',
|
||||||
|
indicatorLoadingTitle: 'uploaden ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Toon vorig bestand',
|
||||||
|
next: 'Toon volgend bestand',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Norwegian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['no'] = {
|
||||||
|
fileSingle: 'fil',
|
||||||
|
filePlural: 'filer',
|
||||||
|
browseLabel: 'Bla gjennom …',
|
||||||
|
removeLabel: 'Fjern',
|
||||||
|
removeTitle: 'Fjern valgte filer',
|
||||||
|
cancelLabel: 'Avbryt',
|
||||||
|
cancelTitle: 'Stopp pågående opplastninger',
|
||||||
|
uploadLabel: 'Last opp',
|
||||||
|
uploadTitle: 'Last opp valgte filer',
|
||||||
|
msgNo: 'Nei',
|
||||||
|
msgNoFilesSelected: 'Ingen filer er valgt',
|
||||||
|
msgCancelled: 'Avbrutt',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detaljert visning',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'Filen "{name}" (<b>{size} KB</b>) er for liten og må være større enn <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Filen "{name}" (<b>{size} KB</b>) er for stor, maksimal filstørrelse er <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Du må velge minst <b>{n}</b> {files} for opplastning.',
|
||||||
|
msgFilesTooMany: 'For mange filer til opplastning, <b>({n})</b> overstiger maksantallet som er <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Fant ikke filen "{name}"!',
|
||||||
|
msgFileSecured: 'Sikkerhetsrestriksjoner hindrer lesing av filen "{name}".',
|
||||||
|
msgFileNotReadable: 'Filen "{name}" er ikke lesbar.',
|
||||||
|
msgFilePreviewAborted: 'Filvisning avbrutt for "{name}".',
|
||||||
|
msgFilePreviewError: 'En feil oppstod under lesing av filen "{name}".',
|
||||||
|
msgInvalidFileName: 'Ugyldige tegn i filen "{name}".',
|
||||||
|
msgInvalidFileType: 'Ugyldig type for filen "{name}". Kun "{types}" filer er tillatt.',
|
||||||
|
msgInvalidFileExtension: 'Ugyldig endelse for filen "{name}". Kun "{extensions}" filer støttes.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Filopplastningen ble avbrutt',
|
||||||
|
msgUploadThreshold: 'Prosesserer...',
|
||||||
|
msgUploadBegin: 'Initialiserer...',
|
||||||
|
msgUploadEnd: 'Ferdig',
|
||||||
|
msgUploadEmpty: 'Ingen gyldige data tilgjengelig for opplastning.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Valideringsfeil',
|
||||||
|
msgLoading: 'Laster fil {index} av {files} …',
|
||||||
|
msgProgress: 'Laster fil {index} av {files} - {name} - {percent}% fullført.',
|
||||||
|
msgSelected: '{n} {files} valgt',
|
||||||
|
msgFoldersNotAllowed: 'Kun Dra & slipp filer! Hoppet over {n} mappe(r).',
|
||||||
|
msgImageWidthSmall: 'Bredde på bildefilen "{name}" må være minst {size} px.',
|
||||||
|
msgImageHeightSmall: 'Høyde på bildefilen "{name}" må være minst {size} px.',
|
||||||
|
msgImageWidthLarge: 'Bredde på bildefilen "{name}" kan ikke overstige {size} px.',
|
||||||
|
msgImageHeightLarge: 'Høyde på bildefilen "{name}" kan ikke overstige {size} px.',
|
||||||
|
msgImageResizeError: 'Fant ikke dimensjonene som skulle resizes.',
|
||||||
|
msgImageResizeException: 'En feil oppstod under endring av størrelse .<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Noe gikk galt med {operation} operasjonen. Vennligst prøv igjen senere!',
|
||||||
|
msgAjaxProgressError: '{operation} feilet',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Dra & slipp filer her …',
|
||||||
|
dropZoneClickTitle: '<br>(eller klikk for å velge {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Fjern fil',
|
||||||
|
uploadTitle: 'Last opp fil',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
zoomTitle: 'Vis detaljer',
|
||||||
|
dragTitle: 'Flytt / endre rekkefølge',
|
||||||
|
indicatorNewTitle: 'Opplastning ikke fullført',
|
||||||
|
indicatorSuccessTitle: 'Opplastet',
|
||||||
|
indicatorErrorTitle: 'Opplastningsfeil',
|
||||||
|
indicatorLoadingTitle: 'Laster opp ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Vis forrige fil',
|
||||||
|
next: 'Vis neste fil',
|
||||||
|
toggleheader: 'Vis header',
|
||||||
|
fullscreen: 'Åpne fullskjerm',
|
||||||
|
borderless: 'Åpne uten kanter',
|
||||||
|
close: 'Lukk detaljer'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Polish Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['pl'] = {
|
||||||
|
fileSingle: 'plik',
|
||||||
|
filePlural: 'pliki',
|
||||||
|
browseLabel: 'Przeglądaj …',
|
||||||
|
removeLabel: 'Usuń',
|
||||||
|
removeTitle: 'Usuń zaznaczone pliki',
|
||||||
|
cancelLabel: 'Przerwij',
|
||||||
|
cancelTitle: 'Anuluj wysyłanie',
|
||||||
|
uploadLabel: 'Wgraj',
|
||||||
|
uploadTitle: 'Wgraj zaznaczone pliki',
|
||||||
|
msgNo: 'Nie',
|
||||||
|
msgNoFilesSelected: 'Brak zaznaczonych plików',
|
||||||
|
msgCancelled: 'Odwołany',
|
||||||
|
msgPlaceholder: 'Wybierz {files}...',
|
||||||
|
msgZoomModalHeading: 'Szczegółowy podgląd',
|
||||||
|
msgFileRequired: 'Musisz wybrać plik do wgrania.',
|
||||||
|
msgSizeTooSmall: 'Plik "{name}" (<b>{size} KB</b>) jest zbyt mały i musi być większy niż <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Plik o nazwie "{name}" (<b>{size} KB</b>) przekroczył maksymalną dopuszczalną wielkość pliku wynoszącą <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Minimalna liczba plików do wgrania: <b>{n}</b>.',
|
||||||
|
msgFilesTooMany: 'Liczba plików wybranych do wgrania w liczbie <b>({n})</b>, przekracza maksymalny dozwolony limit wynoszący <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Plik "{name}" nie istnieje!',
|
||||||
|
msgFileSecured: 'Ustawienia zabezpieczeń uniemożliwiają odczyt pliku "{name}".',
|
||||||
|
msgFileNotReadable: 'Plik "{name}" nie jest plikiem do odczytu.',
|
||||||
|
msgFilePreviewAborted: 'Podgląd pliku "{name}" został przerwany.',
|
||||||
|
msgFilePreviewError: 'Wystąpił błąd w czasie odczytu pliku "{name}".',
|
||||||
|
msgInvalidFileName: 'Nieprawidłowe lub nieobsługiwane znaki w nazwie pliku "{name}".',
|
||||||
|
msgInvalidFileType: 'Nieznany typ pliku "{name}". Tylko następujące rodzaje plików są dozwolone: "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Złe rozszerzenie dla pliku "{name}". Tylko następujące rozszerzenia plików są dozwolone: "{extensions}".',
|
||||||
|
msgUploadAborted: 'Przesyłanie pliku zostało przerwane',
|
||||||
|
msgUploadThreshold: 'Przetwarzanie...',
|
||||||
|
msgUploadBegin: 'Rozpoczynanie...',
|
||||||
|
msgUploadEnd: 'Gotowe!',
|
||||||
|
msgUploadEmpty: 'Brak poprawnych danych do przesłania.',
|
||||||
|
msgUploadError: 'Błąd',
|
||||||
|
msgValidationError: 'Błąd walidacji',
|
||||||
|
msgLoading: 'Wczytywanie pliku {index} z {files} …',
|
||||||
|
msgProgress: 'Wczytywanie pliku {index} z {files} - {name} - {percent}% zakończone.',
|
||||||
|
msgSelected: '{n} Plików zaznaczonych',
|
||||||
|
msgFoldersNotAllowed: 'Metodą przeciągnij i upuść, można przenosić tylko pliki. Pominięto {n} katalogów.',
|
||||||
|
msgImageWidthSmall: 'Szerokość pliku obrazu "{name}" musi być co najmniej {size} px.',
|
||||||
|
msgImageHeightSmall: 'Wysokość pliku obrazu "{name}" musi być co najmniej {size} px.',
|
||||||
|
msgImageWidthLarge: 'Szerokość pliku obrazu "{name}" nie może przekraczać {size} px.',
|
||||||
|
msgImageHeightLarge: 'Wysokość pliku obrazu "{name}" nie może przekraczać {size} px.',
|
||||||
|
msgImageResizeError: 'Nie udało się uzyskać wymiaru obrazu, aby zmienić rozmiar.',
|
||||||
|
msgImageResizeException: 'Błąd podczas zmiany rozmiaru obrazu.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Coś poczło nie tak podczas {operation}. Spróbuj ponownie!',
|
||||||
|
msgAjaxProgressError: '{operation} nie powiodło się',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'usuwanie pliku',
|
||||||
|
uploadThumb: 'przesyłanie pliku',
|
||||||
|
uploadBatch: 'masowe przesyłanie plików',
|
||||||
|
uploadExtra: 'przesyłanie danych formularza'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Przeciągnij i upuść pliki tutaj …',
|
||||||
|
dropZoneClickTitle: '<br>(lub kliknij tutaj i wybierz {files} z komputera)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Usuń plik',
|
||||||
|
uploadTitle: 'Przesyłanie pliku',
|
||||||
|
uploadRetryTitle: 'Ponów',
|
||||||
|
downloadTitle: 'Pobierz plik',
|
||||||
|
zoomTitle: 'Pokaż szczegóły',
|
||||||
|
dragTitle: 'Przenies / Ponownie zaaranżuj',
|
||||||
|
indicatorNewTitle: 'Jeszcze nie przesłany',
|
||||||
|
indicatorSuccessTitle: 'Dodane',
|
||||||
|
indicatorErrorTitle: 'Błąd',
|
||||||
|
indicatorLoadingTitle: 'Przesyłanie ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Pokaż poprzedni plik',
|
||||||
|
next: 'Pokaż następny plik',
|
||||||
|
toggleheader: 'Włącz / wyłącz nagłówek',
|
||||||
|
fullscreen: 'Włącz / wyłącz pełny ekran',
|
||||||
|
borderless: 'Włącz / wyłącz tryb bez ramek',
|
||||||
|
close: 'Zamknij szczegółowy widok'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Brazillian Portuguese Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['pt-BR'] = {
|
||||||
|
fileSingle: 'arquivo',
|
||||||
|
filePlural: 'arquivos',
|
||||||
|
browseLabel: 'Procurar…',
|
||||||
|
removeLabel: 'Remover',
|
||||||
|
removeTitle: 'Remover arquivos selecionados',
|
||||||
|
cancelLabel: 'Cancelar',
|
||||||
|
cancelTitle: 'Interromper envio em andamento',
|
||||||
|
uploadLabel: 'Enviar',
|
||||||
|
uploadTitle: 'Enviar arquivos selecionados',
|
||||||
|
msgNo: 'Não',
|
||||||
|
msgNoFilesSelected: 'Nenhum arquivo selecionado',
|
||||||
|
msgCancelled: 'Cancelado',
|
||||||
|
msgPlaceholder: 'Selecionar {files}...',
|
||||||
|
msgZoomModalHeading: 'Pré-visualização detalhada',
|
||||||
|
msgFileRequired: 'Você deve selecionar um arquivo para enviar.',
|
||||||
|
msgSizeTooSmall: 'O arquivo "{name}" (<b>{size} KB</b>) é muito pequeno e deve ser maior que <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'O arquivo "{name}" (<b>{size} KB</b>) excede o tamanho máximo permitido de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Você deve selecionar pelo menos <b>{n}</b> {files} para enviar.',
|
||||||
|
msgFilesTooMany: 'O número de arquivos selecionados para o envio <b>({n})</b> excede o limite máximo permitido de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'O arquivo "{name}" não foi encontrado!',
|
||||||
|
msgFileSecured: 'Restrições de segurança impedem a leitura do arquivo "{name}".',
|
||||||
|
msgFileNotReadable: 'O arquivo "{name}" não pode ser lido.',
|
||||||
|
msgFilePreviewAborted: 'A pré-visualização do arquivo "{name}" foi interrompida.',
|
||||||
|
msgFilePreviewError: 'Ocorreu um erro ao ler o arquivo "{name}".',
|
||||||
|
msgInvalidFileName: 'Caracteres inválidos ou não suportados no arquivo "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipo inválido para o arquivo "{name}". Apenas arquivos "{types}" são permitidos.',
|
||||||
|
msgInvalidFileExtension: 'Extensão inválida para o arquivo "{name}". Apenas arquivos "{extensions}" são permitidos.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'imagem',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'texto',
|
||||||
|
'video': 'vídeo',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'objeto'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'O envio do arquivo foi abortado',
|
||||||
|
msgUploadThreshold: 'Processando...',
|
||||||
|
msgUploadBegin: 'Inicializando...',
|
||||||
|
msgUploadEnd: 'Concluído',
|
||||||
|
msgUploadEmpty: 'Nenhuma informação válida para upload.',
|
||||||
|
msgUploadError: 'Erro de Upload',
|
||||||
|
msgValidationError: 'Erro de validação',
|
||||||
|
msgLoading: 'Enviando arquivo {index} de {files}…',
|
||||||
|
msgProgress: 'Enviando arquivo {index} de {files} - {name} - {percent}% completo.',
|
||||||
|
msgSelected: '{n} {files} selecionado(s)',
|
||||||
|
msgFoldersNotAllowed: 'Arraste e solte apenas arquivos! {n} pasta(s) ignoradas.',
|
||||||
|
msgImageWidthSmall: 'Largura do arquivo de imagem "{name}" deve ser pelo menos {size} px.',
|
||||||
|
msgImageHeightSmall: 'Altura do arquivo de imagem "{name}" deve ser pelo menos {size} px.',
|
||||||
|
msgImageWidthLarge: 'Largura do arquivo de imagem "{name}" não pode exceder {size} px.',
|
||||||
|
msgImageHeightLarge: 'Altura do arquivo de imagem "{name}" não pode exceder {size} px.',
|
||||||
|
msgImageResizeError: 'Não foi possível obter as dimensões da imagem para redimensionar.',
|
||||||
|
msgImageResizeException: 'Erro ao redimensionar a imagem.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Algo deu errado com a operação {operation}. Por favor tente novamente mais tarde!',
|
||||||
|
msgAjaxProgressError: '{operation} falhou',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'Exclusão de arquivo',
|
||||||
|
uploadThumb: 'Upload de arquivos',
|
||||||
|
uploadBatch: 'Carregamento de arquivos em lote',
|
||||||
|
uploadExtra: 'Carregamento de dados do formulário'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Arraste e solte os arquivos aqui…',
|
||||||
|
dropZoneClickTitle: '<br>(ou clique para selecionar o(s) arquivo(s))',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Remover arquivo',
|
||||||
|
uploadTitle: 'Enviar arquivo',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Ver detalhes',
|
||||||
|
dragTitle: 'Mover / Reordenar',
|
||||||
|
indicatorNewTitle: 'Ainda não enviado',
|
||||||
|
indicatorSuccessTitle: 'Enviado',
|
||||||
|
indicatorErrorTitle: 'Erro',
|
||||||
|
indicatorLoadingTitle: 'Enviando...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Visualizar arquivo anterior',
|
||||||
|
next: 'Visualizar próximo arquivo',
|
||||||
|
toggleheader: 'Mostrar cabeçalho',
|
||||||
|
fullscreen: 'Ativar tela cheia',
|
||||||
|
borderless: 'Ativar modo sem borda',
|
||||||
|
close: 'Fechar pré-visualização detalhada'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Portuguese Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['pt'] = {
|
||||||
|
fileSingle: 'ficheiro',
|
||||||
|
filePlural: 'ficheiros',
|
||||||
|
browseLabel: 'Procurar …',
|
||||||
|
removeLabel: 'Remover',
|
||||||
|
removeTitle: 'Remover ficheiros seleccionados',
|
||||||
|
cancelLabel: 'Cancelar',
|
||||||
|
cancelTitle: 'Abortar carregamento ',
|
||||||
|
uploadLabel: 'Carregar',
|
||||||
|
uploadTitle: 'Carregar ficheiros seleccionados',
|
||||||
|
msgNo: 'Não',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Cancelado',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Pré-visualização detalhada',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Ficheiro "{name}" (<b>{size} KB</b>) excede o tamanho máximo permido de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Deve seleccionar pelo menos <b>{n}</b> {files} para fazer upload.',
|
||||||
|
msgFilesTooMany: 'Número máximo de ficheiros seleccionados <b>({n})</b> excede o limite máximo de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Ficheiro "{name}" não encontrado!',
|
||||||
|
msgFileSecured: 'Restrições de segurança preventem a leitura do ficheiro "{name}".',
|
||||||
|
msgFileNotReadable: 'Ficheiro "{name}" não pode ser lido.',
|
||||||
|
msgFilePreviewAborted: 'Pré-visualização abortado para o ficheiro "{name}".',
|
||||||
|
msgFilePreviewError: 'Ocorreu um erro ao ler o ficheiro "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Tipo inválido para o ficheiro "{name}". Apenas ficheiros "{types}" são suportados.',
|
||||||
|
msgInvalidFileExtension: 'Extensão inválida para o ficheiro "{name}". Apenas ficheiros "{extensions}" são suportados.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'O upload do arquivo foi abortada',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Erro de validação',
|
||||||
|
msgLoading: 'A carregar ficheiro {index} de {files} …',
|
||||||
|
msgProgress: 'A carregar ficheiro {index} de {files} - {name} - {percent}% completo.',
|
||||||
|
msgSelected: '{n} {files} seleccionados',
|
||||||
|
msgFoldersNotAllowed: 'Arrastar e largar ficheiros apenas! {n} pasta(s) ignoradas.',
|
||||||
|
msgImageWidthSmall: 'Largura do arquivo de imagem "{name}" deve ser pelo menos {size} px.',
|
||||||
|
msgImageHeightSmall: 'Altura do arquivo de imagem "{name}" deve ser pelo menos {size} px.',
|
||||||
|
msgImageWidthLarge: 'Largura do arquivo de imagem "{name}" não pode exceder {size} px.',
|
||||||
|
msgImageHeightLarge: 'Altura do arquivo de imagem "{name}" não pode exceder {size} px.',
|
||||||
|
msgImageResizeError: 'Could not get the image dimensions to resize.',
|
||||||
|
msgImageResizeException: 'Erro ao redimensionar a imagem.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Arrastar e largar ficheiros aqui …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Remover arquivo',
|
||||||
|
uploadTitle: 'Carregar arquivo',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Ver detalhes',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Ainda não carregou',
|
||||||
|
indicatorSuccessTitle: 'Carregado',
|
||||||
|
indicatorErrorTitle: 'Carregar Erro',
|
||||||
|
indicatorLoadingTitle: 'A carregar ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Romanian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author Ciprian Voicu <pictoru@autoportret.ro>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ro'] = {
|
||||||
|
fileSingle: 'fișier',
|
||||||
|
filePlural: 'fișiere',
|
||||||
|
browseLabel: 'Răsfoiește …',
|
||||||
|
removeLabel: 'Șterge',
|
||||||
|
removeTitle: 'Curăță fișierele selectate',
|
||||||
|
cancelLabel: 'Renunță',
|
||||||
|
cancelTitle: 'Anulează încărcarea curentă',
|
||||||
|
uploadLabel: 'Încarcă',
|
||||||
|
uploadTitle: 'Încarcă fișierele selectate',
|
||||||
|
msgNo: 'Nu',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Anulat',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Previzualizare detaliată',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Fișierul "{name}" (<b>{size} KB</b>) depășește limita maximă de încărcare de <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Trebuie să selectezi cel puțin <b>{n}</b> {files} pentru a încărca.',
|
||||||
|
msgFilesTooMany: 'Numărul fișierelor pentru încărcare <b>({n})</b> depășește limita maximă de <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Fișierul "{name}" nu a fost găsit!',
|
||||||
|
msgFileSecured: 'Restricții de securitate previn citirea fișierului "{name}".',
|
||||||
|
msgFileNotReadable: 'Fișierul "{name}" nu se poate citi.',
|
||||||
|
msgFilePreviewAborted: 'Fișierului "{name}" nu poate fi previzualizat.',
|
||||||
|
msgFilePreviewError: 'A intervenit o eroare în încercarea de citire a fișierului "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Tip de fișier incorect pentru "{name}". Sunt suportate doar fișiere de tipurile "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Extensie incorectă pentru "{name}". Sunt suportate doar extensiile "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Fișierul Încărcarea a fost întrerupt',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Eroare de validare',
|
||||||
|
msgLoading: 'Se încarcă fișierul {index} din {files} …',
|
||||||
|
msgProgress: 'Se încarcă fișierul {index} din {files} - {name} - {percent}% încărcat.',
|
||||||
|
msgSelected: '{n} {files} încărcate',
|
||||||
|
msgFoldersNotAllowed: 'Se poate doar trăgând fișierele! Se renunță la {n} dosar(e).',
|
||||||
|
msgImageWidthSmall: 'Lățimea de fișier de imagine "{name}" trebuie să fie de cel puțin {size} px.',
|
||||||
|
msgImageHeightSmall: 'Înălțimea fișier imagine "{name}" trebuie să fie de cel puțin {size} px.',
|
||||||
|
msgImageWidthLarge: 'Lățimea de fișier de imagine "{name}" nu poate depăși {size} px.',
|
||||||
|
msgImageHeightLarge: 'Înălțimea fișier imagine "{name}" nu poate depăși {size} px.',
|
||||||
|
msgImageResizeError: 'Nu a putut obține dimensiunile imaginii pentru a redimensiona.',
|
||||||
|
msgImageResizeException: 'Eroare la redimensionarea imaginii.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Trage fișierele aici …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Scoateți fișier',
|
||||||
|
uploadTitle: 'Incarca fisier',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Vezi detalii',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Nu a încărcat încă',
|
||||||
|
indicatorSuccessTitle: 'încărcat',
|
||||||
|
indicatorErrorTitle: 'Încărcați eroare',
|
||||||
|
indicatorLoadingTitle: 'Se încarcă ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Russian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author CyanoFresh <cyanofresh@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['ru'] = {
|
||||||
|
fileSingle: 'файл',
|
||||||
|
filePlural: 'файлы',
|
||||||
|
browseLabel: 'Выбрать …',
|
||||||
|
removeLabel: 'Удалить',
|
||||||
|
removeTitle: 'Очистить выбранные файлы',
|
||||||
|
cancelLabel: 'Отмена',
|
||||||
|
cancelTitle: 'Отменить текущую загрузку',
|
||||||
|
uploadLabel: 'Загрузить',
|
||||||
|
uploadTitle: 'Загрузить выбранные файлы',
|
||||||
|
msgNo: 'нет',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Отменено',
|
||||||
|
msgPlaceholder: 'Выбрать {files}...',
|
||||||
|
msgZoomModalHeading: 'Подробное превью',
|
||||||
|
msgFileRequired: 'Необходимо выбрать файл для загрузки.',
|
||||||
|
msgSizeTooSmall: 'Файл "{name}" (<b>{size} KB</b>) имеет слишком маленький размер и должен быть больше <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Файл "{name}" (<b>{size} KB</b>) превышает максимальный размер <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Вы должны выбрать как минимум <b>{n}</b> {files} для загрузки.',
|
||||||
|
msgFilesTooMany: 'Количество выбранных файлов <b>({n})</b> превышает максимально допустимое количество <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Файл "{name}" не найден!',
|
||||||
|
msgFileSecured: 'Ограничения безопасности запрещают читать файл "{name}".',
|
||||||
|
msgFileNotReadable: 'Файл "{name}" невозможно прочитать.',
|
||||||
|
msgFilePreviewAborted: 'Предпросмотр отменен для файла "{name}".',
|
||||||
|
msgFilePreviewError: 'Произошла ошибка при чтении файла "{name}".',
|
||||||
|
msgInvalidFileName: 'Неверные или неподдерживаемые символы в названии файла "{name}".',
|
||||||
|
msgInvalidFileType: 'Запрещенный тип файла для "{name}". Только "{types}" разрешены.',
|
||||||
|
msgInvalidFileExtension: 'Запрещенное расширение для файла "{name}". Только "{extensions}" разрешены.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Выгрузка файла прервана',
|
||||||
|
msgUploadThreshold: 'Обработка...',
|
||||||
|
msgUploadBegin: 'Инициализация...',
|
||||||
|
msgUploadEnd: 'Готово',
|
||||||
|
msgUploadEmpty: 'Недопустимые данные для загрузки',
|
||||||
|
msgUploadError: 'Ошибка загрузки',
|
||||||
|
msgValidationError: 'Ошибка проверки',
|
||||||
|
msgLoading: 'Загрузка файла {index} из {files} …',
|
||||||
|
msgProgress: 'Загрузка файла {index} из {files} - {name} - {percent}% завершено.',
|
||||||
|
msgSelected: 'Выбрано файлов: {n}',
|
||||||
|
msgFoldersNotAllowed: 'Разрешено перетаскивание только файлов! Пропущено {n} папок.',
|
||||||
|
msgImageWidthSmall: 'Ширина изображения {name} должна быть не меньше {size} px.',
|
||||||
|
msgImageHeightSmall: 'Высота изображения {name} должна быть не меньше {size} px.',
|
||||||
|
msgImageWidthLarge: 'Ширина изображения "{name}" не может превышать {size} px.',
|
||||||
|
msgImageHeightLarge: 'Высота изображения "{name}" не может превышать {size} px.',
|
||||||
|
msgImageResizeError: 'Не удалось получить размеры изображения, чтобы изменить размер.',
|
||||||
|
msgImageResizeException: 'Ошибка при изменении размера изображения.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Произошла ошибка при выполнении операции {operation}. Повторите попытку позже!',
|
||||||
|
msgAjaxProgressError: 'Не удалось выполнить {operation}',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'удалить файл',
|
||||||
|
uploadThumb: 'загрузить файл',
|
||||||
|
uploadBatch: 'загрузить пакет файлов',
|
||||||
|
uploadExtra: 'загрузка данных с формы'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Перетащите файлы сюда …',
|
||||||
|
dropZoneClickTitle: '<br>(Или щёлкните, чтобы выбрать {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Удалить файл',
|
||||||
|
uploadTitle: 'Загрузить файл',
|
||||||
|
uploadRetryTitle: 'Повторить загрузку',
|
||||||
|
downloadTitle: 'Загрузить файл',
|
||||||
|
zoomTitle: 'Посмотреть детали',
|
||||||
|
dragTitle: 'Переместить / Изменить порядок',
|
||||||
|
indicatorNewTitle: 'Еще не загружен',
|
||||||
|
indicatorSuccessTitle: 'Загружен',
|
||||||
|
indicatorErrorTitle: 'Ошибка загрузки',
|
||||||
|
indicatorLoadingTitle: 'Загрузка ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Посмотреть предыдущий файл',
|
||||||
|
next: 'Посмотреть следующий файл',
|
||||||
|
toggleheader: 'Переключить заголовок',
|
||||||
|
fullscreen: 'Переключить полноэкранный режим',
|
||||||
|
borderless: 'Переключить режим без полей',
|
||||||
|
close: 'Закрыть подробный предпросмотр'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Slovakian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['sk'] = {
|
||||||
|
fileSingle: 'súbor',
|
||||||
|
filePlural: 'súbory',
|
||||||
|
browseLabel: 'Vybrať …',
|
||||||
|
removeLabel: 'Odstrániť',
|
||||||
|
removeTitle: 'Vyčistiť vybraté súbory',
|
||||||
|
cancelLabel: 'Storno',
|
||||||
|
cancelTitle: 'Prerušiť nahrávanie',
|
||||||
|
uploadLabel: 'Nahrať',
|
||||||
|
uploadTitle: 'Nahrať vybraté súbory',
|
||||||
|
msgNo: 'Nie',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Zrušené',
|
||||||
|
msgPlaceholder: 'Vybrať {files}...',
|
||||||
|
msgZoomModalHeading: 'Detailný náhľad',
|
||||||
|
msgFileRequired: 'Musíte vybrať súbor, ktorý chcete nahrať.',
|
||||||
|
msgSizeTooSmall: 'Súbor "{name}" (<b>{size} KB</b>) je príliš malý, musí mať veľkosť najmenej <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Súbor "{name}" (<b>{size} KB</b>) je príliš veľký, maximálna povolená veľkosť <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Musíte vybrať najmenej <b>{n}</b> {files} pre nahranie.',
|
||||||
|
msgFilesTooMany: 'Počet vybratých súborov <b>({n})</b> prekročil maximálny povolený limit <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Súbor "{name}" nebol nájdený!',
|
||||||
|
msgFileSecured: 'Zabezpečenie súboru znemožnilo čítať súbor "{name}".',
|
||||||
|
msgFileNotReadable: 'Súbor "{name}" nie je čitateľný.',
|
||||||
|
msgFilePreviewAborted: 'Náhľad súboru bol prerušený pre "{name}".',
|
||||||
|
msgFilePreviewError: 'Nastala chyba pri načítaní súboru "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Neplatný typ súboru "{name}". Iba "{types}" súborov sú podporované.',
|
||||||
|
msgInvalidFileExtension: 'Neplatná extenzia súboru "{name}". Iba "{extensions}" súborov sú podporované.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'obrázok',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Nahrávanie súboru bolo prerušené',
|
||||||
|
msgUploadThreshold: 'Spracovávam...',
|
||||||
|
msgUploadBegin: 'Inicializujem...',
|
||||||
|
msgUploadEnd: 'Hotovo',
|
||||||
|
msgUploadEmpty: 'Na nahrávanie nie sú k dispozícii žiadne platné údaje.',
|
||||||
|
msgUploadError: 'Chyba',
|
||||||
|
msgValidationError: 'Chyba overenia',
|
||||||
|
msgLoading: 'Nahrávanie súboru {index} z {files} …',
|
||||||
|
msgProgress: 'Nahrávanie súboru {index} z {files} - {name} - {percent}% dokončené.',
|
||||||
|
msgSelected: '{n} {files} vybraté',
|
||||||
|
msgFoldersNotAllowed: 'Tiahni a pusť iba súbory! Vynechané {n} pustené prečinok(y).',
|
||||||
|
msgImageWidthSmall: 'Šírka obrázku "{name}", musí byť minimálne {size} px.',
|
||||||
|
msgImageHeightSmall: 'Výška obrázku "{name}", musí byť minimálne {size} px.',
|
||||||
|
msgImageWidthLarge: 'Šírka obrázku "{name}" nemôže presiahnuť {size} px.',
|
||||||
|
msgImageHeightLarge: 'Výška obrázku "{name}" nesmie presiahnuť {size} px.',
|
||||||
|
msgImageResizeError: 'Nepodarilo sa získať veľkosť obrázka pre zmenu veľkosti.',
|
||||||
|
msgImageResizeException: 'Chyba pri zmene veľkosti obrázka.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Pri operácii {operation} sa vyskytla chyba. Skúste to prosím neskôr!',
|
||||||
|
msgAjaxProgressError: '{operation} - neúspešné',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'odstrániť súbor',
|
||||||
|
uploadThumb: 'nahrať súbor',
|
||||||
|
uploadBatch: 'nahrať várku súborov',
|
||||||
|
uploadExtra: 'odosielanie údajov z formulára'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Tiahni a pusť súbory tu …',
|
||||||
|
dropZoneClickTitle: '<br>(alebo kliknite sem a vyberte {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Odstrániť súbor',
|
||||||
|
uploadTitle: 'Nahrať súbor',
|
||||||
|
uploadRetryTitle: 'Znova nahrať',
|
||||||
|
downloadTitle: 'Stiahnuť súbor',
|
||||||
|
zoomTitle: 'Zobraziť podrobnosti',
|
||||||
|
dragTitle: 'Posunúť / Preskládať',
|
||||||
|
indicatorNewTitle: 'Ešte nenahral',
|
||||||
|
indicatorSuccessTitle: 'Nahraný',
|
||||||
|
indicatorErrorTitle: 'Chyba pri nahrávaní',
|
||||||
|
indicatorLoadingTitle: 'Nahrávanie ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Zobraziť predchádzajúci súbor',
|
||||||
|
next: 'Zobraziť následujúci súbor',
|
||||||
|
toggleheader: 'Prepnúť záhlavie',
|
||||||
|
fullscreen: 'Prepnúť zobrazenie na celú obrazovku',
|
||||||
|
borderless: 'Prepnúť na bezrámikové zobrazenie',
|
||||||
|
close: 'Zatvoriť detailný náhľad'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Slovenian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author kv1dr <kv1dr.android@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['sl'] = {
|
||||||
|
fileSingle: 'datoteka',
|
||||||
|
filePlural: 'datotek',
|
||||||
|
browseLabel: 'Prebrskaj …',
|
||||||
|
removeLabel: 'Odstrani',
|
||||||
|
removeTitle: 'Počisti izbrane datoteke',
|
||||||
|
cancelLabel: 'Prekliči',
|
||||||
|
cancelTitle: 'Prekliči nalaganje',
|
||||||
|
uploadLabel: 'Naloži',
|
||||||
|
uploadTitle: 'Naloži izbrane datoteke',
|
||||||
|
msgNo: 'Ne',
|
||||||
|
msgNoFilesSelected: 'Nobena datoteka ni izbrana',
|
||||||
|
msgCancelled: 'Preklicano',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Podroben predogled',
|
||||||
|
msgSizeTooLarge: 'Datoteka "{name}" (<b>{size} KB</b>) presega največjo dovoljeno velikost za nalaganje <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Za nalaganje morate izbrati vsaj <b>{n}</b> {files}.',
|
||||||
|
msgFilesTooMany: 'Število datotek, izbranih za nalaganje <b>({n})</b> je prekoračilo največjo dovoljeno število <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Datoteka "{name}" ni bila najdena!',
|
||||||
|
msgFileSecured: 'Zaradi varnostnih omejitev nisem mogel prebrati datoteko "{name}".',
|
||||||
|
msgFileNotReadable: 'Datoteka "{name}" ni berljiva.',
|
||||||
|
msgFilePreviewAborted: 'Predogled datoteke "{name}" preklican.',
|
||||||
|
msgFilePreviewError: 'Pri branju datoteke "{name}" je prišlo do napake.',
|
||||||
|
msgInvalidFileType: 'Napačen tip datoteke "{name}". Samo "{types}" datoteke so podprte.',
|
||||||
|
msgInvalidFileExtension: 'Napačna končnica datoteke "{name}". Samo "{extensions}" datoteke so podprte.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Nalaganje datoteke je bilo preklicano',
|
||||||
|
msgUploadThreshold: 'Procesiram...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Napaki pri validiranju',
|
||||||
|
msgLoading: 'Nalaganje datoteke {index} od {files} …',
|
||||||
|
msgProgress: 'Nalaganje datoteke {index} od {files} - {name} - {percent}% dokončano.',
|
||||||
|
msgSelected: '{n} {files} izbrano',
|
||||||
|
msgFoldersNotAllowed: 'Povlecite in spustite samo datoteke! Izpuščenih je bilo {n} map.',
|
||||||
|
msgImageWidthSmall: 'Širina slike "{name}" mora biti vsaj {size} px.',
|
||||||
|
msgImageHeightSmall: 'Višina slike "{name}" mora biti vsaj {size} px.',
|
||||||
|
msgImageWidthLarge: 'Širina slike "{name}" ne sme preseči {size} px.',
|
||||||
|
msgImageHeightLarge: 'Višina slike "{name}" ne sme preseči {size} px.',
|
||||||
|
msgImageResizeError: 'Nisem mogel pridobiti dimenzij slike za spreminjanje velikosti.',
|
||||||
|
msgImageResizeException: 'Napaka pri spreminjanju velikosti slike.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Povlecite in spustite datoteke sem …',
|
||||||
|
dropZoneClickTitle: '<br>(ali kliknite sem za izbiro {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Odstrani datoteko',
|
||||||
|
uploadTitle: 'Naloži datoteko',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Poglej podrobnosti',
|
||||||
|
dragTitle: 'Premaki / Razporedi',
|
||||||
|
indicatorNewTitle: 'Še ni naloženo',
|
||||||
|
indicatorSuccessTitle: 'Naloženo',
|
||||||
|
indicatorErrorTitle: 'Napaka pri nalaganju',
|
||||||
|
indicatorLoadingTitle: 'Nalagam ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Poglej prejšno datoteko',
|
||||||
|
next: 'Poglej naslednjo datoteko',
|
||||||
|
toggleheader: 'Preklopi glavo',
|
||||||
|
fullscreen: 'Preklopi celozaslonski način',
|
||||||
|
borderless: 'Preklopi način brez robov',
|
||||||
|
close: 'Zapri predogled podrobnosti'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*!
|
||||||
|
* FileInput <_LANG_> Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['sv'] = {
|
||||||
|
fileSingle: 'fil',
|
||||||
|
filePlural: 'filer',
|
||||||
|
browseLabel: 'Bläddra …',
|
||||||
|
removeLabel: 'Ta bort',
|
||||||
|
removeTitle: 'Rensa valda filer',
|
||||||
|
cancelLabel: 'Avbryt',
|
||||||
|
cancelTitle: 'Avbryt pågående uppladdning',
|
||||||
|
uploadLabel: 'Ladda upp',
|
||||||
|
uploadTitle: 'Ladda upp valda filer',
|
||||||
|
msgNo: 'Nej',
|
||||||
|
msgNoFilesSelected: 'Inga filer valda',
|
||||||
|
msgCancelled: 'Avbruten',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'detaljerad förhandsgranskning',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'Filen "{name}" (<b>{size} KB</b>) är för liten och måste vara större än <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) överstiger högsta tillåtna uppladdningsstorlek <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Du måste välja minst <b>{n}</b> {files} för att ladda upp.',
|
||||||
|
msgFilesTooMany: 'Antal filer valda för uppladdning <b>({n})</b> överstiger högsta tillåtna gränsen <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Filen "{name}" kunde inte hittas!',
|
||||||
|
msgFileSecured: 'Säkerhetsbegränsningar förhindrar att läsa filen "{name}".',
|
||||||
|
msgFileNotReadable: 'Filen "{name}" är inte läsbar.',
|
||||||
|
msgFilePreviewAborted: 'Filförhandsvisning avbröts för "{name}".',
|
||||||
|
msgFilePreviewError: 'Ett fel uppstod vid inläsning av filen "{name}".',
|
||||||
|
msgInvalidFileName: 'Ogiltiga eller tecken som inte stöds i filnamnet "{name}".',
|
||||||
|
msgInvalidFileType: 'Ogiltig typ för filen "{name}". Endast "{types}" filtyper stöds.',
|
||||||
|
msgInvalidFileExtension: 'Ogiltigt filtillägg för filen "{name}". Endast "{extensions}" filer stöds.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'bild',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'ljud',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'objekt'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Filöverföringen avbröts',
|
||||||
|
msgUploadThreshold: 'Bearbetar...',
|
||||||
|
msgUploadBegin: 'Påbörjar...',
|
||||||
|
msgUploadEnd: 'Färdig',
|
||||||
|
msgUploadEmpty: 'Ingen giltig data tillgänglig för uppladdning.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Valideringsfel',
|
||||||
|
msgLoading: 'Laddar fil {index} av {files} …',
|
||||||
|
msgProgress: 'Laddar fil {index} av {files} - {name} - {percent}% färdig.',
|
||||||
|
msgSelected: '{n} {files} valda',
|
||||||
|
msgFoldersNotAllowed: 'Endast drag & släppfiler! Skippade {n} släpta mappar.',
|
||||||
|
msgImageWidthSmall: 'Bredd på bildfilen "{name}" måste minst vara {size} pixlar.',
|
||||||
|
msgImageHeightSmall: 'Höjden på bildfilen "{name}" måste minst vara {size} pixlar.',
|
||||||
|
msgImageWidthLarge: 'Bredd på bildfil "{name}" kan inte överstiga {size} pixlar.',
|
||||||
|
msgImageHeightLarge: 'Höjden på bildfilen "{name}" kan inte överstiga {size} pixlar.',
|
||||||
|
msgImageResizeError: 'Det gick inte att hämta bildens dimensioner för att ändra storlek.',
|
||||||
|
msgImageResizeException: 'Fel vid storleksändring av bilden.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Något gick fel med {operation} operationen. Försök igen senare!',
|
||||||
|
msgAjaxProgressError: '{operation} misslyckades',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Drag & släpp filer här …',
|
||||||
|
dropZoneClickTitle: '<br>(eller klicka för att markera {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Ta bort fil',
|
||||||
|
uploadTitle: 'Ladda upp fil',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
zoomTitle: 'Visa detaljer',
|
||||||
|
dragTitle: 'Flytta / Ändra ordning',
|
||||||
|
indicatorNewTitle: 'Inte uppladdat ännu',
|
||||||
|
indicatorSuccessTitle: 'Uppladdad',
|
||||||
|
indicatorErrorTitle: 'Uppladdningsfel',
|
||||||
|
indicatorLoadingTitle: 'Laddar upp...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Visa föregående fil',
|
||||||
|
next: 'Visa nästa fil',
|
||||||
|
toggleheader: 'Rubrik',
|
||||||
|
fullscreen: 'Fullskärm',
|
||||||
|
borderless: 'Gränslös',
|
||||||
|
close: 'Stäng detaljerad förhandsgranskning'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Thai Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['th'] = {
|
||||||
|
fileSingle: 'ไฟล์',
|
||||||
|
filePlural: 'ไฟล์',
|
||||||
|
browseLabel: 'เลือกดู …',
|
||||||
|
removeLabel: 'ลบทิ้ง',
|
||||||
|
removeTitle: 'ลบไฟล์ที่เลือกทิ้ง',
|
||||||
|
cancelLabel: 'ยกเลิก',
|
||||||
|
cancelTitle: 'ยกเลิกการอัพโหลด',
|
||||||
|
uploadLabel: 'อัพโหลด',
|
||||||
|
uploadTitle: 'อัพโหลดไฟล์ที่เลือก',
|
||||||
|
msgNo: 'ไม่',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'ยกเลิก',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'ตัวอย่างละเอียด',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'ไฟล์ "{name}" (<b>{size} KB</b>) มีขนาดเกินที่ระบบอนุญาตที่ <b>{maxSize} KB</b>, กรุณาลองใหม่อีกครั้ง!',
|
||||||
|
msgFilesTooLess: 'คุณต้องเลือกไฟล์จำนวนอย่างน้อย <b>{n}</b> {files} เพื่ออัพโหลด, กรุณาลองใหม่อีกครั้ง!',
|
||||||
|
msgFilesTooMany: 'ไฟล์ที่คุณเลือกมีจำนวน <b>({n})</b> ซึ่งเกินกว่าที่ระบบอนุญาตที่ <b>{m}</b>, กรุณาลองใหม่อีกครั้ง!',
|
||||||
|
msgFileNotFound: 'ไม่พบไฟล์ "{name}" !',
|
||||||
|
msgFileSecured: 'ระบบความปลอดภัยไม่อนุญาตให้อ่านไฟล์ "{name}".',
|
||||||
|
msgFileNotReadable: 'ไม่สามารถอ่านไฟล์ "{name}" ได้',
|
||||||
|
msgFilePreviewAborted: 'ไฟล์ "{name}" ไม่อนุญาตให้ดูตัวอย่าง',
|
||||||
|
msgFilePreviewError: 'พบปัญหาในการดูตัวอย่างไฟล์ "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'ไฟล์ "{name}" เป็นประเภทไฟล์ที่ไม่ถูกต้อง, อนุญาตเฉพาะไฟล์ประเภท "{types}"',
|
||||||
|
msgInvalidFileExtension: 'ไฟล์ "{name}" เป็น extension ที่ไมถูกต้อง, อนุญาตเฉพาะไฟล์ extension "{extensions}"',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'อัปโหลดไฟล์ถูกยกเลิก',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'ข้อผิดพลาดในการตรวจสอบ',
|
||||||
|
msgLoading: 'กำลังโหลดไฟล์ {index} จาก {files} …',
|
||||||
|
msgProgress: 'กำลังโหลดไฟล์ {index} จาก {files} - {name} - {percent}%',
|
||||||
|
msgSelected: '{n} {files} ถูกเลือก',
|
||||||
|
msgFoldersNotAllowed: 'Drag & drop เฉพาะไฟล์เท่านั้น! ข้าม dropped folder จำนวน {n}',
|
||||||
|
msgImageWidthSmall: 'ความกว้างของภาพไฟล์ "{name}" ต้องมีอย่างน้อย {size} px.',
|
||||||
|
msgImageHeightSmall: 'ความสูงของภาพไฟล์ "{name}" ต้องมีอย่างน้อย {size} px.',
|
||||||
|
msgImageWidthLarge: 'ความกว้างของภาพไฟล์ "{name}" ไม่เกิน {size} พิกเซล.',
|
||||||
|
msgImageHeightLarge: 'ความสูงของไฟล์ภาพ "{name}" ไม่เกิน {size} พิกเซล.',
|
||||||
|
msgImageResizeError: 'ไม่สามารถรับขนาดภาพเพื่อปรับขนาด',
|
||||||
|
msgImageResizeException: 'ข้อผิดพลาดขณะปรับขนาดภาพ<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Drag & drop ไฟล์ตรงนี้ …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'ลบไฟล์',
|
||||||
|
uploadTitle: 'อัปโหลดไฟล์',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'ดูรายละเอียด',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'ยังไม่ได้อัปโหลด',
|
||||||
|
indicatorSuccessTitle: 'อัพโหลด',
|
||||||
|
indicatorErrorTitle: 'อัปโหลดข้อผิดพลาด',
|
||||||
|
indicatorLoadingTitle: 'อัพโหลด ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Turkish Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['tr'] = {
|
||||||
|
fileSingle: 'dosya',
|
||||||
|
filePlural: 'dosyalar',
|
||||||
|
browseLabel: 'Gözat …',
|
||||||
|
removeLabel: 'Sil',
|
||||||
|
removeTitle: 'Seçilen dosyaları sil',
|
||||||
|
cancelLabel: 'İptal',
|
||||||
|
cancelTitle: 'Devam eden yüklemeyi iptal et',
|
||||||
|
uploadLabel: 'Yükle',
|
||||||
|
uploadTitle: 'Seçilen dosyaları yükle',
|
||||||
|
msgNo: 'Hayır',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'İptal edildi',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Detaylı Önizleme',
|
||||||
|
msgFileRequired: 'Yüklemek için bir dosya seçmelisiniz.',
|
||||||
|
msgSizeTooSmall: '"{name}"(<b>{size} KB</b>) dosyası çok küçük ve <b>{minSize} KB</b> boyutundan büyük olmalıdır.',
|
||||||
|
msgSizeTooLarge: '"{name}" dosyasının boyutu (<b>{size} KB</b>) izin verilen azami dosya boyutu olan <b>{maxSize} KB</b>\'tan büyük.',
|
||||||
|
msgFilesTooLess: 'Yüklemek için en az <b>{n}</b> {files} dosya seçmelisiniz.',
|
||||||
|
msgFilesTooMany: 'Yüklemek için seçtiğiniz dosya sayısı <b>({n})</b> azami limitin <b>({m})</b> altında olmalıdır.',
|
||||||
|
msgFileNotFound: '"{name}" dosyası bulunamadı!',
|
||||||
|
msgFileSecured: 'Güvenlik kısıtlamaları "{name}" dosyasının okunmasını engelliyor.',
|
||||||
|
msgFileNotReadable: '"{name}" dosyası okunabilir değil.',
|
||||||
|
msgFilePreviewAborted: '"{name}" dosyası için önizleme iptal edildi.',
|
||||||
|
msgFilePreviewError: '"{name}" dosyası okunurken bir hata oluştu.',
|
||||||
|
msgInvalidFileName: '"{name}" dosya adında geçersiz veya desteklenmeyen karakterler var.',
|
||||||
|
msgInvalidFileType: '"{name}" dosyasının türü geçerli değil. Yalnızca "{types}" türünde dosyalara izin veriliyor.',
|
||||||
|
msgInvalidFileExtension: '"{name}" dosyasının uzantısı geçersiz. Yalnızca "{extensions}" uzantılı dosyalara izin veriliyor.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Dosya yükleme iptal edildi',
|
||||||
|
msgUploadThreshold: 'İşlem yapılıyor...',
|
||||||
|
msgUploadBegin: 'Başlıyor...',
|
||||||
|
msgUploadEnd: 'Başarılı',
|
||||||
|
msgUploadEmpty: 'Yüklemek için geçerli veri mevcut değil.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Doğrulama Hatası',
|
||||||
|
msgLoading: 'Dosya yükleniyor {index} / {files} …',
|
||||||
|
msgProgress: 'Dosya yükleniyor {index} / {files} - {name} - %{percent} tamamlandı.',
|
||||||
|
msgSelected: '{n} {files} seçildi',
|
||||||
|
msgFoldersNotAllowed: 'Yalnızca dosyaları sürükleyip bırakabilirsiniz! {n} dizin(ler) göz ardı edildi.',
|
||||||
|
msgImageWidthSmall: '"{name}" adlı görüntü dosyasının genişliği en az {size} piksel olmalıdır.',
|
||||||
|
msgImageHeightSmall: '"{name}" adlı görüntü dosyasının yüksekliği en az {size} piksel olmalıdır.',
|
||||||
|
msgImageWidthLarge: '"{name}" adlı görüntü dosyasının genişliği {size} pikseli geçemez.',
|
||||||
|
msgImageHeightLarge: '"{name}" adlı görüntü dosyasının yüksekliği {size} pikseli geçemez.',
|
||||||
|
msgImageResizeError: 'Görüntü boyutlarını yeniden boyutlandıramadı.',
|
||||||
|
msgImageResizeException: 'Görüntü boyutlandırma sırasında hata.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: '{operation} işlemi ile ilgili bir şeyler ters gitti. Lütfen daha sonra tekrar deneyiniz!',
|
||||||
|
msgAjaxProgressError: '{operation} işlemi başarısız oldu.',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'dosya silme',
|
||||||
|
uploadThumb: 'dosya yükleme',
|
||||||
|
uploadBatch: 'toplu dosya yükleme',
|
||||||
|
uploadExtra: 'form verisi yükleme'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Dosyaları buraya sürükleyip bırakın',
|
||||||
|
dropZoneClickTitle: '<br>(ya da {files} seçmek için tıklayınız)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Dosyayı kaldır',
|
||||||
|
uploadTitle: 'Dosyayı yükle',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
zoomTitle: 'Ayrıntıları görüntüle',
|
||||||
|
dragTitle: 'Taşı / Yeniden düzenle',
|
||||||
|
indicatorNewTitle: 'Henüz yüklenmedi',
|
||||||
|
indicatorSuccessTitle: 'Yüklendi',
|
||||||
|
indicatorErrorTitle: 'Yükleme Hatası',
|
||||||
|
indicatorLoadingTitle: 'Yükleniyor ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Önceki dosyayı göster',
|
||||||
|
next: 'Sonraki dosyayı göster',
|
||||||
|
toggleheader: 'Üst bilgi geçiş',
|
||||||
|
fullscreen: 'Tam ekran geçiş',
|
||||||
|
borderless: 'Çerçevesiz moda geçiş',
|
||||||
|
close: 'Detaylı önizlemeyi kapat'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Ukrainian Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author CyanoFresh <cyanofresh@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['uk'] = {
|
||||||
|
fileSingle: 'файл',
|
||||||
|
filePlural: 'файли',
|
||||||
|
browseLabel: 'Вибрати …',
|
||||||
|
removeLabel: 'Видалити',
|
||||||
|
removeTitle: 'Видалити вибрані файли',
|
||||||
|
cancelLabel: 'Скасувати',
|
||||||
|
cancelTitle: 'Скасувати поточну загрузку',
|
||||||
|
uploadLabel: 'Загрузити',
|
||||||
|
uploadTitle: 'Загрузити вибрані файли',
|
||||||
|
msgNo: 'Немає',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: 'Cкасовано',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Детальний превью',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Файл "{name}" (<b>{size} KB</b>) перевищує максимальний розмір <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Ви повинні вибрати як мінімум <b>{n}</b> {files} для загрузки.',
|
||||||
|
msgFilesTooMany: 'Кількість вибраних файлів <b>({n})</b> перевищує максимально допустиму кількість <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Файл "{name}" не знайдено!',
|
||||||
|
msgFileSecured: 'Обмеження безпеки перешкоджають читанню файла "{name}".',
|
||||||
|
msgFileNotReadable: 'Файл "{name}" неможливо прочитати.',
|
||||||
|
msgFilePreviewAborted: 'Перегляд скасований для файла "{name}".',
|
||||||
|
msgFilePreviewError: 'Сталася помилка під час читання файла "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Заборонений тип файла для "{name}". Тільки "{types}" дозволені.',
|
||||||
|
msgInvalidFileExtension: 'Заборонене розширення для файла "{name}". Тільки "{extensions}" дозволені.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Вивантаження файлу перервана',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Помилка перевірки',
|
||||||
|
msgLoading: 'Загрузка файла {index} із {files} …',
|
||||||
|
msgProgress: 'Загрузка файла {index} із {files} - {name} - {percent}% завершено.',
|
||||||
|
msgSelected: '{n} {files} вибрано',
|
||||||
|
msgFoldersNotAllowed: 'Дозволено перетягувати тільки файли! Пропущено {n} папок.',
|
||||||
|
msgImageWidthSmall: 'Ширина зображення "{name}" повинна бути не менше {size} px.',
|
||||||
|
msgImageHeightSmall: 'Висота зображення "{name}" повинна бути не менше {size} px.',
|
||||||
|
msgImageWidthLarge: 'Ширина зображення "{name}" не може перевищувати {size} px.',
|
||||||
|
msgImageHeightLarge: 'Висота зображення "{name}" не може перевищувати {size} px.',
|
||||||
|
msgImageResizeError: 'Не вдалося розміри зображення, щоб змінити розмір.',
|
||||||
|
msgImageResizeException: 'Помилка при зміні розміру зображення.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Перетягніть файли сюди …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Видалити файл',
|
||||||
|
uploadTitle: 'Загрузити файл',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Подивитися деталі',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: 'Ще не загружено',
|
||||||
|
indicatorSuccessTitle: 'Загружено',
|
||||||
|
indicatorErrorTitle: 'Помилка при загрузці',
|
||||||
|
indicatorLoadingTitle: 'Загрузка ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Vietnamese Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['vi'] = {
|
||||||
|
fileSingle: 'tập tin',
|
||||||
|
filePlural: 'các tập tin',
|
||||||
|
browseLabel: 'Duyệt …',
|
||||||
|
removeLabel: 'Gỡ bỏ',
|
||||||
|
removeTitle: 'Bỏ tập tin đã chọn',
|
||||||
|
cancelLabel: 'Hủy',
|
||||||
|
cancelTitle: 'Hủy upload',
|
||||||
|
uploadLabel: 'Upload',
|
||||||
|
uploadTitle: 'Upload tập tin đã chọn',
|
||||||
|
msgNo: 'Không',
|
||||||
|
msgNoFilesSelected: 'Không tập tin nào được chọn',
|
||||||
|
msgCancelled: 'Đã hủy',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: 'Chi tiết xem trước',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: 'Tập tin "{name}" (<b>{size} KB</b>) vượt quá kích thước giới hạn cho phép <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: 'Bạn phải chọn ít nhất <b>{n}</b> {files} để upload.',
|
||||||
|
msgFilesTooMany: 'Số lượng tập tin upload <b>({n})</b> vượt quá giới hạn cho phép là <b>{m}</b>.',
|
||||||
|
msgFileNotFound: 'Không tìm thấy tập tin "{name}"!',
|
||||||
|
msgFileSecured: 'Các hạn chế về bảo mật không cho phép đọc tập tin "{name}".',
|
||||||
|
msgFileNotReadable: 'Không đọc được tập tin "{name}".',
|
||||||
|
msgFilePreviewAborted: 'Đã dừng xem trước tập tin "{name}".',
|
||||||
|
msgFilePreviewError: 'Đã xảy ra lỗi khi đọc tập tin "{name}".',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: 'Tập tin "{name}" không hợp lệ. Chỉ hỗ trợ loại tập tin "{types}".',
|
||||||
|
msgInvalidFileExtension: 'Phần mở rộng của tập tin "{name}" không hợp lệ. Chỉ hỗ trợ phần mở rộng "{extensions}".',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: 'Đã dừng upload',
|
||||||
|
msgUploadThreshold: 'Đang xử lý...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: 'Lỗi xác nhận',
|
||||||
|
msgLoading: 'Đang nạp {index} tập tin trong số {files} …',
|
||||||
|
msgProgress: 'Đang nạp {index} tập tin trong số {files} - {name} - {percent}% hoàn thành.',
|
||||||
|
msgSelected: '{n} {files} được chọn',
|
||||||
|
msgFoldersNotAllowed: 'Chỉ kéo thả tập tin! Đã bỏ qua {n} thư mục.',
|
||||||
|
msgImageWidthSmall: 'Chiều rộng của hình ảnh "{name}" phải tối thiểu là {size} px.',
|
||||||
|
msgImageHeightSmall: 'Chiều cao của hình ảnh "{name}" phải tối thiểu là {size} px.',
|
||||||
|
msgImageWidthLarge: 'Chiều rộng của hình ảnh "{name}" không được quá {size} px.',
|
||||||
|
msgImageHeightLarge: 'Chiều cao của hình ảnh "{name}" không được quá {size} px.',
|
||||||
|
msgImageResizeError: 'Không lấy được kích thước của hình ảnh để resize.',
|
||||||
|
msgImageResizeException: 'Resize hình ảnh bị lỗi.<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: 'Kéo thả tập tin vào đây …',
|
||||||
|
dropZoneClickTitle: '<br>(hoặc click để chọn {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: 'Gỡ bỏ',
|
||||||
|
uploadTitle: 'Upload tập tin',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: 'Phóng lớn',
|
||||||
|
dragTitle: 'Di chuyển / Sắp xếp lại',
|
||||||
|
indicatorNewTitle: 'Chưa được upload',
|
||||||
|
indicatorSuccessTitle: 'Đã upload',
|
||||||
|
indicatorErrorTitle: 'Upload bị lỗi',
|
||||||
|
indicatorLoadingTitle: 'Đang upload ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'Xem tập tin phía trước',
|
||||||
|
next: 'Xem tập tin tiếp theo',
|
||||||
|
toggleheader: 'Ẩn/hiện tiêu đề',
|
||||||
|
fullscreen: 'Bật/tắt toàn màn hình',
|
||||||
|
borderless: 'Bật/tắt chế độ không viền',
|
||||||
|
close: 'Đóng'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Chinese Traditional Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author kangqf <kangqingfei@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['zh-TW'] = {
|
||||||
|
fileSingle: '單一檔案',
|
||||||
|
filePlural: '複選檔案',
|
||||||
|
browseLabel: '瀏覽 …',
|
||||||
|
removeLabel: '移除',
|
||||||
|
removeTitle: '清除選取檔案',
|
||||||
|
cancelLabel: '取消',
|
||||||
|
cancelTitle: '取消上傳中檔案',
|
||||||
|
uploadLabel: '上傳',
|
||||||
|
uploadTitle: '上傳選取檔案',
|
||||||
|
msgNo: '沒有',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: '取消',
|
||||||
|
zoomTitle: '詳細資料',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: '內容預覽',
|
||||||
|
msgFileRequired: 'You must select a file to upload.',
|
||||||
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: '檔案 "{name}" (<b>{size} KB</b>) 大小超過上限 <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: '最少必須選擇 <b>{n}</b> {files} 來上傳. ',
|
||||||
|
msgFilesTooMany: '上傳的檔案數量 <b>({n})</b> 超過最大檔案上傳限制 <b>{m}</b>.',
|
||||||
|
msgFileNotFound: '檔案 "{name}" 未發現!',
|
||||||
|
msgFileSecured: '安全限制,禁止讀取檔案 "{name}".',
|
||||||
|
msgFileNotReadable: '文件 "{name}" 不可讀取.',
|
||||||
|
msgFilePreviewAborted: '檔案 "{name}" 預覽中止.',
|
||||||
|
msgFilePreviewError: '讀取 "{name}" 發生錯誤.',
|
||||||
|
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
|
||||||
|
msgInvalidFileType: '檔案類型錯誤 "{name}". 只能使用 "{types}" 類型的檔案.',
|
||||||
|
msgInvalidFileExtension: '附檔名錯誤 "{name}". 只能使用 "{extensions}" 的檔案.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: '該文件上傳被中止',
|
||||||
|
msgUploadThreshold: 'Processing...',
|
||||||
|
msgUploadBegin: 'Initializing...',
|
||||||
|
msgUploadEnd: 'Done',
|
||||||
|
msgUploadEmpty: 'No valid data available for upload.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: '驗證錯誤',
|
||||||
|
msgLoading: '載入第 {index} 個檔案,共 {files} …',
|
||||||
|
msgProgress: '載入第 {index} 個檔案,共 {files} - {name} - {percent}% 成功.',
|
||||||
|
msgSelected: '{n} {files} 選取',
|
||||||
|
msgFoldersNotAllowed: '只支援單檔拖曳! 無法使用 {n} 拖拽的資料夹.',
|
||||||
|
msgImageWidthSmall: '圖檔寬度"{name}"必須至少為{size}像素(px).',
|
||||||
|
msgImageHeightSmall: '圖檔高度"{name}"必須至少為{size}像素(px).',
|
||||||
|
msgImageWidthLarge: '圖檔寬度"{name}"不能超過{size}像素(px).',
|
||||||
|
msgImageHeightLarge: '圖檔高度"{name}"不能超過{size}像素(px).',
|
||||||
|
msgImageResizeError: '無法獲取的圖像尺寸調整。',
|
||||||
|
msgImageResizeException: '錯誤而調整圖像大小。<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!',
|
||||||
|
msgAjaxProgressError: '{operation} failed',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: 'file delete',
|
||||||
|
uploadThumb: 'file upload',
|
||||||
|
uploadBatch: 'batch file upload',
|
||||||
|
uploadExtra: 'form data upload'
|
||||||
|
},
|
||||||
|
dropZoneTitle: '拖曳檔案至此 …',
|
||||||
|
dropZoneClickTitle: '<br>(or click to select {files})',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: '刪除檔案',
|
||||||
|
uploadTitle: '上傳檔案',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
downloadTitle: 'Download file',
|
||||||
|
zoomTitle: '詳細資料',
|
||||||
|
dragTitle: 'Move / Rearrange',
|
||||||
|
indicatorNewTitle: '尚未上傳',
|
||||||
|
indicatorSuccessTitle: '上傳成功',
|
||||||
|
indicatorErrorTitle: '上傳失敗',
|
||||||
|
indicatorLoadingTitle: '上傳中 ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: 'View previous file',
|
||||||
|
next: 'View next file',
|
||||||
|
toggleheader: 'Toggle header',
|
||||||
|
fullscreen: 'Toggle full screen',
|
||||||
|
borderless: 'Toggle borderless mode',
|
||||||
|
close: 'Close detailed preview'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*!
|
||||||
|
* FileInput Chinese Translations
|
||||||
|
*
|
||||||
|
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||||
|
* any HTML markup tags in the messages must not be converted or translated.
|
||||||
|
*
|
||||||
|
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||||
|
* @author kangqf <kangqingfei@gmail.com>
|
||||||
|
*
|
||||||
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputLocales['zh'] = {
|
||||||
|
fileSingle: '文件',
|
||||||
|
filePlural: '个文件',
|
||||||
|
browseLabel: '选择 …',
|
||||||
|
removeLabel: '移除',
|
||||||
|
removeTitle: '清除选中文件',
|
||||||
|
cancelLabel: '取消',
|
||||||
|
cancelTitle: '取消进行中的上传',
|
||||||
|
uploadLabel: '上传',
|
||||||
|
uploadTitle: '上传选中文件',
|
||||||
|
msgNo: '没有',
|
||||||
|
msgNoFilesSelected: '',
|
||||||
|
msgCancelled: '取消',
|
||||||
|
msgPlaceholder: 'Select {files}...',
|
||||||
|
msgZoomModalHeading: '详细预览',
|
||||||
|
msgFileRequired: '必须选择一个文件上传.',
|
||||||
|
msgSizeTooSmall: '文件 "{name}" (<b>{size} KB</b>) 必须大于限定大小 <b>{minSize} KB</b>.',
|
||||||
|
msgSizeTooLarge: '文件 "{name}" (<b>{size} KB</b>) 超过了允许大小 <b>{maxSize} KB</b>.',
|
||||||
|
msgFilesTooLess: '你必须选择最少 <b>{n}</b> {files} 来上传. ',
|
||||||
|
msgFilesTooMany: '选择的上传文件个数 <b>({n})</b> 超出最大文件的限制个数 <b>{m}</b>.',
|
||||||
|
msgFileNotFound: '文件 "{name}" 未找到!',
|
||||||
|
msgFileSecured: '安全限制,为了防止读取文件 "{name}".',
|
||||||
|
msgFileNotReadable: '文件 "{name}" 不可读.',
|
||||||
|
msgFilePreviewAborted: '取消 "{name}" 的预览.',
|
||||||
|
msgFilePreviewError: '读取 "{name}" 时出现了一个错误.',
|
||||||
|
msgInvalidFileName: '文件名 "{name}" 包含非法字符.',
|
||||||
|
msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',
|
||||||
|
msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',
|
||||||
|
msgFileTypes: {
|
||||||
|
'image': 'image',
|
||||||
|
'html': 'HTML',
|
||||||
|
'text': 'text',
|
||||||
|
'video': 'video',
|
||||||
|
'audio': 'audio',
|
||||||
|
'flash': 'flash',
|
||||||
|
'pdf': 'PDF',
|
||||||
|
'object': 'object'
|
||||||
|
},
|
||||||
|
msgUploadAborted: '该文件上传被中止',
|
||||||
|
msgUploadThreshold: '处理中...',
|
||||||
|
msgUploadBegin: '正在初始化...',
|
||||||
|
msgUploadEnd: '完成',
|
||||||
|
msgUploadEmpty: '无效的文件上传.',
|
||||||
|
msgUploadError: 'Error',
|
||||||
|
msgValidationError: '验证错误',
|
||||||
|
msgLoading: '加载第 {index} 文件 共 {files} …',
|
||||||
|
msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',
|
||||||
|
msgSelected: '{n} {files} 选中',
|
||||||
|
msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',
|
||||||
|
msgImageWidthSmall: '图像文件的"{name}"的宽度必须是至少{size}像素.',
|
||||||
|
msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.',
|
||||||
|
msgImageWidthLarge: '图像文件"{name}"的宽度不能超过{size}像素.',
|
||||||
|
msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.',
|
||||||
|
msgImageResizeError: '无法获取的图像尺寸调整。',
|
||||||
|
msgImageResizeException: '调整图像大小时发生错误。<pre>{errors}</pre>',
|
||||||
|
msgAjaxError: '{operation} 发生错误. 请重试!',
|
||||||
|
msgAjaxProgressError: '{operation} 失败',
|
||||||
|
ajaxOperations: {
|
||||||
|
deleteThumb: '删除文件',
|
||||||
|
uploadThumb: '上传文件',
|
||||||
|
uploadBatch: '批量上传',
|
||||||
|
uploadExtra: '表单数据上传'
|
||||||
|
},
|
||||||
|
dropZoneTitle: '拖拽文件到这里 …<br>支持多文件同时上传',
|
||||||
|
dropZoneClickTitle: '<br>(或点击{files}按钮选择文件)',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeTitle: '删除文件',
|
||||||
|
uploadTitle: '上传文件',
|
||||||
|
uploadRetryTitle: 'Retry upload',
|
||||||
|
zoomTitle: '查看详情',
|
||||||
|
dragTitle: '移动 / 重置',
|
||||||
|
indicatorNewTitle: '没有上传',
|
||||||
|
indicatorSuccessTitle: '上传',
|
||||||
|
indicatorErrorTitle: '上传错误',
|
||||||
|
indicatorLoadingTitle: '上传 ...'
|
||||||
|
},
|
||||||
|
previewZoomButtonTitles: {
|
||||||
|
prev: '预览上一个文件',
|
||||||
|
next: '预览下一个文件',
|
||||||
|
toggleheader: '缩放',
|
||||||
|
fullscreen: '全屏',
|
||||||
|
borderless: '无边界模式',
|
||||||
|
close: '关闭当前预览'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,812 @@
|
||||||
|
;(function(factory) {
|
||||||
|
'use strict';
|
||||||
|
/* global window: false, define: false, module: false */
|
||||||
|
var root = typeof window === 'undefined' ? null : window;
|
||||||
|
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(function(){ return factory(root); });
|
||||||
|
} else if (typeof module !== 'undefined') {
|
||||||
|
module.exports = factory(root);
|
||||||
|
} else {
|
||||||
|
root.DOMPurify = factory(root);
|
||||||
|
}
|
||||||
|
}(function factory(window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var DOMPurify = function(window) {
|
||||||
|
return factory(window);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version label, exposed for easier checks
|
||||||
|
* if DOMPurify is up to date or not
|
||||||
|
*/
|
||||||
|
DOMPurify.version = '0.7.4';
|
||||||
|
|
||||||
|
if (!window || !window.document || window.document.nodeType !== 9) {
|
||||||
|
// not running in a browser, provide a factory function
|
||||||
|
// so that you can pass your own Window
|
||||||
|
DOMPurify.isSupported = false;
|
||||||
|
return DOMPurify;
|
||||||
|
}
|
||||||
|
|
||||||
|
var document = window.document;
|
||||||
|
var originalDocument = document;
|
||||||
|
var DocumentFragment = window.DocumentFragment;
|
||||||
|
var HTMLTemplateElement = window.HTMLTemplateElement;
|
||||||
|
var NodeFilter = window.NodeFilter;
|
||||||
|
var NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap;
|
||||||
|
var Text = window.Text;
|
||||||
|
var Comment = window.Comment;
|
||||||
|
var DOMParser = window.DOMParser;
|
||||||
|
|
||||||
|
// As per issue #47, the web-components registry is inherited by a
|
||||||
|
// new document created via createHTMLDocument. As per the spec
|
||||||
|
// (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
|
||||||
|
// a new empty registry is used when creating a template contents owner
|
||||||
|
// document, so we use that as our parent document to ensure nothing
|
||||||
|
// is inherited.
|
||||||
|
if (typeof HTMLTemplateElement === 'function') {
|
||||||
|
var template = document.createElement('template');
|
||||||
|
if (template.content && template.content.ownerDocument) {
|
||||||
|
document = template.content.ownerDocument;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var implementation = document.implementation;
|
||||||
|
var createNodeIterator = document.createNodeIterator;
|
||||||
|
var getElementsByTagName = document.getElementsByTagName;
|
||||||
|
var createDocumentFragment = document.createDocumentFragment;
|
||||||
|
var importNode = originalDocument.importNode;
|
||||||
|
|
||||||
|
var hooks = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose whether this browser supports running the full DOMPurify.
|
||||||
|
*/
|
||||||
|
DOMPurify.isSupported =
|
||||||
|
typeof implementation.createHTMLDocument !== 'undefined' &&
|
||||||
|
document.documentMode !== 9;
|
||||||
|
|
||||||
|
/* Add properties to a lookup table */
|
||||||
|
var _addToSet = function(set, array) {
|
||||||
|
var l = array.length;
|
||||||
|
while (l--) {
|
||||||
|
if (typeof array[l] === 'string') {
|
||||||
|
array[l] = array[l].toLowerCase();
|
||||||
|
}
|
||||||
|
set[array[l]] = true;
|
||||||
|
}
|
||||||
|
return set;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Shallow clone an object */
|
||||||
|
var _cloneObj = function(object) {
|
||||||
|
var newObject = {};
|
||||||
|
var property;
|
||||||
|
for (property in object) {
|
||||||
|
if (object.hasOwnProperty(property)) {
|
||||||
|
newObject[property] = object[property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We consider the elements and attributes below to be safe. Ideally
|
||||||
|
* don't add any new ones but feel free to remove unwanted ones.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* allowed element names */
|
||||||
|
var ALLOWED_TAGS = null;
|
||||||
|
var DEFAULT_ALLOWED_TAGS = _addToSet({}, [
|
||||||
|
|
||||||
|
// HTML
|
||||||
|
'a','abbr','acronym','address','area','article','aside','audio','b',
|
||||||
|
'bdi','bdo','big','blink','blockquote','body','br','button','canvas',
|
||||||
|
'caption','center','cite','code','col','colgroup','content','data',
|
||||||
|
'datalist','dd','decorator','del','details','dfn','dir','div','dl','dt',
|
||||||
|
'element','em','fieldset','figcaption','figure','font','footer','form',
|
||||||
|
'h1','h2','h3','h4','h5','h6','head','header','hgroup','hr','html','i',
|
||||||
|
'img','input','ins','kbd','label','legend','li','main','map','mark',
|
||||||
|
'marquee','menu','menuitem','meter','nav','nobr','ol','optgroup',
|
||||||
|
'option','output','p','pre','progress','q','rp','rt','ruby','s','samp',
|
||||||
|
'section','select','shadow','small','source','spacer','span','strike',
|
||||||
|
'strong','style','sub','summary','sup','table','tbody','td','template',
|
||||||
|
'textarea','tfoot','th','thead','time','tr','track','tt','u','ul','var',
|
||||||
|
'video','wbr',
|
||||||
|
|
||||||
|
// SVG
|
||||||
|
'svg','altglyph','altglyphdef','altglyphitem','animatecolor',
|
||||||
|
'animatemotion','animatetransform','circle','clippath','defs','desc',
|
||||||
|
'ellipse','filter','font','g','glyph','glyphref','hkern','image','line',
|
||||||
|
'lineargradient','marker','mask','metadata','mpath','path','pattern',
|
||||||
|
'polygon','polyline','radialgradient','rect','stop','switch','symbol',
|
||||||
|
'text','textpath','title','tref','tspan','view','vkern',
|
||||||
|
|
||||||
|
// SVG Filters
|
||||||
|
'feBlend','feColorMatrix','feComponentTransfer','feComposite',
|
||||||
|
'feConvolveMatrix','feDiffuseLighting','feDisplacementMap',
|
||||||
|
'feFlood','feFuncA','feFuncB','feFuncG','feFuncR','feGaussianBlur',
|
||||||
|
'feMerge','feMergeNode','feMorphology','feOffset',
|
||||||
|
'feSpecularLighting','feTile','feTurbulence',
|
||||||
|
|
||||||
|
//MathML
|
||||||
|
'math','menclose','merror','mfenced','mfrac','mglyph','mi','mlabeledtr',
|
||||||
|
'mmuliscripts','mn','mo','mover','mpadded','mphantom','mroot','mrow',
|
||||||
|
'ms','mpspace','msqrt','mystyle','msub','msup','msubsup','mtable','mtd',
|
||||||
|
'mtext','mtr','munder','munderover',
|
||||||
|
|
||||||
|
//Text
|
||||||
|
'#text'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/* Allowed attribute names */
|
||||||
|
var ALLOWED_ATTR = null;
|
||||||
|
var DEFAULT_ALLOWED_ATTR = _addToSet({}, [
|
||||||
|
|
||||||
|
// HTML
|
||||||
|
'accept','action','align','alt','autocomplete','background','bgcolor',
|
||||||
|
'border','cellpadding','cellspacing','checked','cite','class','clear','color',
|
||||||
|
'cols','colspan','coords','datetime','default','dir','disabled',
|
||||||
|
'download','enctype','face','for','headers','height','hidden','high','href',
|
||||||
|
'hreflang','id','ismap','label','lang','list','loop', 'low','max',
|
||||||
|
'maxlength','media','method','min','multiple','name','noshade','novalidate',
|
||||||
|
'nowrap','open','optimum','pattern','placeholder','poster','preload','pubdate',
|
||||||
|
'radiogroup','readonly','rel','required','rev','reversed','rows',
|
||||||
|
'rowspan','spellcheck','scope','selected','shape','size','span',
|
||||||
|
'srclang','start','src','step','style','summary','tabindex','title',
|
||||||
|
'type','usemap','valign','value','width','xmlns',
|
||||||
|
|
||||||
|
// SVG
|
||||||
|
'accent-height','accumulate','additivive','alignment-baseline',
|
||||||
|
'ascent','attributename','attributetype','azimuth','basefrequency',
|
||||||
|
'baseline-shift','begin','bias','by','clip','clip-path','clip-rule',
|
||||||
|
'color','color-interpolation','color-interpolation-filters','color-profile',
|
||||||
|
'color-rendering','cx','cy','d','dx','dy','diffuseconstant','direction',
|
||||||
|
'display','divisor','dur','edgemode','elevation','end','fill','fill-opacity',
|
||||||
|
'fill-rule','filter','flood-color','flood-opacity','font-family','font-size',
|
||||||
|
'font-size-adjust','font-stretch','font-style','font-variant','font-weight',
|
||||||
|
'fx', 'fy','g1','g2','glyph-name','glyphref','gradientunits','gradienttransform',
|
||||||
|
'image-rendering','in','in2','k','k1','k2','k3','k4','kerning','keypoints',
|
||||||
|
'keysplines','keytimes','lengthadjust','letter-spacing','kernelmatrix',
|
||||||
|
'kernelunitlength','lighting-color','local','marker-end','marker-mid',
|
||||||
|
'marker-start','markerheight','markerunits','markerwidth','maskcontentunits',
|
||||||
|
'maskunits','max','mask','mode','min','numoctaves','offset','operator',
|
||||||
|
'opacity','order','orient','orientation','origin','overflow','paint-order',
|
||||||
|
'path','pathlength','patterncontentunits','patterntransform','patternunits',
|
||||||
|
'points','preservealpha','r','rx','ry','radius','refx','refy','repeatcount',
|
||||||
|
'repeatdur','restart','result','rotate','scale','seed','shape-rendering',
|
||||||
|
'specularconstant','specularexponent','spreadmethod','stddeviation','stitchtiles',
|
||||||
|
'stop-color','stop-opacity','stroke-dasharray','stroke-dashoffset','stroke-linecap',
|
||||||
|
'stroke-linejoin','stroke-miterlimit','stroke-opacity','stroke','stroke-width',
|
||||||
|
'surfacescale','targetx','targety','transform','text-anchor','text-decoration',
|
||||||
|
'text-rendering','textlength','u1','u2','unicode','values','viewbox',
|
||||||
|
'visibility','vert-adv-y','vert-origin-x','vert-origin-y','word-spacing',
|
||||||
|
'wrap','writing-mode','xchannelselector','ychannelselector','x','x1','x2',
|
||||||
|
'y','y1','y2','z','zoomandpan',
|
||||||
|
|
||||||
|
// MathML
|
||||||
|
'accent','accentunder','bevelled','close','columnsalign','columnlines',
|
||||||
|
'columnspan','denomalign','depth','display','displaystyle','fence',
|
||||||
|
'frame','largeop','length','linethickness','lspace','lquote',
|
||||||
|
'mathbackground','mathcolor','mathsize','mathvariant','maxsize',
|
||||||
|
'minsize','movablelimits','notation','numalign','open','rowalign',
|
||||||
|
'rowlines','rowspacing','rowspan','rspace','rquote','scriptlevel',
|
||||||
|
'scriptminsize','scriptsizemultiplier','selection','separator',
|
||||||
|
'separators','stretchy','subscriptshift','supscriptshift','symmetric',
|
||||||
|
'voffset',
|
||||||
|
|
||||||
|
// XML
|
||||||
|
'xlink:href','xml:id','xlink:title','xml:space','xmlns:xlink'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
|
||||||
|
var FORBID_TAGS = null;
|
||||||
|
|
||||||
|
/* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
|
||||||
|
var FORBID_ATTR = null;
|
||||||
|
|
||||||
|
/* Decide if custom data attributes are okay */
|
||||||
|
var ALLOW_DATA_ATTR = true;
|
||||||
|
|
||||||
|
/* Decide if unknown protocols are okay */
|
||||||
|
var ALLOW_UNKNOWN_PROTOCOLS = false;
|
||||||
|
|
||||||
|
/* Output should be safe for jQuery's $() factory? */
|
||||||
|
var SAFE_FOR_JQUERY = false;
|
||||||
|
|
||||||
|
/* Output should be safe for common template engines.
|
||||||
|
* This means, DOMPurify removes data attributes, mustaches and ERB
|
||||||
|
*/
|
||||||
|
var SAFE_FOR_TEMPLATES = false;
|
||||||
|
|
||||||
|
/* Specify template detection regex for SAFE_FOR_TEMPLATES mode */
|
||||||
|
var MUSTACHE_EXPR = /\{\{[\s\S]*|[\s\S]*\}\}/gm;
|
||||||
|
var ERB_EXPR = /<%[\s\S]*|[\s\S]*%>/gm;
|
||||||
|
|
||||||
|
/* Decide if document with <html>... should be returned */
|
||||||
|
var WHOLE_DOCUMENT = false;
|
||||||
|
|
||||||
|
/* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html string.
|
||||||
|
* If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
|
||||||
|
*/
|
||||||
|
var RETURN_DOM = false;
|
||||||
|
|
||||||
|
/* Decide if a DOM `DocumentFragment` should be returned, instead of a html string */
|
||||||
|
var RETURN_DOM_FRAGMENT = false;
|
||||||
|
|
||||||
|
/* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM
|
||||||
|
* `Node` is imported into the current `Document`. If this flag is not enabled the
|
||||||
|
* `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by
|
||||||
|
* DOMPurify. */
|
||||||
|
var RETURN_DOM_IMPORT = false;
|
||||||
|
|
||||||
|
/* Output should be free from DOM clobbering attacks? */
|
||||||
|
var SANITIZE_DOM = true;
|
||||||
|
|
||||||
|
/* Keep element content when removing element? */
|
||||||
|
var KEEP_CONTENT = true;
|
||||||
|
|
||||||
|
/* Tags to ignore content of when KEEP_CONTENT is true */
|
||||||
|
var FORBID_CONTENTS = _addToSet({}, [
|
||||||
|
'audio', 'head', 'math', 'script', 'style', 'svg', 'video'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/* Tags that are safe for data: URIs */
|
||||||
|
var DATA_URI_TAGS = _addToSet({}, [
|
||||||
|
'audio', 'video', 'img', 'source'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/* Attributes safe for values like "javascript:" */
|
||||||
|
var URI_SAFE_ATTRIBUTES = _addToSet({}, [
|
||||||
|
'alt','class','for','id','label','name','pattern','placeholder',
|
||||||
|
'summary','title','value','style','xmlns'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/* Keep a reference to config to pass to hooks */
|
||||||
|
var CONFIG = null;
|
||||||
|
|
||||||
|
/* Ideally, do not touch anything below this line */
|
||||||
|
/* ______________________________________________ */
|
||||||
|
|
||||||
|
var formElement = document.createElement('form');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _parseConfig
|
||||||
|
*
|
||||||
|
* @param optional config literal
|
||||||
|
*/
|
||||||
|
var _parseConfig = function(cfg) {
|
||||||
|
/* Shield configuration object from tampering */
|
||||||
|
if (typeof cfg !== 'object') {
|
||||||
|
cfg = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set configuration parameters */
|
||||||
|
ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ?
|
||||||
|
_addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;
|
||||||
|
ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ?
|
||||||
|
_addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;
|
||||||
|
FORBID_TAGS = 'FORBID_TAGS' in cfg ?
|
||||||
|
_addToSet({}, cfg.FORBID_TAGS) : {};
|
||||||
|
FORBID_ATTR = 'FORBID_ATTR' in cfg ?
|
||||||
|
_addToSet({}, cfg.FORBID_ATTR) : {};
|
||||||
|
ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
|
||||||
|
ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
|
||||||
|
SAFE_FOR_JQUERY = cfg.SAFE_FOR_JQUERY || false; // Default false
|
||||||
|
SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
|
||||||
|
WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
|
||||||
|
RETURN_DOM = cfg.RETURN_DOM || false; // Default false
|
||||||
|
RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
|
||||||
|
RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT || false; // Default false
|
||||||
|
SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
|
||||||
|
KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
|
||||||
|
|
||||||
|
if (SAFE_FOR_TEMPLATES) {
|
||||||
|
ALLOW_DATA_ATTR = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RETURN_DOM_FRAGMENT) {
|
||||||
|
RETURN_DOM = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Merge configuration parameters */
|
||||||
|
if (cfg.ADD_TAGS) {
|
||||||
|
if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
|
||||||
|
ALLOWED_TAGS = _cloneObj(ALLOWED_TAGS);
|
||||||
|
}
|
||||||
|
_addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);
|
||||||
|
}
|
||||||
|
if (cfg.ADD_ATTR) {
|
||||||
|
if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
|
||||||
|
ALLOWED_ATTR = _cloneObj(ALLOWED_ATTR);
|
||||||
|
}
|
||||||
|
_addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add #text in case KEEP_CONTENT is set to true */
|
||||||
|
if (KEEP_CONTENT) { ALLOWED_TAGS['#text'] = true; }
|
||||||
|
|
||||||
|
// Prevent further manipulation of configuration.
|
||||||
|
// Not available in IE8, Safari 5, etc.
|
||||||
|
if (Object && 'freeze' in Object) { Object.freeze(cfg); }
|
||||||
|
|
||||||
|
CONFIG = cfg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _forceRemove
|
||||||
|
*
|
||||||
|
* @param a DOM node
|
||||||
|
*/
|
||||||
|
var _forceRemove = function(node) {
|
||||||
|
try {
|
||||||
|
node.parentNode.removeChild(node);
|
||||||
|
} catch (e) {
|
||||||
|
node.outerHTML = '';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _initDocument
|
||||||
|
*
|
||||||
|
* @param a string of dirty markup
|
||||||
|
* @return a DOM, filled with the dirty markup
|
||||||
|
*/
|
||||||
|
var _initDocument = function(dirty) {
|
||||||
|
/* Create a HTML document using DOMParser */
|
||||||
|
var doc, body;
|
||||||
|
try {
|
||||||
|
doc = new DOMParser().parseFromString(dirty, 'text/html');
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
/* Some browsers throw, some browsers return null for the code above
|
||||||
|
DOMParser with text/html support is only in very recent browsers. */
|
||||||
|
if (!doc) {
|
||||||
|
doc = implementation.createHTMLDocument('');
|
||||||
|
body = doc.body;
|
||||||
|
body.parentNode.removeChild(body.parentNode.firstElementChild);
|
||||||
|
body.outerHTML = dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Work on whole document or just its body */
|
||||||
|
if (typeof doc.getElementsByTagName === 'function') {
|
||||||
|
return doc.getElementsByTagName(
|
||||||
|
WHOLE_DOCUMENT ? 'html' : 'body')[0];
|
||||||
|
}
|
||||||
|
return getElementsByTagName.call(doc,
|
||||||
|
WHOLE_DOCUMENT ? 'html' : 'body')[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _createIterator
|
||||||
|
*
|
||||||
|
* @param document/fragment to create iterator for
|
||||||
|
* @return iterator instance
|
||||||
|
*/
|
||||||
|
var _createIterator = function(root) {
|
||||||
|
return createNodeIterator.call(root.ownerDocument || root,
|
||||||
|
root,
|
||||||
|
NodeFilter.SHOW_ELEMENT
|
||||||
|
| NodeFilter.SHOW_COMMENT
|
||||||
|
| NodeFilter.SHOW_TEXT,
|
||||||
|
function() { return NodeFilter.FILTER_ACCEPT; },
|
||||||
|
false
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _isClobbered
|
||||||
|
*
|
||||||
|
* @param element to check for clobbering attacks
|
||||||
|
* @return true if clobbered, false if safe
|
||||||
|
*/
|
||||||
|
var _isClobbered = function(elm) {
|
||||||
|
if (elm instanceof Text || elm instanceof Comment) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( typeof elm.nodeName !== 'string'
|
||||||
|
|| typeof elm.textContent !== 'string'
|
||||||
|
|| typeof elm.removeChild !== 'function'
|
||||||
|
|| !(elm.attributes instanceof NamedNodeMap)
|
||||||
|
|| typeof elm.removeAttribute !== 'function'
|
||||||
|
|| typeof elm.setAttribute !== 'function'
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _sanitizeElements
|
||||||
|
*
|
||||||
|
* @protect nodeName
|
||||||
|
* @protect textContent
|
||||||
|
* @protect removeChild
|
||||||
|
*
|
||||||
|
* @param node to check for permission to exist
|
||||||
|
* @return true if node was killed, false if left alive
|
||||||
|
*/
|
||||||
|
var _sanitizeElements = function(currentNode) {
|
||||||
|
var tagName, content;
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('beforeSanitizeElements', currentNode, null);
|
||||||
|
|
||||||
|
/* Check if element is clobbered or can clobber */
|
||||||
|
if (_isClobbered(currentNode)) {
|
||||||
|
_forceRemove(currentNode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now let's check the element's type and name */
|
||||||
|
tagName = currentNode.nodeName.toLowerCase();
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('uponSanitizeElement', currentNode, {
|
||||||
|
tagName: tagName
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Remove element if anything forbids its presence */
|
||||||
|
if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
|
||||||
|
/* Keep content except for black-listed elements */
|
||||||
|
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]
|
||||||
|
&& typeof currentNode.insertAdjacentHTML === 'function') {
|
||||||
|
try {
|
||||||
|
currentNode.insertAdjacentHTML('AfterEnd', currentNode.innerHTML);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
_forceRemove(currentNode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert markup to cover jQuery behavior */
|
||||||
|
if (SAFE_FOR_JQUERY && !currentNode.firstElementChild &&
|
||||||
|
(!currentNode.content || !currentNode.content.firstElementChild)) {
|
||||||
|
currentNode.innerHTML = currentNode.textContent.replace(/</g, '<');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanitize element content to be template-safe */
|
||||||
|
if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
|
||||||
|
/* Get the element's text content */
|
||||||
|
content = currentNode.textContent;
|
||||||
|
content = content.replace(MUSTACHE_EXPR, ' ');
|
||||||
|
content = content.replace(ERB_EXPR, ' ');
|
||||||
|
currentNode.textContent = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('afterSanitizeElements', currentNode, null);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
var DATA_ATTR = /^data-[\w.\u00B7-\uFFFF-]/;
|
||||||
|
var IS_ALLOWED_URI = /^(?:(?:(?:f|ht)tps?|mailto|tel):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;
|
||||||
|
var IS_SCRIPT_OR_DATA = /^(?:\w+script|data):/i;
|
||||||
|
/* This needs to be extensive thanks to Webkit/Blink's behavior */
|
||||||
|
var ATTR_WHITESPACE = /[\x00-\x20\xA0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _sanitizeAttributes
|
||||||
|
*
|
||||||
|
* @protect attributes
|
||||||
|
* @protect nodeName
|
||||||
|
* @protect removeAttribute
|
||||||
|
* @protect setAttribute
|
||||||
|
*
|
||||||
|
* @param node to sanitize
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
var _sanitizeAttributes = function(currentNode) {
|
||||||
|
var attr, name, value, lcName, idAttr, attributes, hookEvent, l;
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('beforeSanitizeAttributes', currentNode, null);
|
||||||
|
|
||||||
|
attributes = currentNode.attributes;
|
||||||
|
|
||||||
|
/* Check if we have attributes; if not we might have a text node */
|
||||||
|
if (!attributes) { return; }
|
||||||
|
|
||||||
|
hookEvent = {
|
||||||
|
attrName: '',
|
||||||
|
attrValue: '',
|
||||||
|
keepAttr: true
|
||||||
|
};
|
||||||
|
l = attributes.length;
|
||||||
|
|
||||||
|
/* Go backwards over all attributes; safely remove bad ones */
|
||||||
|
while (l--) {
|
||||||
|
attr = attributes[l];
|
||||||
|
name = attr.name;
|
||||||
|
value = attr.value;
|
||||||
|
lcName = name.toLowerCase();
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
hookEvent.attrName = lcName;
|
||||||
|
hookEvent.attrValue = value;
|
||||||
|
hookEvent.keepAttr = true;
|
||||||
|
_executeHook('uponSanitizeAttribute', currentNode, hookEvent );
|
||||||
|
value = hookEvent.attrValue;
|
||||||
|
|
||||||
|
/* Remove attribute */
|
||||||
|
// Safari (iOS + Mac), last tested v8.0.5, crashes if you try to
|
||||||
|
// remove a "name" attribute from an <img> tag that has an "id"
|
||||||
|
// attribute at the time.
|
||||||
|
if (lcName === 'name' &&
|
||||||
|
currentNode.nodeName === 'IMG' && attributes.id) {
|
||||||
|
idAttr = attributes.id;
|
||||||
|
attributes = Array.prototype.slice.apply(attributes);
|
||||||
|
currentNode.removeAttribute('id');
|
||||||
|
currentNode.removeAttribute(name);
|
||||||
|
if (attributes.indexOf(idAttr) > l) {
|
||||||
|
currentNode.setAttribute('id', idAttr.value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This avoids a crash in Safari v9.0 with double-ids.
|
||||||
|
// The trick is to first set the id to be empty and then to
|
||||||
|
// remove the attriubute
|
||||||
|
if (name === 'id') {
|
||||||
|
currentNode.setAttribute(name, '');
|
||||||
|
}
|
||||||
|
currentNode.removeAttribute(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Did the hooks approve of the attribute? */
|
||||||
|
if (!hookEvent.keepAttr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure attribute cannot clobber */
|
||||||
|
if (SANITIZE_DOM &&
|
||||||
|
(lcName === 'id' || lcName === 'name') &&
|
||||||
|
(value in window || value in document || value in formElement)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanitize attribute content to be template-safe */
|
||||||
|
if (SAFE_FOR_TEMPLATES) {
|
||||||
|
value = value.replace(MUSTACHE_EXPR, ' ');
|
||||||
|
value = value.replace(ERB_EXPR, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
/* Check the name is permitted */
|
||||||
|
(ALLOWED_ATTR[lcName] && !FORBID_ATTR[lcName] && (
|
||||||
|
/* Check no script, data or unknown possibly unsafe URI
|
||||||
|
unless we know URI values are safe for that attribute */
|
||||||
|
URI_SAFE_ATTRIBUTES[lcName] ||
|
||||||
|
IS_ALLOWED_URI.test(value.replace(ATTR_WHITESPACE,'')) ||
|
||||||
|
/* Keep image data URIs alive if src is allowed */
|
||||||
|
(lcName === 'src' && value.indexOf('data:') === 0 &&
|
||||||
|
DATA_URI_TAGS[currentNode.nodeName.toLowerCase()])
|
||||||
|
)) ||
|
||||||
|
/* Allow potentially valid data-* attributes:
|
||||||
|
* At least one character after "-" (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
|
||||||
|
* XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
|
||||||
|
* We don't need to check the value; it's always URI safe.
|
||||||
|
*/
|
||||||
|
(ALLOW_DATA_ATTR && DATA_ATTR.test(lcName)) ||
|
||||||
|
/* Allow unknown protocols:
|
||||||
|
* This provides support for links that are handled by protocol handlers which may be unknown
|
||||||
|
* ahead of time, e.g. fb:, spotify:
|
||||||
|
*/
|
||||||
|
(ALLOW_UNKNOWN_PROTOCOLS && !IS_SCRIPT_OR_DATA.test(value.replace(ATTR_WHITESPACE,'')))
|
||||||
|
) {
|
||||||
|
/* Handle invalid data-* attribute set by try-catching it */
|
||||||
|
try {
|
||||||
|
currentNode.setAttribute(name, value);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('afterSanitizeAttributes', currentNode, null);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _sanitizeShadowDOM
|
||||||
|
*
|
||||||
|
* @param fragment to iterate over recursively
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
var _sanitizeShadowDOM = function(fragment) {
|
||||||
|
var shadowNode;
|
||||||
|
var shadowIterator = _createIterator(fragment);
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('beforeSanitizeShadowDOM', fragment, null);
|
||||||
|
|
||||||
|
while ( (shadowNode = shadowIterator.nextNode()) ) {
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('uponSanitizeShadowNode', shadowNode, null);
|
||||||
|
|
||||||
|
/* Sanitize tags and elements */
|
||||||
|
if (_sanitizeElements(shadowNode)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deep shadow DOM detected */
|
||||||
|
if (shadowNode.content instanceof DocumentFragment) {
|
||||||
|
_sanitizeShadowDOM(shadowNode.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check attributes, sanitize if necessary */
|
||||||
|
_sanitizeAttributes(shadowNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute a hook if present */
|
||||||
|
_executeHook('afterSanitizeShadowDOM', fragment, null);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _executeHook
|
||||||
|
* Execute user configurable hooks
|
||||||
|
*
|
||||||
|
* @param {String} entryPoint Name of the hook's entry point
|
||||||
|
* @param {Node} currentNode
|
||||||
|
*/
|
||||||
|
var _executeHook = function(entryPoint, currentNode, data) {
|
||||||
|
if (!hooks[entryPoint]) { return; }
|
||||||
|
|
||||||
|
hooks[entryPoint].forEach(function(hook) {
|
||||||
|
hook.call(DOMPurify, currentNode, data, CONFIG);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sanitize
|
||||||
|
* Public method providing core sanitation functionality
|
||||||
|
*
|
||||||
|
* @param {String} dirty string
|
||||||
|
* @param {Object} configuration object
|
||||||
|
*/
|
||||||
|
DOMPurify.sanitize = function(dirty, cfg) {
|
||||||
|
var body, currentNode, oldNode, nodeIterator, returnNode;
|
||||||
|
/* Make sure we have a string to sanitize.
|
||||||
|
DO NOT return early, as this will return the wrong type if
|
||||||
|
the user has requested a DOM object rather than a string */
|
||||||
|
if (!dirty) {
|
||||||
|
dirty = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stringify, in case dirty is an object */
|
||||||
|
if (typeof dirty !== 'string') {
|
||||||
|
if (typeof dirty.toString !== 'function') {
|
||||||
|
throw new TypeError('toString is not a function');
|
||||||
|
} else {
|
||||||
|
dirty = dirty.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check we can run. Otherwise fall back or ignore */
|
||||||
|
if (!DOMPurify.isSupported) {
|
||||||
|
if (typeof window.toStaticHTML === 'object'
|
||||||
|
|| typeof window.toStaticHTML === 'function') {
|
||||||
|
return window.toStaticHTML(dirty);
|
||||||
|
}
|
||||||
|
return dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Assign config vars */
|
||||||
|
_parseConfig(cfg);
|
||||||
|
|
||||||
|
/* Exit directly if we have nothing to do */
|
||||||
|
if (!RETURN_DOM && !WHOLE_DOCUMENT && dirty.indexOf('<') === -1) {
|
||||||
|
return dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the document to work on */
|
||||||
|
body = _initDocument(dirty);
|
||||||
|
|
||||||
|
/* Check we have a DOM node from the data */
|
||||||
|
if (!body) {
|
||||||
|
return RETURN_DOM ? null : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get node iterator */
|
||||||
|
nodeIterator = _createIterator(body);
|
||||||
|
|
||||||
|
/* Now start iterating over the created document */
|
||||||
|
while ( (currentNode = nodeIterator.nextNode()) ) {
|
||||||
|
|
||||||
|
/* Fix IE's strange behavior with manipulated textNodes #89 */
|
||||||
|
if (currentNode.nodeType === 3 && currentNode === oldNode) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanitize tags and elements */
|
||||||
|
if (_sanitizeElements(currentNode)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shadow DOM detected, sanitize it */
|
||||||
|
if (currentNode.content instanceof DocumentFragment) {
|
||||||
|
_sanitizeShadowDOM(currentNode.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check attributes, sanitize if necessary */
|
||||||
|
_sanitizeAttributes(currentNode);
|
||||||
|
|
||||||
|
oldNode = currentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return sanitized string or DOM */
|
||||||
|
if (RETURN_DOM) {
|
||||||
|
|
||||||
|
if (RETURN_DOM_FRAGMENT) {
|
||||||
|
returnNode = createDocumentFragment.call(body.ownerDocument);
|
||||||
|
|
||||||
|
while (body.firstChild) {
|
||||||
|
returnNode.appendChild(body.firstChild);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
returnNode = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RETURN_DOM_IMPORT) {
|
||||||
|
/* adoptNode() is not used because internal state is not reset
|
||||||
|
(e.g. the past names map of a HTMLFormElement), this is safe
|
||||||
|
in theory but we would rather not risk another attack vector.
|
||||||
|
The state that is cloned by importNode() is explicitly defined
|
||||||
|
by the specs. */
|
||||||
|
returnNode = importNode.call(originalDocument, returnNode, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* addHook
|
||||||
|
* Public method to add DOMPurify hooks
|
||||||
|
*
|
||||||
|
* @param {String} entryPoint
|
||||||
|
* @param {Function} hookFunction
|
||||||
|
*/
|
||||||
|
DOMPurify.addHook = function(entryPoint, hookFunction) {
|
||||||
|
if (typeof hookFunction !== 'function') { return; }
|
||||||
|
hooks[entryPoint] = hooks[entryPoint] || [];
|
||||||
|
hooks[entryPoint].push(hookFunction);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* removeHook
|
||||||
|
* Public method to remove a DOMPurify hook at a given entryPoint
|
||||||
|
* (pops it from the stack of hooks if more are present)
|
||||||
|
*
|
||||||
|
* @param {String} entryPoint
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
DOMPurify.removeHook = function(entryPoint) {
|
||||||
|
if (hooks[entryPoint]) {
|
||||||
|
hooks[entryPoint].pop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* removeHooks
|
||||||
|
* Public method to remove all DOMPurify hooks at a given entryPoint
|
||||||
|
*
|
||||||
|
* @param {String} entryPoint
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
DOMPurify.removeHooks = function(entryPoint) {
|
||||||
|
if (hooks[entryPoint]) {
|
||||||
|
hooks[entryPoint] = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* removeAllHooks
|
||||||
|
* Public method to remove all DOMPurify hooks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
DOMPurify.removeAllHooks = function() {
|
||||||
|
hooks = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
return DOMPurify;
|
||||||
|
}));
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,156 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer Font Awesome theme style for bootstrap-fileinput. Load this theme file after loading `fileinput.css`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
.theme-explorer-fa .file-upload-indicator, .theme-explorer-fa .file-drag-handle, .theme-explorer-fa .explorer-frame .kv-file-content, .theme-explorer-fa .file-actions, .explorer-frame .file-preview-other {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-thumb-progress .progress, .theme-explorer-fa .file-thumb-progress .progress-bar {
|
||||||
|
height: 13px;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-upload-indicator, .theme-explorer-fa .file-drag-handle {
|
||||||
|
position: absolute;
|
||||||
|
display: inline-block;
|
||||||
|
top: 0;
|
||||||
|
right: 3px;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-thumb-progress .progress, .theme-explorer-fa .explorer-caption {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .explorer-frame td {
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .explorer-frame .kv-file-content {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-actions-cell {
|
||||||
|
position: relative;
|
||||||
|
width: 120px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-thumb-progress .progress {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .explorer-caption {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .kvsortable-ghost {
|
||||||
|
opacity: 0.6;
|
||||||
|
background: #e1edf7;
|
||||||
|
border: 2px solid #a1abff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-preview .table {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-error-message ul {
|
||||||
|
padding: 5px 0 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-preview-text {
|
||||||
|
display: inline-block;
|
||||||
|
color: #428bca;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||||
|
outline: none;
|
||||||
|
padding: 8px;
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-preview-html {
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-other-icon {
|
||||||
|
font-size: 2.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 767px) {
|
||||||
|
.theme-explorer-fa .table, .theme-explorer-fa .table tbody, .theme-explorer-fa .table tr, .theme-explorer-fa .table td {
|
||||||
|
display: block;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table tr {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table tr:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table td {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table .kv-file-content {
|
||||||
|
border-bottom: none;
|
||||||
|
padding: 4px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .table .kv-file-content .file-preview-image {
|
||||||
|
max-width: 100%;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-details-cell {
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
padding-top: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .file-actions-cell {
|
||||||
|
border-top: none;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer-fa .explorer-frame .explorer-caption {
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*noinspection CssOverwrittenProperties*/
|
||||||
|
.file-zoom-dialog .explorer-frame .file-other-icon {
|
||||||
|
font-size: 22em;
|
||||||
|
font-size: 50vmin;
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer Font Awesome theme configuration for bootstrap-fileinput.
|
||||||
|
* Load this theme file after loading `fileinput.js`. Ensure that
|
||||||
|
* font awesome assets and CSS are loaded on the page as well.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
var teTagBef = '<tr class="file-preview-frame {frameClass}" id="{previewId}" data-fileindex="{fileindex}"' +
|
||||||
|
' data-template="{template}"', teContent = '<td class="kv-file-content">\n';
|
||||||
|
$.fn.fileinputThemes['explorer-fa'] = {
|
||||||
|
layoutTemplates: {
|
||||||
|
preview: '<div class="file-preview {class}">\n' +
|
||||||
|
' {close}' +
|
||||||
|
' <div class="{dropClass}">\n' +
|
||||||
|
' <table class="table table-bordered table-hover"><tbody class="file-preview-thumbnails">\n' +
|
||||||
|
' </tbody></table>\n' +
|
||||||
|
' <div class="clearfix"></div>' +
|
||||||
|
' <div class="file-preview-status text-center text-success"></div>\n' +
|
||||||
|
' <div class="kv-fileinput-error"></div>\n' +
|
||||||
|
' </div>\n' +
|
||||||
|
'</div>',
|
||||||
|
footer: '<td class="file-details-cell"><div class="explorer-caption" title="{caption}">{caption}</div> ' +
|
||||||
|
'{size}{progress}</td><td class="file-actions-cell">{indicator} {actions}</td>',
|
||||||
|
actions: '{drag}\n' +
|
||||||
|
'<div class="file-actions">\n' +
|
||||||
|
' <div class="file-footer-buttons">\n' +
|
||||||
|
' {upload} {download} {delete} {zoom} {other} ' +
|
||||||
|
' </div>\n' +
|
||||||
|
'</div>',
|
||||||
|
zoomCache: '<tr style="display:none" class="kv-zoom-cache-theme"><td>' +
|
||||||
|
'<table class="kv-zoom-cache">{zoomContent}</table></td></tr>',
|
||||||
|
fileIcon: '<i class="fa fa-file kv-caption-icon"></i> '
|
||||||
|
},
|
||||||
|
previewMarkupTags: {
|
||||||
|
tagBefore1: teTagBef + '>' + teContent,
|
||||||
|
tagBefore2: teTagBef + ' title="{caption}">' + teContent,
|
||||||
|
tagAfter: '</td>\n{footer}</tr>\n'
|
||||||
|
},
|
||||||
|
previewSettings: {
|
||||||
|
image: {height: "60px"},
|
||||||
|
html: {width: "100px", height: "60px"},
|
||||||
|
text: {width: "100px", height: "60px"},
|
||||||
|
video: {width: "auto", height: "60px"},
|
||||||
|
audio: {width: "auto", height: "60px"},
|
||||||
|
flash: {width: "100%", height: "60px"},
|
||||||
|
object: {width: "100%", height: "60px"},
|
||||||
|
pdf: {width: "100px", height: "60px"},
|
||||||
|
other: {width: "100%", height: "60px"}
|
||||||
|
},
|
||||||
|
frameClass: 'explorer-frame',
|
||||||
|
fileActionSettings: {
|
||||||
|
removeIcon: '<i class="fa fa-trash"></i>',
|
||||||
|
uploadIcon: '<i class="fa fa-upload"></i>',
|
||||||
|
uploadRetryIcon: '<i class="fa fa-repeat"></i>',
|
||||||
|
zoomIcon: '<i class="fa fa-search-plus"></i>',
|
||||||
|
dragIcon: '<i class="fa fa-arrows"></i>',
|
||||||
|
indicatorNew: '<i class="fa fa-plus-circle text-warning"></i>',
|
||||||
|
indicatorSuccess: '<i class="fa fa-check-circle text-success"></i>',
|
||||||
|
indicatorError: '<i class="fa fa-exclamation-circle text-danger"></i>',
|
||||||
|
indicatorLoading: '<i class="fa fa-hourglass text-muted"></i>'
|
||||||
|
},
|
||||||
|
previewZoomButtonIcons: {
|
||||||
|
prev: '<i class="fa fa-caret-left fa-lg"></i>',
|
||||||
|
next: '<i class="fa fa-caret-right fa-lg"></i>',
|
||||||
|
toggleheader: '<i class="fa fa-arrows-v"></i>',
|
||||||
|
fullscreen: '<i class="fa fa-arrows-alt"></i>',
|
||||||
|
borderless: '<i class="fa fa-external-link"></i>',
|
||||||
|
close: '<i class="fa fa-remove"></i>'
|
||||||
|
},
|
||||||
|
previewFileIcon: '<i class="fa fa-file"></i>',
|
||||||
|
browseIcon: '<i class="fa fa-folder-open"></i>',
|
||||||
|
removeIcon: '<i class="fa fa-trash"></i>',
|
||||||
|
cancelIcon: '<i class="fa fa-ban"></i>',
|
||||||
|
uploadIcon: '<i class="fa fa-upload"></i>',
|
||||||
|
msgValidationErrorIcon: '<i class="fa fa-exclamation-circle"></i> '
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer Font Awesome theme style for bootstrap-fileinput. Load this theme file after loading `fileinput.css`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/.explorer-frame .file-preview-other,.theme-explorer-fa .explorer-frame .kv-file-content,.theme-explorer-fa .file-actions,.theme-explorer-fa .file-drag-handle,.theme-explorer-fa .file-upload-indicator{text-align:center}.theme-explorer-fa .file-thumb-progress .progress,.theme-explorer-fa .file-thumb-progress .progress-bar{height:13px;font-size:11px;line-height:13px}.theme-explorer-fa .file-drag-handle,.theme-explorer-fa .file-upload-indicator{position:absolute;display:inline-block;top:0;right:3px;width:16px;height:16px;font-size:16px}.theme-explorer-fa .explorer-caption,.theme-explorer-fa .file-thumb-progress .progress{display:block}.theme-explorer-fa .explorer-frame td{vertical-align:middle;text-align:left}.theme-explorer-fa .explorer-frame .kv-file-content{width:80px;height:80px;padding:5px}.theme-explorer-fa .file-actions-cell{position:relative;width:120px;padding:0}.theme-explorer-fa .file-thumb-progress .progress{margin-top:5px}.theme-explorer-fa .explorer-caption{color:#777}.theme-explorer-fa .kvsortable-ghost{opacity:.6;background:#e1edf7;border:2px solid #a1abff}.theme-explorer-fa .file-preview .table{margin:0}.theme-explorer-fa .file-error-message ul{padding:5px 0 0 20px}.explorer-frame .file-preview-text{display:inline-block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.explorer-frame .file-preview-html{display:inline-block;border:1px solid #ddd;padding:8px;overflow:auto}.explorer-frame .file-other-icon{font-size:2.6em}@media only screen and (max-width:767px){.theme-explorer-fa .table,.theme-explorer-fa .table tbody,.theme-explorer-fa .table td,.theme-explorer-fa .table tr{display:block;width:100%!important}.theme-explorer-fa .table{border:none}.theme-explorer-fa .table tr{margin-top:5px}.theme-explorer-fa .table tr:first-child{margin-top:0}.theme-explorer-fa .table td{text-align:center}.theme-explorer-fa .table .kv-file-content{border-bottom:none;padding:4px;margin:0}.theme-explorer-fa .table .kv-file-content .file-preview-image{max-width:100%;font-size:20px}.theme-explorer-fa .file-details-cell{border-top:none;border-bottom:none;padding-top:0;margin:0}.theme-explorer-fa .file-actions-cell{border-top:none;padding-bottom:4px}.theme-explorer-fa .explorer-frame .explorer-caption{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;left:0;right:0;margin:auto}}.file-zoom-dialog .explorer-frame .file-other-icon{font-size:22em;font-size:50vmin}
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer Font Awesome theme configuration for bootstrap-fileinput.
|
||||||
|
* Load this theme file after loading `fileinput.js`. Ensure that
|
||||||
|
* font awesome assets and CSS are loaded on the page as well.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/!function(a){"use strict";var e='<tr class="file-preview-frame {frameClass}" id="{previewId}" data-fileindex="{fileindex}" data-template="{template}"',i='<td class="kv-file-content">\n';a.fn.fileinputThemes["explorer-fa"]={layoutTemplates:{preview:'<div class="file-preview {class}">\n {close} <div class="{dropClass}">\n <table class="table table-bordered table-hover"><tbody class="file-preview-thumbnails">\n </tbody></table>\n <div class="clearfix"></div> <div class="file-preview-status text-center text-success"></div>\n <div class="kv-fileinput-error"></div>\n </div>\n</div>',footer:'<td class="file-details-cell"><div class="explorer-caption" title="{caption}">{caption}</div> {size}{progress}</td><td class="file-actions-cell">{indicator} {actions}</td>',actions:'{drag}\n<div class="file-actions">\n <div class="file-footer-buttons">\n {upload} {download} {delete} {zoom} {other} </div>\n</div>',zoomCache:'<tr style="display:none" class="kv-zoom-cache-theme"><td><table class="kv-zoom-cache">{zoomContent}</table></td></tr>',fileIcon:'<i class="fa fa-file kv-caption-icon"></i> '},previewMarkupTags:{tagBefore1:e+">"+i,tagBefore2:e+' title="{caption}">'+i,tagAfter:"</td>\n{footer}</tr>\n"},previewSettings:{image:{height:"60px"},html:{width:"100px",height:"60px"},text:{width:"100px",height:"60px"},video:{width:"auto",height:"60px"},audio:{width:"auto",height:"60px"},flash:{width:"100%",height:"60px"},object:{width:"100%",height:"60px"},pdf:{width:"100px",height:"60px"},other:{width:"100%",height:"60px"}},frameClass:"explorer-frame",fileActionSettings:{removeIcon:'<i class="fa fa-trash"></i>',uploadIcon:'<i class="fa fa-upload"></i>',uploadRetryIcon:'<i class="fa fa-repeat"></i>',zoomIcon:'<i class="fa fa-search-plus"></i>',dragIcon:'<i class="fa fa-arrows"></i>',indicatorNew:'<i class="fa fa-plus-circle text-warning"></i>',indicatorSuccess:'<i class="fa fa-check-circle text-success"></i>',indicatorError:'<i class="fa fa-exclamation-circle text-danger"></i>',indicatorLoading:'<i class="fa fa-hourglass text-muted"></i>'},previewZoomButtonIcons:{prev:'<i class="fa fa-caret-left fa-lg"></i>',next:'<i class="fa fa-caret-right fa-lg"></i>',toggleheader:'<i class="fa fa-arrows-v"></i>',fullscreen:'<i class="fa fa-arrows-alt"></i>',borderless:'<i class="fa fa-external-link"></i>',close:'<i class="fa fa-remove"></i>'},previewFileIcon:'<i class="fa fa-file"></i>',browseIcon:'<i class="fa fa-folder-open"></i>',removeIcon:'<i class="fa fa-trash"></i>',cancelIcon:'<i class="fa fa-ban"></i>',uploadIcon:'<i class="fa fa-upload"></i>',msgValidationErrorIcon:'<i class="fa fa-exclamation-circle"></i> '}}(window.jQuery);
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer theme style for bootstrap-fileinput. Load this theme file after loading `fileinput.css`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
.theme-explorer .file-upload-indicator, .theme-explorer .file-drag-handle, .theme-explorer .explorer-frame .kv-file-content, .theme-explorer .file-actions, .explorer-frame .file-preview-other {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-thumb-progress .progress, .theme-explorer .file-thumb-progress .progress-bar {
|
||||||
|
height: 13px;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-upload-indicator, .theme-explorer .file-drag-handle {
|
||||||
|
position: absolute;
|
||||||
|
display: inline-block;
|
||||||
|
top: 0;
|
||||||
|
right: 3px;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-thumb-progress .progress, .theme-explorer .explorer-caption {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .explorer-frame td {
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .explorer-frame .kv-file-content {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-actions-cell {
|
||||||
|
position: relative;
|
||||||
|
width: 120px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-thumb-progress .progress {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .explorer-caption {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .kvsortable-ghost {
|
||||||
|
opacity: 0.6;
|
||||||
|
background: #e1edf7;
|
||||||
|
border: 2px solid #a1abff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-preview .table {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-error-message ul {
|
||||||
|
padding: 5px 0 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-preview-text {
|
||||||
|
display: inline-block;
|
||||||
|
color: #428bca;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||||
|
outline: none;
|
||||||
|
padding: 8px;
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-preview-html {
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.explorer-frame .file-other-icon {
|
||||||
|
font-size: 2.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 767px) {
|
||||||
|
.theme-explorer .table, .theme-explorer .table tbody, .theme-explorer .table tr, .theme-explorer .table td {
|
||||||
|
display: block;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table tr {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table tr:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table td {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table .kv-file-content {
|
||||||
|
border-bottom: none;
|
||||||
|
padding: 4px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .table .kv-file-content .file-preview-image {
|
||||||
|
max-width: 100%;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-details-cell {
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
padding-top: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .file-actions-cell {
|
||||||
|
border-top: none;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-explorer .explorer-frame .explorer-caption {
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*noinspection CssOverwrittenProperties*/
|
||||||
|
.file-zoom-dialog .explorer-frame .file-other-icon {
|
||||||
|
font-size: 22em;
|
||||||
|
font-size: 50vmin;
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer theme configuration for bootstrap-fileinput. Load this theme file after loading `fileinput.js`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
var teTagBef = '<tr class="file-preview-frame {frameClass}" id="{previewId}" data-fileindex="{fileindex}"' +
|
||||||
|
' data-template="{template}"', teContent = '<td class="kv-file-content">\n';
|
||||||
|
$.fn.fileinputThemes.explorer = {
|
||||||
|
layoutTemplates: {
|
||||||
|
preview: '<div class="file-preview {class}">\n' +
|
||||||
|
' {close}' +
|
||||||
|
' <div class="{dropClass}">\n' +
|
||||||
|
' <table class="table table-bordered table-hover"><tbody class="file-preview-thumbnails">\n' +
|
||||||
|
' </tbody></table>\n' +
|
||||||
|
' <div class="clearfix"></div>' +
|
||||||
|
' <div class="file-preview-status text-center text-success"></div>\n' +
|
||||||
|
' <div class="kv-fileinput-error"></div>\n' +
|
||||||
|
' </div>\n' +
|
||||||
|
'</div>',
|
||||||
|
footer: '<td class="file-details-cell"><div class="explorer-caption" title="{caption}">{caption}</div> ' +
|
||||||
|
'{size}{progress}</td><td class="file-actions-cell">{indicator} {actions}</td>',
|
||||||
|
actions: '{drag}\n' +
|
||||||
|
'<div class="file-actions">\n' +
|
||||||
|
' <div class="file-footer-buttons">\n' +
|
||||||
|
' {upload} {download} {delete} {zoom} {other} ' +
|
||||||
|
' </div>\n' +
|
||||||
|
'</div>',
|
||||||
|
zoomCache: '<tr style="display:none" class="kv-zoom-cache-theme"><td>' +
|
||||||
|
'<table class="kv-zoom-cache">{zoomContent}</table></td></tr>'
|
||||||
|
},
|
||||||
|
previewMarkupTags: {
|
||||||
|
tagBefore1: teTagBef + '>' + teContent,
|
||||||
|
tagBefore2: teTagBef + ' title="{caption}">' + teContent,
|
||||||
|
tagAfter: '</td>\n{footer}</tr>\n'
|
||||||
|
},
|
||||||
|
previewSettings: {
|
||||||
|
image: {height: "60px"},
|
||||||
|
html: {width: "100px", height: "60px"},
|
||||||
|
text: {width: "100px", height: "60px"},
|
||||||
|
video: {width: "auto", height: "60px"},
|
||||||
|
audio: {width: "auto", height: "60px"},
|
||||||
|
flash: {width: "100%", height: "60px"},
|
||||||
|
object: {width: "100%", height: "60px"},
|
||||||
|
pdf: {width: "100px", height: "60px"},
|
||||||
|
other: {width: "100%", height: "60px"}
|
||||||
|
},
|
||||||
|
frameClass: 'explorer-frame'
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer theme style for bootstrap-fileinput. Load this theme file after loading `fileinput.css`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/.explorer-frame .file-preview-other,.theme-explorer .explorer-frame .kv-file-content,.theme-explorer .file-actions,.theme-explorer .file-drag-handle,.theme-explorer .file-upload-indicator{text-align:center}.theme-explorer .file-thumb-progress .progress,.theme-explorer .file-thumb-progress .progress-bar{height:13px;font-size:11px;line-height:13px}.theme-explorer .file-drag-handle,.theme-explorer .file-upload-indicator{position:absolute;display:inline-block;top:0;right:3px;width:16px;height:16px;font-size:16px}.theme-explorer .explorer-caption,.theme-explorer .file-thumb-progress .progress{display:block}.theme-explorer .explorer-frame td{vertical-align:middle;text-align:left}.theme-explorer .explorer-frame .kv-file-content{width:80px;height:80px;padding:5px}.theme-explorer .file-actions-cell{position:relative;width:120px;padding:0}.theme-explorer .file-thumb-progress .progress{margin-top:5px}.theme-explorer .explorer-caption{color:#777}.theme-explorer .kvsortable-ghost{opacity:.6;background:#e1edf7;border:2px solid #a1abff}.theme-explorer .file-preview .table{margin:0}.theme-explorer .file-error-message ul{padding:5px 0 0 20px}.explorer-frame .file-preview-text{display:inline-block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.explorer-frame .file-preview-html{display:inline-block;border:1px solid #ddd;padding:8px;overflow:auto}.explorer-frame .file-other-icon{font-size:2.6em}@media only screen and (max-width:767px){.theme-explorer .table,.theme-explorer .table tbody,.theme-explorer .table td,.theme-explorer .table tr{display:block;width:100%!important}.theme-explorer .table{border:none}.theme-explorer .table tr{margin-top:5px}.theme-explorer .table tr:first-child{margin-top:0}.theme-explorer .table td{text-align:center}.theme-explorer .table .kv-file-content{border-bottom:none;padding:4px;margin:0}.theme-explorer .table .kv-file-content .file-preview-image{max-width:100%;font-size:20px}.theme-explorer .file-details-cell{border-top:none;border-bottom:none;padding-top:0;margin:0}.theme-explorer .file-actions-cell{border-top:none;padding-bottom:4px}.theme-explorer .explorer-frame .explorer-caption{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;left:0;right:0;margin:auto}}.file-zoom-dialog .explorer-frame .file-other-icon{font-size:22em;font-size:50vmin}
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Krajee Explorer theme configuration for bootstrap-fileinput. Load this theme file after loading `fileinput.js`.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/!function(e){"use strict";var t='<tr class="file-preview-frame {frameClass}" id="{previewId}" data-fileindex="{fileindex}" data-template="{template}"',i='<td class="kv-file-content">\n';e.fn.fileinputThemes.explorer={layoutTemplates:{preview:'<div class="file-preview {class}">\n {close} <div class="{dropClass}">\n <table class="table table-bordered table-hover"><tbody class="file-preview-thumbnails">\n </tbody></table>\n <div class="clearfix"></div> <div class="file-preview-status text-center text-success"></div>\n <div class="kv-fileinput-error"></div>\n </div>\n</div>',footer:'<td class="file-details-cell"><div class="explorer-caption" title="{caption}">{caption}</div> {size}{progress}</td><td class="file-actions-cell">{indicator} {actions}</td>',actions:'{drag}\n<div class="file-actions">\n <div class="file-footer-buttons">\n {upload} {download} {delete} {zoom} {other} </div>\n</div>',zoomCache:'<tr style="display:none" class="kv-zoom-cache-theme"><td><table class="kv-zoom-cache">{zoomContent}</table></td></tr>'},previewMarkupTags:{tagBefore1:t+">"+i,tagBefore2:t+' title="{caption}">'+i,tagAfter:"</td>\n{footer}</tr>\n"},previewSettings:{image:{height:"60px"},html:{width:"100px",height:"60px"},text:{width:"100px",height:"60px"},video:{width:"auto",height:"60px"},audio:{width:"auto",height:"60px"},flash:{width:"100%",height:"60px"},object:{width:"100%",height:"60px"},pdf:{width:"100px",height:"60px"},other:{width:"100%",height:"60px"}},frameClass:"explorer-frame"}}(window.jQuery);
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputThemes.fa = {
|
||||||
|
fileActionSettings: {
|
||||||
|
removeIcon: '<i class="fa fa-trash"></i>',
|
||||||
|
uploadIcon: '<i class="fa fa-upload"></i>',
|
||||||
|
uploadRetryIcon: '<i class="fa fa-repeat"></i>',
|
||||||
|
zoomIcon: '<i class="fa fa-search-plus"></i>',
|
||||||
|
dragIcon: '<i class="fa fa-bars"></i>',
|
||||||
|
indicatorNew: '<i class="fa fa-plus-circle text-warning"></i>',
|
||||||
|
indicatorSuccess: '<i class="fa fa-check-circle text-success"></i>',
|
||||||
|
indicatorError: '<i class="fa fa-exclamation-circle text-danger"></i>',
|
||||||
|
indicatorLoading: '<i class="fa fa-hourglass text-muted"></i>'
|
||||||
|
},
|
||||||
|
layoutTemplates: {
|
||||||
|
fileIcon: '<i class="fa fa-file kv-caption-icon"></i> '
|
||||||
|
},
|
||||||
|
previewZoomButtonIcons: {
|
||||||
|
prev: '<i class="fa fa-caret-left fa-lg"></i>',
|
||||||
|
next: '<i class="fa fa-caret-right fa-lg"></i>',
|
||||||
|
toggleheader: '<i class="fa fa-arrows-v"></i>',
|
||||||
|
fullscreen: '<i class="fa fa-arrows-alt"></i>',
|
||||||
|
borderless: '<i class="fa fa-external-link"></i>',
|
||||||
|
close: '<i class="fa fa-remove"></i>'
|
||||||
|
},
|
||||||
|
previewFileIcon: '<i class="fa fa-file"></i>',
|
||||||
|
browseIcon: '<i class="fa fa-folder-open"></i>',
|
||||||
|
removeIcon: '<i class="fa fa-trash"></i>',
|
||||||
|
cancelIcon: '<i class="fa fa-ban"></i>',
|
||||||
|
uploadIcon: '<i class="fa fa-upload"></i>',
|
||||||
|
msgValidationErrorIcon: '<i class="fa fa-exclamation-circle"></i> '
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/!function(a){"use strict";a.fn.fileinputThemes.fa={fileActionSettings:{removeIcon:'<i class="fa fa-trash"></i>',uploadIcon:'<i class="fa fa-upload"></i>',uploadRetryIcon:'<i class="fa fa-repeat"></i>',zoomIcon:'<i class="fa fa-search-plus"></i>',dragIcon:'<i class="fa fa-bars"></i>',indicatorNew:'<i class="fa fa-plus-circle text-warning"></i>',indicatorSuccess:'<i class="fa fa-check-circle text-success"></i>',indicatorError:'<i class="fa fa-exclamation-circle text-danger"></i>',indicatorLoading:'<i class="fa fa-hourglass text-muted"></i>'},layoutTemplates:{fileIcon:'<i class="fa fa-file kv-caption-icon"></i> '},previewZoomButtonIcons:{prev:'<i class="fa fa-caret-left fa-lg"></i>',next:'<i class="fa fa-caret-right fa-lg"></i>',toggleheader:'<i class="fa fa-arrows-v"></i>',fullscreen:'<i class="fa fa-arrows-alt"></i>',borderless:'<i class="fa fa-external-link"></i>',close:'<i class="fa fa-remove"></i>'},previewFileIcon:'<i class="fa fa-file"></i>',browseIcon:'<i class="fa fa-folder-open"></i>',removeIcon:'<i class="fa fa-trash"></i>',cancelIcon:'<i class="fa fa-ban"></i>',uploadIcon:'<i class="fa fa-upload"></i>',msgValidationErrorIcon:'<i class="fa fa-exclamation-circle"></i> '}}(window.jQuery);
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Glyphicon (default) theme configuration for bootstrap-fileinput.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
$.fn.fileinputThemes.gly = {
|
||||||
|
fileActionSettings: {
|
||||||
|
removeIcon: '<i class="glyphicon glyphicon-trash"></i>',
|
||||||
|
uploadIcon: '<i class="glyphicon glyphicon-upload"></i>',
|
||||||
|
zoomIcon: '<i class="glyphicon glyphicon-zoom-in"></i>',
|
||||||
|
dragIcon: '<i class="glyphicon glyphicon-move"></i>',
|
||||||
|
indicatorNew: '<i class="glyphicon glyphicon-plus-sign text-warning"></i>',
|
||||||
|
indicatorSuccess: '<i class="glyphicon glyphicon-ok-sign text-success"></i>',
|
||||||
|
indicatorError: '<i class="glyphicon glyphicon-exclamation-sign text-danger"></i>',
|
||||||
|
indicatorLoading: '<i class="glyphicon glyphicon-hourglass text-muted"></i>'
|
||||||
|
},
|
||||||
|
layoutTemplates: {
|
||||||
|
fileIcon: '<i class="glyphicon glyphicon-file kv-caption-icon"></i>'
|
||||||
|
},
|
||||||
|
previewZoomButtonIcons: {
|
||||||
|
prev: '<i class="glyphicon glyphicon-triangle-left"></i>',
|
||||||
|
next: '<i class="glyphicon glyphicon-triangle-right"></i>',
|
||||||
|
toggleheader: '<i class="glyphicon glyphicon-resize-vertical"></i>',
|
||||||
|
fullscreen: '<i class="glyphicon glyphicon-fullscreen"></i>',
|
||||||
|
borderless: '<i class="glyphicon glyphicon-resize-full"></i>',
|
||||||
|
close: '<i class="glyphicon glyphicon-remove"></i>'
|
||||||
|
},
|
||||||
|
previewFileIcon: '<i class="glyphicon glyphicon-file"></i>',
|
||||||
|
browseIcon: '<i class="glyphicon glyphicon-folder-open"></i> ',
|
||||||
|
removeIcon: '<i class="glyphicon glyphicon-trash"></i>',
|
||||||
|
cancelIcon: '<i class="glyphicon glyphicon-ban-circle"></i>',
|
||||||
|
uploadIcon: '<i class="glyphicon glyphicon-upload"></i>',
|
||||||
|
msgValidationErrorIcon: '<i class="glyphicon glyphicon-exclamation-sign"></i> '
|
||||||
|
};
|
||||||
|
})(window.jQuery);
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-fileinput v4.4.7
|
||||||
|
* http://plugins.krajee.com/file-input
|
||||||
|
*
|
||||||
|
* Glyphicon (default) theme configuration for bootstrap-fileinput.
|
||||||
|
*
|
||||||
|
* Author: Kartik Visweswaran
|
||||||
|
* Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause
|
||||||
|
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
|
||||||
|
*/!function(i){"use strict";i.fn.fileinputThemes.gly={fileActionSettings:{removeIcon:'<i class="glyphicon glyphicon-trash"></i>',uploadIcon:'<i class="glyphicon glyphicon-upload"></i>',zoomIcon:'<i class="glyphicon glyphicon-zoom-in"></i>',dragIcon:'<i class="glyphicon glyphicon-move"></i>',indicatorNew:'<i class="glyphicon glyphicon-plus-sign text-warning"></i>',indicatorSuccess:'<i class="glyphicon glyphicon-ok-sign text-success"></i>',indicatorError:'<i class="glyphicon glyphicon-exclamation-sign text-danger"></i>',indicatorLoading:'<i class="glyphicon glyphicon-hourglass text-muted"></i>'},layoutTemplates:{fileIcon:'<i class="glyphicon glyphicon-file kv-caption-icon"></i>'},previewZoomButtonIcons:{prev:'<i class="glyphicon glyphicon-triangle-left"></i>',next:'<i class="glyphicon glyphicon-triangle-right"></i>',toggleheader:'<i class="glyphicon glyphicon-resize-vertical"></i>',fullscreen:'<i class="glyphicon glyphicon-fullscreen"></i>',borderless:'<i class="glyphicon glyphicon-resize-full"></i>',close:'<i class="glyphicon glyphicon-remove"></i>'},previewFileIcon:'<i class="glyphicon glyphicon-file"></i>',browseIcon:'<i class="glyphicon glyphicon-folder-open"></i> ',removeIcon:'<i class="glyphicon glyphicon-trash"></i>',cancelIcon:'<i class="glyphicon glyphicon-ban-circle"></i>',uploadIcon:'<i class="glyphicon glyphicon-upload"></i>',msgValidationErrorIcon:'<i class="glyphicon glyphicon-exclamation-sign"></i> '}}(window.jQuery);
|
|
@ -18,11 +18,11 @@ textarea{
|
||||||
font-weight: 200;
|
font-weight: 200;
|
||||||
}
|
}
|
||||||
.error-message{
|
.error-message{
|
||||||
color: red;
|
color: #d9534f;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
.success-message{
|
.success-message{
|
||||||
color: green;
|
color: #5cb85c;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
.input-readonly{
|
.input-readonly{
|
||||||
|
@ -220,12 +220,17 @@ textarea{
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.manual-body .page-right .box-body label{
|
.manual-body .page-right .box-body label, .text-label{
|
||||||
font-family: "Microsoft Yahei","Helvetica Neue",Helvetica,Arial,sans-serif;
|
font-family: "Microsoft Yahei","Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||||
color: #222222;
|
color: #222222;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
}
|
}
|
||||||
|
.required>.text-label:after{
|
||||||
|
color: #db2828;
|
||||||
|
content: "*";
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: -.2em 0 0 .2em;
|
||||||
|
}
|
||||||
.manual-body .page-right .box-body .form-right{
|
.manual-body .page-right .box-body .form-right{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|
|
@ -6,7 +6,7 @@ function showError($msg,$id) {
|
||||||
if(!$id){
|
if(!$id){
|
||||||
$id = "#form-error-message"
|
$id = "#form-error-message"
|
||||||
}
|
}
|
||||||
$($id).addClass("error-message").removeClass("success-message").text($msg);
|
$($id).addClass("error-message").removeClass("success-message").text($msg).show();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ function showSuccess($msg,$id) {
|
||||||
if(!$id){
|
if(!$id){
|
||||||
$id = "#form-error-message"
|
$id = "#form-error-message"
|
||||||
}
|
}
|
||||||
$($id).addClass("success-message").removeClass("error-message").text($msg);
|
$($id).addClass("success-message").removeClass("error-message").text($msg).show();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
package utils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"math"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func AbsolutePath(p string) (string, error) {
|
|
||||||
|
|
||||||
if strings.HasPrefix(p, "~") {
|
|
||||||
home := os.Getenv("HOME")
|
|
||||||
if home == "" {
|
|
||||||
panic(fmt.Sprintf("can not found HOME in envs, '%s' AbsPh Failed!", p))
|
|
||||||
}
|
|
||||||
p = fmt.Sprint(home, string(p[1:]))
|
|
||||||
}
|
|
||||||
s, err := filepath.Abs(p)
|
|
||||||
|
|
||||||
if nil != err {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FileExists reports whether the named file or directory exists.
|
|
||||||
func FileExists(name string) bool {
|
|
||||||
if _, err := os.Stat(name); err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func CopyFile(dstName, srcName string) (written int64, err error) {
|
|
||||||
src, err := os.Open(srcName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer src.Close()
|
|
||||||
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer dst.Close()
|
|
||||||
return io.Copy(dst, src)
|
|
||||||
}
|
|
||||||
|
|
||||||
func FormatBytes(size int64) string {
|
|
||||||
units := []string{" B", " KB", " MB", " GB", " TB"}
|
|
||||||
|
|
||||||
s := float64(size)
|
|
||||||
|
|
||||||
i := 0
|
|
||||||
|
|
||||||
for ; s >= 1024 && i < 4; i++ {
|
|
||||||
s /= 1024
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf("%.2f%s", s, units[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
func Round(val float64, places int) float64 {
|
|
||||||
var t float64
|
|
||||||
f := math.Pow10(places)
|
|
||||||
x := val * f
|
|
||||||
if math.IsInf(x, 0) || math.IsNaN(x) {
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
if x >= 0.0 {
|
|
||||||
t = math.Ceil(x)
|
|
||||||
if (t - x) > 0.50000000001 {
|
|
||||||
t -= 1.0
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
t = math.Ceil(-x)
|
|
||||||
if (t + x) > 0.50000000001 {
|
|
||||||
t -= 1.0
|
|
||||||
}
|
|
||||||
t = -t
|
|
||||||
}
|
|
||||||
x = t / f
|
|
||||||
|
|
||||||
if !math.IsInf(x, 0) {
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
return t
|
|
||||||
}
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"io"
|
"io"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
//==================================
|
//==================================
|
||||||
|
@ -130,3 +131,71 @@ func RemoveDir(dir string) error {
|
||||||
return os.RemoveAll(dir)
|
return os.RemoveAll(dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AbsolutePath(p string) (string, error) {
|
||||||
|
|
||||||
|
if strings.HasPrefix(p, "~") {
|
||||||
|
home := os.Getenv("HOME")
|
||||||
|
if home == "" {
|
||||||
|
panic(fmt.Sprintf("can not found HOME in envs, '%s' AbsPh Failed!", p))
|
||||||
|
}
|
||||||
|
p = fmt.Sprint(home, string(p[1:]))
|
||||||
|
}
|
||||||
|
s, err := filepath.Abs(p)
|
||||||
|
|
||||||
|
if nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// FileExists reports whether the named file or directory exists.
|
||||||
|
func FileExists(name string) bool {
|
||||||
|
if _, err := os.Stat(name); err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func FormatBytes(size int64) string {
|
||||||
|
units := []string{" B", " KB", " MB", " GB", " TB"}
|
||||||
|
|
||||||
|
s := float64(size)
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
|
||||||
|
for ; s >= 1024 && i < 4; i++ {
|
||||||
|
s /= 1024
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%.2f%s", s, units[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
func Round(val float64, places int) float64 {
|
||||||
|
var t float64
|
||||||
|
f := math.Pow10(places)
|
||||||
|
x := val * f
|
||||||
|
if math.IsInf(x, 0) || math.IsNaN(x) {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
if x >= 0.0 {
|
||||||
|
t = math.Ceil(x)
|
||||||
|
if (t - x) > 0.50000000001 {
|
||||||
|
t -= 1.0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
t = math.Ceil(-x)
|
||||||
|
if (t + x) > 0.50000000001 {
|
||||||
|
t -= 1.0
|
||||||
|
}
|
||||||
|
t = -t
|
||||||
|
}
|
||||||
|
x = t / f
|
||||||
|
|
||||||
|
if !math.IsInf(x, 0) {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
return t
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package requests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
//下载远程文件并保存到指定位置
|
||||||
|
func DownloadAndSaveFile(remoteUrl, dstFile string) (error) {
|
||||||
|
client := &http.Client{}
|
||||||
|
uri, err := url.Parse(remoteUrl)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Create the file
|
||||||
|
out, err := os.Create(dstFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer out.Close()
|
||||||
|
|
||||||
|
request, err := http.NewRequest("GET", uri.String(), nil)
|
||||||
|
request.Header.Add("Connection", "close")
|
||||||
|
request.Header.Add("Host", uri.Host)
|
||||||
|
request.Header.Add("Referer", uri.String())
|
||||||
|
request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0")
|
||||||
|
|
||||||
|
resp, err := client.Do(request)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
|
||||||
|
if resp.StatusCode == http.StatusOK {
|
||||||
|
_, err = io.Copy(out, resp.Body)
|
||||||
|
}else{
|
||||||
|
return errors.New(fmt.Sprintf("bad status: %s", resp.Status))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -10,7 +10,8 @@
|
||||||
<!-- Bootstrap -->
|
<!-- Bootstrap -->
|
||||||
<link href="{{cdncss "/static/bootstrap/css/bootstrap.min.css"}}" rel="stylesheet" type="text/css">
|
<link href="{{cdncss "/static/bootstrap/css/bootstrap.min.css"}}" rel="stylesheet" type="text/css">
|
||||||
<link href="{{cdncss "/static/font-awesome/css/font-awesome.min.css"}}" rel="stylesheet" type="text/css">
|
<link href="{{cdncss "/static/font-awesome/css/font-awesome.min.css"}}" rel="stylesheet" type="text/css">
|
||||||
|
<link href="{{cdncss "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/css/fileinput.min.css"}}" rel="stylesheet" type="text/css">
|
||||||
|
<link href="{{cdncss "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/themes/explorer-fa/theme.css"}}" rel="stylesheet" type="text/css">
|
||||||
<link href="{{cdncss "/static/css/main.css"}}" rel="stylesheet">
|
<link href="{{cdncss "/static/css/main.css"}}" rel="stylesheet">
|
||||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||||
|
@ -33,7 +34,9 @@
|
||||||
<div class="m-box">
|
<div class="m-box">
|
||||||
<div class="box-head">
|
<div class="box-head">
|
||||||
<strong class="box-title">项目列表</strong>
|
<strong class="box-title">项目列表</strong>
|
||||||
|
|
||||||
<button type="button" data-toggle="modal" data-target="#addBookDialogModal" class="btn btn-success btn-sm pull-right">添加项目</button>
|
<button type="button" data-toggle="modal" data-target="#addBookDialogModal" class="btn btn-success btn-sm pull-right">添加项目</button>
|
||||||
|
<button type="button" data-toggle="modal" data-target="#importBookDialogModal" class="btn btn-primary btn-sm pull-right" style="margin-right: 5px;">导入项目</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body" id="bookList">
|
<div class="box-body" id="bookList">
|
||||||
|
@ -176,7 +179,65 @@
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div><!--END Modal-->
|
</div>
|
||||||
|
<!--END Modal-->
|
||||||
|
<!-- importBookDialogModal -->
|
||||||
|
<div class="modal fade" id="importBookDialogModal" tabindex="-1" role="dialog" aria-labelledby="importBookDialogModalLabel">
|
||||||
|
<div class="modal-dialog" role="document" style="min-width: 900px;">
|
||||||
|
<form method="post" autocomplete="off" action="{{urlfor "BookController.Import"}}" id="importBookDialogForm" enctype="multipart/form-data">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
<h4 class="modal-title">导入项目</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-group required">
|
||||||
|
<label class="text-label">项目标题</label>
|
||||||
|
<input type="text" class="form-control" placeholder="项目标题(不超过100字)" name="book_name" maxlength="100" value="导入测试">
|
||||||
|
</div>
|
||||||
|
<div class="form-group required">
|
||||||
|
<label class="text-label">项目标识</label>
|
||||||
|
<input type="text" class="form-control" placeholder="项目唯一标识(不超过50字)" name="identify" value="import">
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
<p class="text" style="font-size: 12px;color: #999;margin-top: 6px;">文档标识只能包含小写字母、数字,以及“-”、“.”和“_”符号.</p>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="text-label">项目描述</label>
|
||||||
|
<textarea name="description" id="description" class="form-control" placeholder="描述信息不超过500个字符" style="height: 90px;"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="privately_owned" value="0" checked> 公开<span class="text">(任何人都可以访问)</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="privately_owned" value="1"> 私有<span class="text">(只要参与者或使用令牌才能访问)</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="file-loading">
|
||||||
|
<input id="import-book-upload" name="import-file" type="file" accept=".zip">
|
||||||
|
</div>
|
||||||
|
<div id="kartik-file-errors"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<span id="import-book-form-error-message" style="background-color: #ffffff;border: none;margin: 0;padding: 0;"></span>
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||||
|
<button type="button" class="btn btn-success" id="btnImportBook" data-loading-text="创建中...">创建</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--END importBookDialogModal-->
|
||||||
<!-- Delete Book Modal -->
|
<!-- Delete Book Modal -->
|
||||||
<div class="modal fade" id="deleteBookModal" tabindex="-1" role="dialog" aria-labelledby="deleteBookModalLabel">
|
<div class="modal fade" id="deleteBookModal" tabindex="-1" role="dialog" aria-labelledby="deleteBookModalLabel">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
|
@ -206,6 +267,8 @@
|
||||||
<script src="{{cdnjs "/static/bootstrap/js/bootstrap.min.js"}}" type="text/javascript"></script>
|
<script src="{{cdnjs "/static/bootstrap/js/bootstrap.min.js"}}" type="text/javascript"></script>
|
||||||
<script src="{{cdnjs "/static/vuejs/vue.min.js"}}" type="text/javascript"></script>
|
<script src="{{cdnjs "/static/vuejs/vue.min.js"}}" type="text/javascript"></script>
|
||||||
<script src="{{cdnjs "/static/js/jquery.form.js"}}" type="text/javascript"></script>
|
<script src="{{cdnjs "/static/js/jquery.form.js"}}" type="text/javascript"></script>
|
||||||
|
<script src="{{cdnjs "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/js/fileinput.min.js"}}"></script>
|
||||||
|
<script src="{{cdnjs "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/js/locales/zh.js"}}"></script>
|
||||||
<script src="{{cdnjs "/static/js/main.js"}}" type="text/javascript"></script>
|
<script src="{{cdnjs "/static/js/main.js"}}" type="text/javascript"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/**
|
/**
|
||||||
|
@ -315,6 +378,7 @@
|
||||||
$("#btnSaveDocument").on("click",function () {
|
$("#btnSaveDocument").on("click",function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
|
|
||||||
|
|
||||||
var bookName = $.trim($("#bookName").val());
|
var bookName = $.trim($("#bookName").val());
|
||||||
if (bookName === "") {
|
if (bookName === "") {
|
||||||
return showError("项目标题不能为空")
|
return showError("项目标题不能为空")
|
||||||
|
@ -401,6 +465,38 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#btnImportBook").on("click",function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var $then = $(this).parents("#importBookDialogForm");
|
||||||
|
|
||||||
|
|
||||||
|
var bookName = $.trim($then.find("input[name='book_name']").val());
|
||||||
|
|
||||||
|
if (bookName === "") {
|
||||||
|
return showError("项目标题不能为空","#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
if (bookName.length > 100) {
|
||||||
|
return showError("项目标题必须小于100字符","#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
|
||||||
|
var identify = $.trim($then.find("input[name='identify']").val());
|
||||||
|
if (identify === "") {
|
||||||
|
return showError("项目标识不能为空","#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
var description = $.trim($then.find('textarea[name="description"]').val());
|
||||||
|
if (description.length > 500) {
|
||||||
|
return showError("描述信息不超过500个字符","#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
var filesCount = $('#import-book-upload').fileinput('getFilesCount');
|
||||||
|
console.log(filesCount)
|
||||||
|
if (filesCount <= 0) {
|
||||||
|
return showError("请选择需要上传的文件","#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
//$("#importBookDialogForm").submit();
|
||||||
|
$("#btnImportBook").button("loading");
|
||||||
|
$('#import-book-upload').fileinput('upload');
|
||||||
|
|
||||||
|
});
|
||||||
window.app = new Vue({
|
window.app = new Vue({
|
||||||
el : "#bookList",
|
el : "#bookList",
|
||||||
data : {
|
data : {
|
||||||
|
@ -413,6 +509,38 @@
|
||||||
Vue.nextTick(function () {
|
Vue.nextTick(function () {
|
||||||
$("[data-toggle='tooltip']").tooltip();
|
$("[data-toggle='tooltip']").tooltip();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#import-book-upload").fileinput({
|
||||||
|
'uploadUrl':"{{urlfor "BookController.Import"}}",
|
||||||
|
'theme': 'fa',
|
||||||
|
'showPreview': false,
|
||||||
|
'showUpload' : false,
|
||||||
|
'required': true,
|
||||||
|
'validateInitialCount': true,
|
||||||
|
"language" : "zh",
|
||||||
|
'allowedFileExtensions': ['zip'],
|
||||||
|
'msgPlaceholder' : '请选择Zip文件',
|
||||||
|
'elErrorContainer' : "#import-book-form-error-message",
|
||||||
|
'uploadExtraData' : function () {
|
||||||
|
var book = {};
|
||||||
|
var $then = $("#importBookDialogForm");
|
||||||
|
book.book_name = $then.find("input[name='book_name']").val();
|
||||||
|
book.identify = $then.find("input[name='identify']").val();
|
||||||
|
book.description = $then.find('textarea[name="description"]').val()
|
||||||
|
|
||||||
|
return book;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$("#import-book-upload").on("fileuploaded",function (event, data, previewId, index){
|
||||||
|
|
||||||
|
if(data.response.errcode === 0 || data.response.errcode === '0'){
|
||||||
|
showSuccess(data.response.message,"#import-book-form-error-message");
|
||||||
|
}else{
|
||||||
|
showError(data.response.message,"#import-book-form-error-message");
|
||||||
|
}
|
||||||
|
$("#btnImportBook").button("reset");
|
||||||
|
return true;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Reference in New Issue