// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package models import ( "fmt" "regexp" "strings" "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) func init() { tables = append(tables, new(Topic), new(RepoTopic), ) } var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) // Topic represents a topic of repositories type Topic struct { ID int64 Name string `xorm:"UNIQUE VARCHAR(25)"` RepoCount int CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } // RepoTopic represents associated repositories and topics type RepoTopic struct { RepoID int64 `xorm:"UNIQUE(s)"` TopicID int64 `xorm:"UNIQUE(s)"` } // ErrTopicNotExist represents an error that a topic is not exist type ErrTopicNotExist struct { Name string } // IsErrTopicNotExist checks if an error is an ErrTopicNotExist. func IsErrTopicNotExist(err error) bool { _, ok := err.(ErrTopicNotExist) return ok } // Error implements error interface func (err ErrTopicNotExist) Error() string { return fmt.Sprintf("topic is not exist [name: %s]", err.Name) } // ValidateTopic checks a topic by length and match pattern rules func ValidateTopic(topic string) bool { return len(topic) <= 35 && topicPattern.MatchString(topic) } // SanitizeAndValidateTopics sanitizes and checks an array or topics func SanitizeAndValidateTopics(topics []string) (validTopics []string, invalidTopics []string) { validTopics = make([]string, 0) mValidTopics := make(map[string]struct{}) invalidTopics = make([]string, 0) for _, topic := range topics { topic = strings.TrimSpace(strings.ToLower(topic)) // ignore empty string if len(topic) == 0 { continue } // ignore same topic twice if _, ok := mValidTopics[topic]; ok { continue } if ValidateTopic(topic) { validTopics = append(validTopics, topic) mValidTopics[topic] = struct{}{} } else { invalidTopics = append(invalidTopics, topic) } } return validTopics, invalidTopics } // GetTopicByName retrieves topic by name func GetTopicByName(name string) (*Topic, error) { var topic Topic if has, err := x.Where("name = ?", name).Get(&topic); err != nil { return nil, err } else if !has { return nil, ErrTopicNotExist{name} } return &topic, nil } // addTopicByNameToRepo adds a topic name to a repo and increments the topic count. // Returns topic after the addition func addTopicByNameToRepo(e Engine, repoID int64, topicName string) (*Topic, error) { var topic Topic has, err := e.Where("name = ?", topicName).Get(&topic) if err != nil { return nil, err } if !has { topic.Name = topicName topic.RepoCount = 1 if _, err := e.Insert(&topic); err != nil { return nil, err } } else { topic.RepoCount++ if _, err := e.ID(topic.ID).Cols("repo_count").Update(&topic); err != nil { return nil, err } } if _, err := e.Insert(&RepoTopic{ RepoID: repoID, TopicID: topic.ID, }); err != nil { return nil, err } return &topic, nil } // removeTopicFromRepo remove a topic from a repo and decrements the topic repo count func removeTopicFromRepo(repoID int64, topic *Topic, e Engine) error { topic.RepoCount-- if _, err := e.ID(topic.ID).Cols("repo_count").Update(topic); err != nil { return err } if _, err := e.Delete(&RepoTopic{ RepoID: repoID, TopicID: topic.ID, }); err != nil { return err } return nil } // FindTopicOptions represents the options when fdin topics type FindTopicOptions struct { RepoID int64 Keyword string Limit int Page int } func (opts *FindTopicOptions) toConds() builder.Cond { var cond = builder.NewCond() if opts.RepoID > 0 { cond = cond.And(builder.Eq{"repo_topic.repo_id": opts.RepoID}) } if opts.Keyword != "" { cond = cond.And(builder.Like{"topic.name", opts.Keyword}) } return cond } // FindTopics retrieves the topics via FindTopicOptions func FindTopics(opts *FindTopicOptions) (topics []*Topic, err error) { sess := x.Select("topic.*").Where(opts.toConds()) if opts.RepoID > 0 { sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id") } if opts.Limit > 0 { sess.Limit(opts.Limit, opts.Page*opts.Limit) } return topics, sess.Desc("topic.repo_count").Find(&topics) } // GetRepoTopicByName retrives topic from name for a repo if it exist func GetRepoTopicByName(repoID int64, topicName string) (*Topic, error) { var cond = builder.NewCond() var topic Topic cond = cond.And(builder.Eq{"repo_topic.repo_id": repoID}).And(builder.Eq{"topic.name": topicName}) sess := x.Table("topic").Where(cond) sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id") has, err := sess.Get(&topic) if has { return &topic, err } return nil, err } // AddTopic adds a topic name to a repository (if it does not already have it) func AddTopic(repoID int64, topicName string) (*Topic, error) { topic, err := GetRepoTopicByName(repoID, topicName) if err != nil { return nil, err } if topic != nil { // Repo already have topic return topic, nil } return addTopicByNameToRepo(x, repoID, topicName) } // DeleteTopic removes a topic name from a repository (if it has it) func DeleteTopic(repoID int64, topicName string) (*Topic, error) { topic, err := GetRepoTopicByName(repoID, topicName) if err != nil { return nil, err } if topic == nil { // Repo doesn't have topic, can't be removed return nil, nil } err = removeTopicFromRepo(repoID, topic, x) return topic, err } // SaveTopics save topics to a repository func SaveTopics(repoID int64, topicNames ...string) error { topics, err := FindTopics(&FindTopicOptions{ RepoID: repoID, }) if err != nil { return err } sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { return err } var addedTopicNames []string for _, topicName := range topicNames { if strings.TrimSpace(topicName) == "" { continue } var found bool for _, t := range topics { if strings.EqualFold(topicName, t.Name) { found = true break } } if !found { addedTopicNames = append(addedTopicNames, topicName) } } var removeTopics []*Topic for _, t := range topics { var found bool for _, topicName := range topicNames { if strings.EqualFold(topicName, t.Name) { found = true break } } if !found { removeTopics = append(removeTopics, t) } } for _, topicName := range addedTopicNames { _, err := addTopicByNameToRepo(sess, repoID, topicName) if err != nil { return err } } for _, topic := range removeTopics { err := removeTopicFromRepo(repoID, topic, sess) if err != nil { return err } } topicNames = make([]string, 0, 25) if err := sess.Table("topic").Cols("name"). Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id"). Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil { return err } if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{ Topics: topicNames, }); err != nil { return err } return sess.Commit() } bundle Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
summaryrefslogtreecommitdiffstats
path: root/apps/theming/l10n/sk.js
blob: 1842d678ded6418e639ae2dde2cee5af0e2d4576 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
OC.L10N.register(
    "theming",
    {
    "Loading preview…" : "Načítavanie ukážky...",
    "Admin" : "Správca",
    "Saved" : "Uložené",
    "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta",
    "Name cannot be empty" : "Názov nemôže byť prázdny",
    "The given name is too long" : "Zadané meno je príliš dlhé",
    "The given web address is too long" : "Zadaná web adresa je príliš dlhá",
    "The given web address is not a valid URL" : "Zadaná web adresa nie je platná adresa URL",
    "The given legal notice address is too long" : "Zadaná adresa právneho upozornenia je príliš dlhá",
    "The given legal notice address is not a valid URL" : "Zadaná adresa právneho upozornenia nie je platná adresa URL",
    "The given privacy policy address is too long" : "Zadaná adresa zásady ochrany osobných údajov je príliš dlhá",
    "The given privacy policy address is not a valid URL" : "Zadaná adresa zásady ochrany osobných údajov nie je platná adresa URL",
    "The given slogan is too long" : "Zadaný slogan je príliš dlhý",
    "The given color is invalid" : "Zadaná farba nie je platná",
    "The file was uploaded" : "Súbor bol nahraný",
    "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahraný súbor prekročil limit nastavený v upload_max_filesize v súbore php.ini",
    "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.",
    "The file was only partially uploaded" : "Súbor sa nahral len čiastočne",
    "No file was uploaded" : "Nenahral sa žiadny súbor",
    "Missing a temporary folder" : "Chýba priečinok pre dočasné súbory",
    "Could not write file to disk" : "Nepodarilo sa zapísať súbor na disk.",
    "A PHP extension stopped the file upload" : "rozšírenie PHP zastavilo nahrávanie súboru.",
    "No file uploaded" : "Žiadny súbor nebol nahraný",
    "You are already using a custom theme. Theming app settings might be overwritten by that." : "Už používate vlastný motív vzhľadu. Predošlé nastavenia tým môžu byť prepísané.",
    "Theming" : "Zmena vzhľadu",
    "Dark theme" : "Tmavý motív vzhľadu",
    "Enable dark theme" : "Zapnúť tmavý motív vzhľadu",
    "A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Tmavý motív vzhľadu pre úľavu vašim očiam znížením celkovej svietivosti a jasu. Je ešte stále vo vývoji, ak náhodou narazíte na nejaký problém, tak nám ho prosím nahláste.",
    "Dyslexia font" : "Písmo pre dyslektikov",
    "Enable dyslexia font" : "Povoliť písmo pre dyslektikov",
    "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je slobodný typ písma navrhnutý priamo pre obmedzenie vplyvu niektorých bežných porúch čítania spôsobených dyslexiou.",
    "High contrast mode" : "Režim vysokého kontrastu",
    "Enable high contrast mode" : "Zapnúť režim vysokého kontrastu",
    "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mód s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.",
    "Legal notice" : "Právne upozornenie",
    "Privacy policy" : "Zásady ochrany osobných údajov",
    "Adjust the Nextcloud theme" : "Upraviť motív vzhľadu Nextcloudu",
    "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA,  v režime vysokého kontrastu dokonca na úrovni AAA.",
    "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ak nájdete nejaký problém, neváhajte a nahláste ho na {issuetracker}nástroj na sledovanie problémov{linkend}. A ak sa chcete zapojiť, pripojte sa k {designteam}nášmu dizajnérskemu tímu{linkend}!",
    "Open documentation" : "Otvoriť dokumentáciu",
    "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Zmena vzhľadu umožňuje ľahko upraviť pocit z vašej inštalácie a podporovaných klientov. Toto bude viditeľné pre všetkých klientov.",
    "Name" : "Názov",
    "Reset to default" : "Nastaviť predvolené",
    "Web link" : "Webový odkaz",
    "https://…" : "https://...",
    "Slogan" : "Slogan",
    "Color" : "Farba",
    "Logo" : "Logo",
    "Upload new logo" : "Nahrať nové logo",
    "Login image" : "Prihlasovací obrázok",
    "Upload new login background" : "Nahrať nové prihlasovacie pozadie",
    "Remove background image" : "Odstrániť obrázok pozadia",
    "Advanced options" : "Pokročilé možnosti",
    "Legal notice link" : "Odkaz na právne upozornenie",
    "Privacy policy link" : "Odkaz na zásady ochrany osobných údajov",
    "Header logo" : "Logo v hlavičke",
    "Upload new header logo" : "Nahrať nové logo do hlavičky",
    "Favicon" : "Favicon",
    "Upload new favicon" : "Nahrať novú ikonu webu",
    "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Ak chcete automaticky generovať favikony na základe nahraného loga a farby, nainštalujte rozšírenie Imagemagick PHP s podporou pre SVG obrázky."
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");