// Copyright 2020 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 cache import ( "fmt" "strconv" "time" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/nosql" "gitea.com/go-chi/cache" "github.com/go-redis/redis/v8" ) // RedisCacher represents a redis cache adapter implementation. type RedisCacher struct { c redis.UniversalClient prefix string hsetName string occupyMode bool } // toStr convert string/int/int64 interface to string. it's only used by the RedisCacher.Put internally func toStr(v interface{}) string { if v == nil { return "" } switch v := v.(type) { case string: return v case []byte: return string(v) case int: return strconv.FormatInt(int64(v), 10) case int64: return strconv.FormatInt(v, 10) default: return fmt.Sprint(v) // as what the old com.ToStr does in most cases } } // Put puts value (string type) into cache with key and expire time. // If expired is 0, it lives forever. func (c *RedisCacher) Put(key string, val interface{}, expire int64) error { // this function is not well-designed, it only puts string values into cache key = c.prefix + key if expire == 0 { if err := c.c.Set(graceful.GetManager().HammerContext(), key, toStr(val), 0).Err(); err != nil { return err } } else { dur := time.Duration(expire) * time.Second if err := c.c.Set(graceful.GetManager().HammerContext(), key, toStr(val), dur).Err(); err != nil { return err } } if c.occupyMode { return nil } return c.c.HSet(graceful.GetManager().HammerContext(), c.hsetName, key, "0").Err() } // Get gets cached value by given key. func (c *RedisCacher) Get(key string) interface{} { val, err := c.c.Get(graceful.GetManager().HammerContext(), c.prefix+key).Result() if err != nil { return nil } return val } // Delete deletes cached value by given key. func (c *RedisCacher) Delete(key string) error { key = c.prefix + key if err := c.c.Del(graceful.GetManager().HammerContext(), key).Err(); err != nil { return err } if c.occupyMode { return nil } return c.c.HDel(graceful.GetManager().HammerContext(), c.hsetName, key).Err() } // Incr increases cached int-type value by given key as a counter. func (c *RedisCacher) Incr(key string) error { if !c.IsExist(key) { return fmt.Errorf("key '%s' not exist", key) } return c.c.Incr(graceful.GetManager().HammerContext(), c.prefix+key).Err() } // Decr decreases cached int-type value by given key as a counter. func (c *RedisCacher) Decr(key string) error { if !c.IsExist(key) { return fmt.Errorf("key '%s' not exist", key) } return c.c.Decr(graceful.GetManager().HammerContext(), c.prefix+key).Err() } // IsExist returns true if cached value exists. func (c *RedisCacher) IsExist(key string) bool { if c.c.Exists(graceful.GetManager().HammerContext(), c.prefix+key).Val() == 1 { return true } if !c.occupyMode { c.c.HDel(graceful.GetManager().HammerContext(), c.hsetName, c.prefix+key) } return false } // Flush deletes all cached data. func (c *RedisCacher) Flush() error { if c.occupyMode { return c.c.FlushDB(graceful.GetManager().HammerContext()).Err() } keys, err := c.c.HKeys(graceful.GetManager().HammerContext(), c.hsetName).Result() if err != nil { return err } if err = c.c.Del(graceful.GetManager().HammerContext(), keys...).Err(); err != nil { return err } return c.c.Del(graceful.GetManager().HammerContext(), c.hsetName).Err() } // StartAndGC starts GC routine based on config string settings. // AdapterConfig: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180,hset_name=MacaronCache,prefix=cache: func (c *RedisCacher) StartAndGC(opts cache.Options) error { c.hsetName = "MacaronCache" c.occupyMode = opts.OccupyMode uri := nosql.ToRedisURI(opts.AdapterConfig) c.c = nosql.GetManager().GetRedisClient(uri.String()) for k, v := range uri.Query() { switch k { case "hset_name": c.hsetName = v[0] case "prefix": c.prefix = v[0] } } return c.c.Ping(graceful.GetManager().HammerContext()).Err() } // Ping tests if the cache is alive. func (c *RedisCacher) Ping() error { return c.c.Ping(graceful.GetManager().HammerContext()).Err() } func init() { cache.Register("redis", &RedisCacher{}) } Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
summaryrefslogtreecommitdiffstats
path: root/core/l10n/nn_NO.json
blob: 654df3317cb677b9487b6d1a057f870998172e39 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
{ "translations": {
    "Couldn't send mail to following users: %s " : "Kunne ikkje snede e-post til følgande brukarar: %s ",
    "Turned on maintenance mode" : "Skrudde på vedlikehaldsmodus",
    "Turned off maintenance mode" : "Skrudde av vedlikehaldsmodus",
    "Updated database" : "Database oppdatert",
    "No image or file provided" : "Inga bilete eller fil gjeve",
    "Unknown filetype" : "Ukjend filtype",
    "Invalid image" : "Ugyldig bilete",
    "No temporary profile picture available, try again" : "Inga midlertidig profilbilete tilgjengeleg, prøv igjen",
    "No crop data provided" : "Ingen beskjeringsdata gjeve",
    "Sunday" : "Søndag",
    "Monday" : "Måndag",
    "Tuesday" : "Tysdag",
    "Wednesday" : "Onsdag",
    "Thursday" : "Torsdag",
    "Friday" : "Fredag",
    "Saturday" : "Laurdag",
    "Sun." : "Søn.",
    "Mon." : "Mån.",
    "Tue." : "Tys.",
    "Wed." : "Ons.",
    "Thu." : "Tor.",
    "Fri." : "Fre.",
    "Sat." : "Lau.",
    "January" : "Januar",
    "February" : "Februar",
    "March" : "Mars",
    "April" : "April",
    "May" : "Mai",
    "June" : "Juni",
    "July" : "Juli",
    "August" : "August",
    "September" : "September",
    "October" : "Oktober",
    "November" : "November",
    "December" : "Desember",
    "Jan." : "Jan.",
    "Feb." : "Feb.",
    "Mar." : "Mar,",
    "Apr." : "Apr.",
    "May." : "Mai.",
    "Jun." : "Jun.",
    "Jul." : "Jul.",
    "Aug." : "Aug.",
    "Sep." : "Sep.",
    "Oct." : "Okt.",
    "Nov." : "Nov.",
    "Dec." : "Des.",
    "Settings" : "Innstillingar",
    "Saving..." : "Lagrar …",
    "seconds ago" : "sekund sidan",
    "I know what I'm doing" : "Eg veit kva eg gjer",
    "No" : "Nei",
    "Yes" : "Ja",
    "Choose" : "Vel",
    "Error loading file picker template: {error}" : "Klarte ikkje å lasta filplukkarmal: {error}",
    "Ok" : "Greitt",
    "Error loading message template: {error}" : "Klarte ikkje å lasta meldingsmal: {error}",
    "_{count} file conflict_::_{count} file conflicts_" : ["{count} filkonflikt","{count} filkonfliktar"],
    "One file conflict" : "Éin filkonflikt",
    "Which files do you want to keep?" : "Kva filer vil du spara?",
    "If you select both versions, the copied file will have a number added to its name." : "Viss du vel begge utgåvene, vil den kopierte fila få eit tal lagt til namnet.",
    "Cancel" : "Avbryt",
    "Continue" : "Gå vidare",
    "(all selected)" : "(alle valte)",
    "({count} selected)" : "({count} valte)",
    "Error loading file exists template" : "Klarte ikkje å lasta fil-finst-mal",
    "Very weak password" : "Veldig svakt passord",
    "Weak password" : "Svakt passord",
    "Shared" : "Delt",
    "Error" : "Feil",
    "Error while sharing" : "Feil ved deling",
    "Error while unsharing" : "Feil ved udeling",
    "Error while changing permissions" : "Feil ved endring av tillatingar",
    "Error setting expiration date" : "Klarte ikkje setja utløpsdato",
    "Set expiration date" : "Set utløpsdato",
    "Expiration date" : "Utløpsdato",
    "Sending ..." : "Sender …",
    "Email sent" : "E-post sendt",
    "Resharing is not allowed" : "Vidaredeling er ikkje tillate",
    "Share link" : "Del lenkje",
    "Password protect" : "Passordvern",
    "Password" : "Passord",
    "Choose a password for the public link" : "Vel eit passord for den offentlege lenkja",
    "Email link to person" : "Send lenkja over e-post",
    "Send" : "Send",
    "Shared with you and the group {group} by {owner}" : "Delt med deg og gruppa {group} av {owner}",
    "Shared with you by {owner}" : "Delt med deg av {owner}",
    "Shared in {item} with {user}" : "Delt i {item} med {brukar}",
    "group" : "gruppe",
    "Unshare" : "Udel",
    "can share" : "kan dela",
    "can edit" : "kan endra",
    "create" : "lag",
    "delete" : "slett",
    "access control" : "tilgangskontroll",
    "Share" : "Del",
    "Warning" : "Åtvaring",
    "The object type is not specified." : "Objekttypen er ikkje spesifisert.",
    "Delete" : "Slett",
    "Add" : "Legg til",
    "The update was successful. Redirecting you to ownCloud now." : "Oppdateringa er fullført. Sender deg vidare til ownCloud no.",
    "%s password reset" : "%s passordnullstilling",
    "Use the following link to reset your password: {link}" : "Klikk følgjande lenkje til å nullstilla passordet ditt: {link}",
    "New password" : "Nytt passord",
    "Reset password" : "Nullstill passord",
    "Personal" : "Personleg",
    "Users" : "Brukarar",
    "Apps" : "Program",
    "Admin" : "Admin",
    "Help" : "Hjelp",
    "Access forbidden" : "Tilgang forbudt",
    "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Datamappa og filene dine er sannsynlegvis tilgjengelege frå Internett sidan .htaccess-fila ikkje fungerer.",
    "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Ver venleg og les <a href=\"%s\" target=\"_blank\">dokumentasjonen</a> for meir informasjon om korleis du konfigurerer tenaren din.",
    "Create an <strong>admin account</strong>" : "Lag ein <strong>admin-konto</strong>",
    "Username" : "Brukarnamn",
    "Data folder" : "Datamappe",
    "Configure the database" : "Set opp databasen",
    "Database user" : "Databasebrukar",
    "Database password" : "Databasepassord",
    "Database name" : "Databasenamn",
    "Database tablespace" : "Tabellnamnrom for database",
    "Database host" : "Databasetenar",
    "Finish setup" : "Fullfør oppsettet",
    "Log out" : "Logg ut",
    "Search" : "Søk",
    "Log in" : "Logg inn",
    "remember" : "hugs",
    "Alternative Logins" : "Alternative innloggingar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}