--[[ Copyright (c) 2011-2017, Vsevolod Stakhov Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ]]-- -- This is main lua config file for rspamd local E = {} local fun = require "fun" local util = require "rspamd_util" local rspamd_regexp = require "rspamd_regexp" local rspamd_lua_utils = require "lua_util" -- Different text parts rspamd_config.R_PARTS_DIFFER = { callback = function(task) local distance = task:get_mempool():get_variable('parts_distance', 'double') if distance then local nd = tonumber(distance) -- ND is relation of different words to total words if nd >= 0.5 then local tw = task:get_mempool():get_variable('total_words', 'int') if tw then local score if tw > 30 then -- We are confident about difference score = (nd - 0.5) * 2.0 else -- We are not so confident about difference score = (nd - 0.5) end task:insert_result('R_PARTS_DIFFER', score, string.format('%.1f%%', tostring(100.0 * nd))) end end end return false end, score = 1.0, description = 'Text and HTML parts differ', group = 'body' } -- Date issues rspamd_config.MISSING_DATE = { callback = function(task) local date = task:get_header_raw('Date') if date == nil or date == '' then return true end return false end, score = 1.0, description = 'Message date is missing', group = 'headers', type = 'mime', } rspamd_config.DATE_IN_FUTURE = { callback = function(task) local dm = task:get_date{format = 'message', gmt = true} local dt = task:get_date{format = 'connect', gmt = true} -- 2 hours if dm > 0 and dm - dt > 7200 then return true end return false end, score = 4.0, description = 'Message date is in future', group = 'headers', type = 'mime', } rspamd_config.DATE_IN_PAST = { callback = function(task) local dm = task:get_date{format = 'message', gmt = true} local dt = task:get_date{format = 'connect', gmt = true} -- A day if dm > 0 and dt - dm > 86400 then return true end return false end, score = 1.0, description = 'Message date is in past', group = 'headers', type = 'mime', } local obscured_id = rspamd_config:register_symbol{ callback = function(task) local urls = task:get_urls() if urls then for _,u in ipairs(urls) do local fl = u:get_flags() if fl.obscured then task:insert_result('R_SUSPICIOUS_URL', 1.0, u:get_host()) end if fl.zw_spaces then task:insert_result('ZERO_WIDTH_SPACE_URL', 1.0, u:get_host()) end end end return false end, name = 'R_SUSPICIOUS_URL', score = 5.0, one_shot = true, description = 'Obfusicated or suspicious URL has been found in a message', group = 'url' } rspamd_config:register_symbol{ type = 'virtual', name = 'ZERO_WIDTH_SPACE_URL', score = 7.0, one_shot = true, description = 'Zero width space in url', group = 'url', parent = obscured_id, } rspamd_config.ENVFROM_PRVS = { callback = function (task) --[[ Detect PRVS/BATV addresses to avoid FORGED_SENDER https://en.wikipedia.org/wiki/Bounce_Address_Tag_Validation Signature syntax: prvs=TAG=USER@example.com BATV draft (https://tools.ietf.org/html/draft-levine-smtp-batv-01) prvs=USER=TAG@example.com btv1==TAG==USER@example.com Barracuda appliance msprvs1=TAG=USER@example.com Sparkpost email delivery service ]]-- if not (task:has_from(1) and task:has_from(2)) then return false end local envfrom = task:get_from(1) local re_text = '^(?:(prvs|msprvs1)=([^=]+)=|btv1==[^=]+==)(.+@(.+))$' local re = rspamd_regexp.create_cached(re_text) local c = re:search(envfrom[1].addr:lower(), false, true) if not c then return false end local ef = c[1][4] -- See if it matches the From header local from = task:get_from(2) if ef == from[1].addr:lower() then return true end -- Check for prvs=USER=TAG@example.com local t = c[1][2] if t == 'prvs' then local efr = c[1][3] .. '@' .. c[1][5] if efr == from[1].addr:lower() then return true end end return false end, score = 0.0, description = "Envelope From is a PRVS address that matches the From address", group = 'headers', type = 'mime', } rspamd_config.ENVFROM_VERP = { callback = function (task) if not (task:has_from(1) and task:has_recipients(1)) then return false end local envfrom = task:get_from(1) local envrcpts = task:get_recipients(1) -- VERP only works for single recipient messages if #envrcpts > 1 then return false end -- Get recipient and compute VERP address local rcpt = envrcpts[1].addr:lower() local verp = rcpt:gsub('@','=') -- Get the user portion of the envfrom local ef_user = envfrom[1].user:lower() -- See if the VERP representation of the recipient appears in it if ef_user:find(verp, 1, true) and not ef_user:find('+caf_=' .. verp, 1, true) -- Google Forwarding and not ef_user:find('^srs[01]=') -- SRS then return true end return false end, score = 0.0, description = "Envelope From is a VERP address", group = "headers", type = 'mime', } local check_rcvd = rspamd_config:register_symbol{ name = 'CHECK_RCVD', group = 'headers', callback = function (task) local rcvds = task:get_received_headers() if not rcvds or #rcvds == 0 then return false end local all_tls = fun.all(function(rc) return rc.flags and rc.flags['ssl'] end, fun.filter(function(rc) return rc.by_hostname and rc.by_hostname ~= 'localhost' end, rcvds)) -- See if only the last hop was encrypted if all_tls then task:insert_result('RCVD_TLS_ALL', 1.0) else local rcvd = rcvds[1] if rcvd.by_hostname and rcvd.by_hostname == 'localhost' then -- Ignore artificial header from Rmilter rcvd = rcvds[2] or {} end if rcvd.flags and rcvd.flags['ssl'] then task:insert_result('RCVD_TLS_LAST', 1.0) else task:insert_result('RCVD_NO_TLS_LAST', 1.0) end end local auth = fun.any(function(rc) return rc.flags and rc.flags['authenticated'] end, rcvds) if auth then task:insert_result('RCVD_VIA_SMTP_AUTH', 1.0) end end, type = 'callback,mime', } rspamd_config:register_symbol{ type = 'virtual', parent = check_rcvd, name = 'RCVD_TLS_ALL', description = 'All hops used encrypted transports', score = 0.0, group = 'headers' } rspamd_config:register_symbol{ type = 'virtual', parent = check_rcvd, name = 'RCVD_TLS_LAST', description = 'Last hop used encrypted transports', score = 0.0, group = 'headers' } rspamd_config:register_symbol{ type = 'virtual', parent = check_rcvd, name = 'RCVD_NO_TLS_LAST', description = 'Last hop did not use encrypted transports', score = 0.1, group = 'headers' } rspamd_config:register_symbol{ type = 'virtual', parent = check_rcvd, name = 'RCVD_VIA_SMTP_AUTH', -- NB This does not mean sender was authenticated; see task:get_user() description = 'Authenticated hand-off was seen in Received headers', score = 0.0, group = 'headers' } rspamd_config.RCVD_HELO_USER = { callback = function (task) -- Check HELO argument from MTA local helo = task:get_helo() if (helo and helo:lower():find('^user$')) then return true end -- Check Received headers local rcvds = task:get_header_full('Received') if not rcvds then return false end for _, rcvd in ipairs(rcvds) do local r = rcvd['decoded']:lower() if (r:find("^%s*from%suser%s")) then return true end if (r:find("helo[%s=]user[%s%)]")) then return true end end end, description = 'HELO User spam pattern', group = 'headers', type = 'mime', score = 3.0 } rspamd_config.URI_COUNT_ODD = { callback = function (task) local ct = task:get_header('Content-Type') if (ct and ct:lower():find('^multipart/alternative')) then local urls = task:get_urls() or {} local nurls = fun.filter(function(url) return not url:is_html_displayed() end, urls):foldl(function(acc, val) return acc + val:get_count() end, 0) if nurls % 2 == 1 then return true, 1.0, tostring(nurls) end end end, description = 'Odd number of URIs in multipart/alternative message', score = 1.0, group = 'url', } rspamd_config.HAS_ATTACHMENT = { callback = function (task) local parts = task:get_parts() if parts and #parts > 1 then for _, p in ipairs(parts) do local cd = p:get_header('Content-Disposition') if (cd and cd:lower():match('^attachment')) then return true end end end end, description = 'Message contains attachments', group = 'body', } -- Requires freemail maps loaded in multimap local function freemail_reply_neq_from(task) local frt = task:get_symbol('FREEMAIL_REPLYTO') local ff = task:get_symbol('FREEMAIL_FROM') if (frt and ff and frt['options'] and ff['options'] and frt['options'][1] ~= ff['options'][1]) then return true end return false end rspamd_config:register_symbol({ name = 'FREEMAIL_REPLYTO_NEQ_FROM_DOM', callback = freemail_reply_neq_from, description = 'Freemail From and Reply-To, but to different Freemail services', score = 3.0, group = 'headers', }) rspamd_config:register_dependency('FREEMAIL_REPLYTO_NEQ_FROM_DOM', 'FREEMAIL_REPLYTO') rspamd_config:register_dependency('FREEMAIL_REPLYTO_NEQ_FROM_DOM', 'FREEMAIL_FROM') rspamd_config.OMOGRAPH_URL = { callback = function(task) local urls = task:get_urls() if urls then local bad_omographs = 0 local single_bad_omograps = 0 local bad_urls = {} local seen = {} fun.each(function(u) if u:is_phished() then local h1 = u:get_host() local h2 = u:get_phished():get_host() if h1 and h2 then local selt = string.format('%s->%s', h1, h2) if not seen[selt] and util.is_utf_spoofed(h1, h2) then bad_urls[#bad_urls + 1] = selt bad_omographs = bad_omographs + 1 end seen[selt] = true end end if not u:is_html_displayed() then local h = u:get_tld() if h then if not seen[h] and util.is_utf_spoofed(h) then bad_urls[#bad_urls + 1] = h single_bad_omograps = single_bad_omograps + 1 end seen[h] = true end end end, urls) if bad_omographs > 0 then return true, 1.0, bad_urls elseif single_bad_omograps > 0 then return true, 0.5, bad_urls end end return false end, score = 5.0, group = 'url', description = 'Url contains both latin and non-latin characters' } rspamd_config.URL_IN_SUBJECT = { callback = function(task) local urls = task:get_urls() if urls then for _,u in ipairs(urls) do local flags = u:get_flags() if flags.subject then if flags.schemaless then return true,0.1,u:get_host() end local subject = task:get_subject() if subject then if tostring(u) == subject then return true,1.0,u:get_host() end end return true,0.25,u:get_host() end end end return false end, score = 4.0, group = 'subject', type = 'mime', description = 'URL found in Subject' } local aliases_id = rspamd_config:register_symbol{ type = 'prefilter', name = 'EMAIL_PLUS_ALIASES', callback = function(task) local function check_from(type) if task:has_from(type) then local addr = task:get_from(type)[1] local na,tags = rspamd_lua_utils.remove_email_aliases(addr) if na then task:set_from(type, addr, 'alias') task:insert_result('TAGGED_FROM', 1.0, fun.totable( fun.filter(function(t) return t and #t > 0 end, tags))) end end end check_from('smtp') check_from('mime') local function check_rcpt(type) if task:has_recipients(type) then local modified = false local all_tags = {} local addrs = task:get_recipients(type) for _, addr in ipairs(addrs) do local na,tags = rspamd_lua_utils.remove_email_aliases(addr) if na then modified = true fun.each(function(t) table.insert(all_tags, t) end, fun.filter(function(t) return t and #t > 0 end, tags)) end end if modified then task:set_recipients(type, addrs) task:insert_result('TAGGED_RCPT', 1.0, all_tags) end end end check_rcpt('smtp') check_rcpt('mime') end, priority = 150, description = 'Removes plus aliases from the email', group = 'headers', } rspamd_config:register_symbol{ type = 'virtual', parent = aliases_id, name = 'TAGGED_RCPT', description = 'SMTP recipients have plus tags', group = 'headers', score = 0.0, } rspamd_config:register_symbol{ type = 'virtual', parent = aliases_id, name = 'TAGGED_FROM', description = 'SMTP from has plus tags', group = 'headers', score = 0.0, } local check_from_display_name = rspamd_config:register_symbol{ type = 'callback,mime', name = 'FROM_DISPLAY_CALLBACK', callback = function (task) local from = task:get_from(2) if not (from and from[1] and from[1].name) then return false end -- See if we can parse an email address from the name local parsed = util.parse_mail_address(from[1].name, task:get_mempool()) if not parsed then return false end if not (parsed[1] and parsed[1]['addr']) then return false end -- Make sure we did not mistake e.g. @ for an email address if not parsed[1]['domain'] or not parsed[1]['domain']:find('%.') then return false end -- See if the parsed domains differ if not util.strequal_caseless(from[1]['domain'], parsed[1]['domain']) then -- See if the destination domain is the same as the spoof local mto = task:get_recipients(2) local sto = task:get_recipients(1) if mto then for _, to in ipairs(mto) do if to['domain'] ~= '' and util.strequal_caseless(to['domain'], parsed[1]['domain']) then task:insert_result('SPOOF_DISPLAY_NAME', 1.0, from[1]['domain'], parsed[1]['domain']) return false end end end if sto then for _, to in ipairs(sto) do if to['domain'] ~= '' and util.strequal_caseless(to['domain'], parsed[1]['domain']) then task:insert_result('SPOOF_DISPLAY_NAME', 1.0, from[1]['domain'], parsed[1]['domain']) return false end end end task:insert_result('FROM_NEQ_DISPLAY_NAME', 1.0, from[1]['domain'], parsed[1]['domain']) end return false end, group = 'headers', } rspamd_config:register_symbol{ type = 'virtual', parent = check_from_display_name, name = 'SPOOF_DISPLAY_NAME', description = 'Display name is being used to spoof and trick the recipient', group = 'headers', score = 8.0, } rspamd_config:register_symbol{ type = 'virtual', parent = check_from_display_name, name = 'FROM_NEQ_DISPLAY_NAME', group = 'headers', description = 'Display name contains an email address different to the From address', score = 4.0, } rspamd_config.SPOOF_REPLYTO = { callback = function (task) -- First check for a Reply-To header local rt = task:get_header_full('Reply-To') if not rt or not rt[1] then return false end -- Get From and To headers rt = rt[1]['value'] local from = task:get_from(2) local to = task:get_recipients(2) if not (from and from[1] and from[1].addr) then return false end if (to and to[1] and to[1].addr) then -- Handle common case for Web Contact forms of From = To if util.strequal_caseless(from[1].addr, to[1].addr) then return false end end -- SMTP recipients must contain From domain to = task:get_recipients(1) if not to then return false end -- Try mitigate some possible FPs on mailing list posts if #to == 1 and util.strequal_caseless(to[1].addr, from[1].addr) then return false end local found_fromdom = false for _, t in ipairs(to) do if util.strequal_caseless(t.domain, from[1].domain) then found_fromdom = true break end end if not found_fromdom then return false end -- Parse Reply-To header local parsed = ((util.parse_mail_address(rt, task:get_mempool()) or E)[1] or E).domain if not parsed then return false end -- Reply-To domain must be different to From domain if not util.strequal_caseless(parsed, from[1].domain) then return true, from[1].domain, parsed end return false end, group = 'headers', type = 'mime', description = 'Reply-To is being used to spoof and trick the recipient to send an off-domain reply', score = 6.0 } rspamd_config.INFO_TO_INFO_LU = { callback = function(task) local lu = task:get_header('List-Unsubscribe') if not lu then return false end local from = task:get_from('mime') if not (from and from[1] and util.strequal_caseless(from[1].user, 'info')) then return false end local to = task:get_recipients('smtp') if not to then return false end local found = false for _,r in ipairs(to) do if util.strequal_caseless(r['user'], 'info') then found = true end end if found then return true end return false end, description = 'info@ From/To address with List-Unsubscribe headers', group = 'headers', score = 2.0, type = 'mime', } -- Detects bad content-transfer-encoding for text parts rspamd_config.R_BAD_CTE_7BIT = { callback = function(task) local tp = task:get_text_parts() or {} for _,p in ipairs(tp) do local cte = p:get_mimepart():get_cte() or '' if cte ~= '8bit' and p:has_8bit_raw() then local _,_,attrs = p:get_mimepart():get_type_full() local mul = 1.0 local params = {cte} if attrs then if attrs.charset and attrs.charset:lower() == "utf-8" then -- Penalise rule as people don't know that utf8 is surprisingly -- eight bit encoding mul = 0.3 table.insert(params, "utf8") end end return true,mul,params end end return false end, score = 3.5, description = 'Detects bad content-transfer-encoding for text parts', group = 'headers', type = 'mime', } local check_encrypted_name = rspamd_config:register_symbol{ name = 'BOGUS_ENCRYPTED_AND_TEXT', callback = function(task) local parts = task:get_parts() or {} local seen_encrypted, seen_text local opts = {} local function check_part(part) if part:is_multipart() then local children = part:get_children() or {} for _,cld in ipairs(children) do if cld:is_multipart() then check_part(cld) elseif cld:is_text() then seen_text = true else local type,subtype,_ = cld:get_type_full() if type:lower() == 'application' then if string.find(subtype:lower(), 'pkcs7%-mime') then -- S/MIME encrypted part seen_encrypted = true table.insert(opts, 'smime part') task:insert_result('ENCRYPTED_SMIME', 1.0) elseif string.find(subtype:lower(), 'pkcs7%-signature') then task:insert_result('SIGNED_SMIME', 1.0) elseif string.find(subtype:lower(), 'pgp%-encrypted') then -- PGP/GnuPG encrypted part seen_encrypted = true table.insert(opts, 'pgp part') task:insert_result('ENCRYPTED_PGP', 1.0) elseif string.find(subtype:lower(), 'pgp%-signature') then task:insert_result('SIGNED_PGP', 1.0) end end end end end end for _,part in ipairs(parts) do check_part(part) end if seen_text and seen_encrypted then return true, 1.0, opts end return false end, score = 10.0, description = 'Bogus mix of encrypted and text/html payloads', group = 'mime_types', } rspamd_config:register_symbol{ type = 'virtual', parent = check_encrypted_name, name = 'ENCRYPTED_PGP', description = 'Message is encrypted with pgp', group = 'mime_types', score = -0.5, one_shot = true } rspamd_config:register_symbol{ type = 'virtual', parent = check_encrypted_name, name = 'ENCRYPTED_SMIME', description = 'Message is encrypted with smime', group = 'mime_types', score = -0.5, one_shot = true } rspamd_config:register_symbol{ type = 'virtual', parent = check_encrypted_name, name = 'SIGNED_PGP', description = 'Message is signed with pgp', group = 'mime_types', score = -2.0, one_shot = true } rspamd_config:register_symbol{ type = 'virtual', parent = check_encrypted_name, name = 'SIGNED_SMIME', description = 'Message is signed with smime', group = 'mime_types', score = -2.0, one_shot = true } Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
summaryrefslogtreecommitdiffstats
blob: 8a682730bc1c83a5009670856a27df9e9c3ad877 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
{ "translations": {
    "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til den er ferdig.",
    "Migration started …" : "Migrering startet…",
    "Saved" : "Lagret",
    "Not saved" : "Ikke lagret",
    "Sending…" : "Sender…",
    "Email sent" : "E-post sendt",
    "Private" : "Privat",
    "Public" : "Offentlig",
    "Verify" : "Bekreft",
    "Verifying …" : "Bekrefter…",
    "Unable to change password" : "Kunne ikke endre passord",
    "Very weak password" : "Veldig svakt passord",
    "Weak password" : "Svakt passord",
    "So-so password" : "Bob-bob-passord",
    "Good password" : "Bra passord",
    "Strong password" : "Sterkt passord",
    "An error occurred while changing your language. Please reload the page and try again." : "En feil oppstod under endring av språk. Last inn siden på nytt og prøv igjen.",
    "An error occurred while changing your locale. Please reload the page and try again." : "En feil oppstod under endring av nasjonal innstilling. Last inn siden på nytt og prøv igjen.",
    "Select a profile picture" : "Velg et profilbilde",
    "Week starts on {fdow}" : "Uken starter på {fdow}",
    "Groups" : "Grupper",
    "Group list is empty" : "Gruppeliste er tom",
    "Unable to retrieve the group list" : "Kunne ikke hente gruppelisten",
    "{actor} added you to group {group}" : "{actor} la deg til i gruppen {group}",
    "You added {user} to group {group}" : "Du la til {user} i gruppen {group}",
    "{actor} added {user} to group {group}" : "{actor} la {user} til i gruppen {group}",
    "An administrator added you to group {group}" : "En administrator la deg til i gruppen {group}",
    "An administrator added {user} to group {group}" : "En administrator la {user} til i gruppen {group}",
    "{actor} removed you from group {group}" : "{actor} fjernet deg fra gruppen {group}",
    "You removed {user} from group {group}" : "Du fjernet {user} fra gruppen {group}",
    "{actor} removed {user} from group {group}" : "{actor} fjernet {user} fra gruppen {group}",
    "An administrator removed you from group {group}" : "En administrator fjernet deg fra gruppen {group}",
    "An administrator removed {user} from group {group}" : "En administrator fjernet {user} fra gruppen {group}",
    "Your <strong>group memberships</strong> were modified" : "Dine<strong>gruppemedlemskap</strong> ble endret",
    "{actor} changed your password" : "{actor} endret ditt passord",
    "You changed your password" : "Du endret ditt passord",
    "Your password was reset by an administrator" : "Ditt passord ble tilbakestilt av en administrator",
    "{actor} changed your email address" : "{actor} endret din e-postadresse",
    "You changed your email address" : "Du endret din e-postadresse",
    "Your email address was changed by an administrator" : "Din e-postadresse ble endret av en administrator",
    "You created app password \"{token}\"" : "Du opprettet app-passord \"{token}\"",
    "You deleted app password \"{token}\"" : "Du slettet app-passord \"{token}\"",
    "You renamed app password \"{token}\" to \"{newToken}\"" : "Du endret navn på app-passord \"{token}\" til \"{newToken}\"",
    "You granted filesystem access to app password \"{token}\"" : "Du har gitt filsystemtilgang til app-passord \"{token}\"",
    "You revoked filesystem access from app password \"{token}\"" : "Du tilbakekalte filsystemtilgang fra app-passordet \"{token}\"",
    "Security" : "Sikkerhet",
    "You successfully logged in using two-factor authentication (%1$s)" : "Din innlogging med to-trinns bekreftelse var velykket (%1$s)",
    "A login attempt using two-factor authentication failed (%1$s)" : "En innlogging med to-trinns bekreftelse mislyktes (%1$s)",
    "Your <strong>password</strong> or <strong>email</strong> was modified" : "Ditt <strong>passord</strong> eller din <strong>e-postadresse</strong> ble endret",
    "Couldn't remove app." : "Klarte ikke å fjerne app.",
    "Couldn't update app." : "Kunne ikke oppdatere appen.",
    "Wrong password" : "Feil passord",
    "No user supplied" : "Ingen bruker angitt",
    "Authentication error" : "Autentiseringsfeil",
    "Please provide an admin recovery password; otherwise, all user data will be lost." : "Angi et administrativt gjenopprettingspassord; ellers vil alle brukerdata gå tapt.",
    "Wrong admin recovery password. Please check the password and try again." : "Feil administrativt gjenopprettingspassord. Sjekk passordet og prøv igjen.",
    "Backend doesn't support password change, but the user's encryption key was updated." : "Serveren støtter ikke endring av passord, men brukerens krypteringsnøkkel ble oppdatert.",
    "installing and updating apps via the app store or Federated Cloud Sharing" : "installering og oppdatering av apper via app-butikken eller ved deling i sammenknyttet sky",
    "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
    "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL bruker en utdatert %1$s-versjon (%2$s). Oppdater operativsystemet ditt; ellers vil ikke funksjoner som %3$s virke pålitelig.",
    "Invalid SMTP password." : "Ugyldig SMTP-passord.",
    "Email setting test" : "E-postinnstillingstest",
    "Well done, %s!" : "Bra gjort, %s!",
    "If you received this email, the email configuration seems to be correct." : "Hvis du mottar denne e-posten, er e-postoppsettet rett.",
    "Email could not be sent. Check your mail server log" : "E-post kunne ikke sendes. Sjekk serverloggen på din e-postserver",
    "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Et problem oppstod med sending av e-post. Sjekk innstillingene. (Feil: %s)",
    "You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.",
    "Invalid mail address" : "Ugyldig e-postadresse",
    "Settings saved" : "Innstillinger lagret",
    "Unable to change full name" : "Klarte ikke å endre fullt navn",
    "Unable to change email address" : "Klarer ikke å endre e-postadresse",
    "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "For å bekrefte din Twitter-konto, post følgende tvitring på Twitter (pass på å ikke få med noen linjeskift):",
    "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "For å bekrefte din nettside, lagre følgende innhold på roten av din netserver på '.well-known/CloudIdVerificationCode.txt' (forsikre deg om at hele teksten er på ei linje):",
    "%1$s changed your password on %2$s." : "%1$s endret ditt passord på %2$s.",
    "Your password on %s was changed." : "Ditt passord på %s ble endret.",
    "Your password on %s was reset by an administrator." : "Passordet ditt på %s ble tilbakestilt av en administrator.",
    "Password for %1$s changed on %2$s" : "Passord for %1$s endret på %2$s",
    "Password changed for %s" : "Passord endret for %s",
    "If you did not request this, please contact an administrator." : "Hvis du ikke forespurte dette, kontakt en administrator.",
    "Your email address on %s was changed." : "Din e-postadresse på %s ble endret.",
    "Your email address on %s was changed by an administrator." : "Din e-postadresse på %s ble endret av en administrator.",
    "Email address for %1$s changed on %2$s" : "E-postadresse for %1$s endret på %2$s",
    "Email address changed for %s" : "E-postadresse endret for %s",
    "The new email address is %s" : "Den nye e-postadressen er %s",
    "Your %s account was created" : "%s-kontoen din ble opprettet",
    "Welcome aboard" : "Velkommen ombord",
    "Welcome aboard %s" : "Velkommen ombord i %s",
    "Welcome to your %s account, you can add, protect, and share your data." : "Velkommen til din %s-konto, du kan legge til, beskytte og dele din data.",
    "Your username is: %s" : "Ditt brukernavn er: %s",
    "Set your password" : "Sett passordet ditt",
    "Go to %s" : "Gå til %s",
    "Install Client" : "Installer klient",
    "Logged in user must be a subadmin" : "Innlogget bruker må være subadministrator",
    "Settings" : "Innstillinger",
    "Personal" : "Personlig",
    "Administration" : "Administrasjon",
    "Additional settings" : "Flere innstillinger",
    "Groupware" : "Gruppevare",
    "Overview" : "Oversikt",
    "Basic settings" : "Grunninnstillinger",
    "Sharing" : "Deling",
    "Personal info" : "Personlig informasjon",
    "Create" : "Ny",
    "Change" : "Endre",
    "Delete" : "Slett",
    "Unlimited" : "Ubegrenset",
    "Verifying" : "Verifiserer",
    "Nextcloud settings" : "Nextcloud innstillinger",
    "Enforce two-factor authentication" : "Krev tofaktor-autentisering",
    "Limit to groups" : "Begrens til grupper",
    "Enforcement of two-factor authentication can be set for certain groups only." : "Håndheving av tofaktor-autentisering kan bare settes for enkelte grupper.",
    "Enforced groups" : "Håndhevde grupper",
    "Excluded groups" : "Utelukkede grupper",
    "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Når grupper velges/velges bort, bruker de følgende logikk for å avgjøre om en bruker har 2FA håndhevet: Hvis ingen grupper er valgt, er 2FA aktivert for alle unntatt medlemmer av de utelukkede gruppene. Hvis grupper er valgt, er 2FA aktivert for alle medlemmer av disse. Hvis en bruker er både i en valgt og utelukket gruppe, har den valgte forrang og 2FA håndheves.",
    "Save changes" : "Lagre endringer",
    "Supported" : "Støttet",
    "Featured" : "Anbefalt",
    "by" : "av",
    "Update to {version}" : "Oppdater til {version}",
    "Remove" : "Fjern",
    "Disable" : "Deaktiver ",
    "All" : "Alle",
    "Limit app usage to groups" : "Begrens app-bruk til grupper",
    "No results" : "Ingen resultater",
    "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Denne appen har ingen minimumversjon av Nextcloud definert. Dette vil være en feil i fremtiden.",
    "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Denne appen har ingen høyeste versjon av Nextcloud definert. Dette vil være en feil i fremtiden.",
    "This app cannot be installed because the following dependencies are not fulfilled:" : "Denne appen kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt:",
    "View in store" : "Vis i butikk",
    "Visit website" : "Besøk nettsiden",
    "Report a bug" : "Rapporter en feil",
    "User documentation" : "Brukerdokumentasjon",
    "Admin documentation" : "Administratordokumentasjon",
    "Developer documentation" : "Utviklerdokumentasjon",
    "Update to {update}" : "Oppdater til {update}",
    "Results from other categories" : "Resultater fra andre kategorier",
    "No apps found for your version" : "Ingen apper funnet for din versjon",
    "Disable all" : "Deaktiver alle",
    "Enable all" : "Aktiver alle",
    "Download and enable" : "Last ned og aktiver",
    "Enable" : "Aktiver",
    "Enable untested app" : "Aktiver utestet app",
    "The app will be downloaded from the app store" : "Denne appen vil bli lastet ned fra app-butikken",
    "Device settings" : "Enhetsinnstillinger",
    "Allow filesystem access" : "Tillatt filsystemtilgang",
    "Rename" : "Gi nytt navn",
    "Revoke" : "Avslå",
    "Wipe device" : "Slett enhet",
    "Internet Explorer" : "Internet Explorer",
    "Edge" : "Edge",
    "Firefox" : "Firefox",
    "Google Chrome" : "Google Chrome",
    "Safari" : "Safari",
    "Google Chrome for Android" : "Google Chrome for Android",
    "iPhone" : "iPhone",
    "iPad" : "iPad",
    "Nextcloud iOS app" : "Nextcloud iOS-app",
    "Nextcloud Android app" : "Nextcloud Android-app",
    "Nextcloud Talk for iOS" : "Nextcloud Talk for iOS",
    "Nextcloud Talk for Android" : "Nextcloud Talk for Android",
    "Sync client - {os}" : "Synkroniseringsklient - {os}",
    "This session" : "Denne økten",
    "Device" : "Enhet",
    "Last activity" : "Seneste aktivitet",
    "Devices & sessions" : "Enheter og økter",
    "Web, desktop and mobile clients currently logged in to your account." : "Følgende nett, skrivebord og mobile klienter er for øyeblikket logget på din konto.",
    "Confirm wipe" : "Bekreft sletting",
    "Error while creating device token" : "Feil under opprettelse av enhetsnøkkel",
    "Error while deleting the token" : "Feil under sletting av nøkkel",
    "App name" : "Appnavn",
    "Create new app password" : "Lag nytt apppassord",
    "Use the credentials below to configure your app or device." : "Bruk påloggingsinformasjonen under for å sette opp appen på din mobile enhet.",
    "For security reasons this password will only be shown once." : "For sikkerhetens skyld vil dette passordet kun vises en gang.",
    "Username" : "Brukernavn",
    "Password" : "Passord",
    "Done" : "Ferdig",
    "Show QR code for mobile apps" : "Vis QR-kode for mobilapper",
    "Copied!" : "Kopiert!",
    "Copy" : "Kopier",
    "Could not copy app password. Please copy it manually." : "Kunne ikke kopiere passord. Venligst kopier manuelt.",
    "You do not have permissions to see the details of this user" : "Du har ikke tilgang til å se detaljer om denne brukeren",
    "Add user in group" : "Legg til bruker til gruppe",
    "Set user as admin for" : "Sett bruker som administrator for",
    "Select user quota" : "Velg brukerkvote",
    "No language set" : "Språk ikke satt",
    "Delete user" : "Slett bruker",
    "Wipe all devices" : "Slett alle enheter",
    "Disable user" : "Deaktiver bruker",
    "Enable user" : "Aktiver bruker",
    "Resend welcome email" : "Send velkomst-epost igjen",
    "Cancel" : "Avbryt",
    "Welcome mail sent!" : "Velkomst-epost sendt!",
    "{size} used" : "{size} brukt",
    "Will be autogenerated" : "Blir generert automatisk",
    "Display name" : "Visningsnavn",
    "Email" : "E-post",
    "Default language" : "Standard språk",
    "Add a new user" : "Legg til en ny bruker",
    "Close" : "Lukk",
    "Group admin for" : "Gruppeadministrator for",
    "Quota" : "Kvote",
    "Language" : "Språk",
    "User backend" : "Bruker-server",
    "Storage location" : "Lagringsplassering",
    "Last login" : "Siste innlogging",
    "No users in here" : "Ingen brukere her",
    "Default quota" : "Standard kvote",
    "Common languages" : "Vanlige språk",
    "All languages" : "Alle språk",
    "Password change is disabled because the master key is disabled" : "Passordendring er deaktivert fordi hoved-nøkkelen er deaktivert",
    "Add" : "Legg til",
    "Unnamed device" : "Ikke navngitt enhet",
    "Your apps" : "Dine apper",
    "Active apps" : "Aktive apper",
    "Disabled apps" : "Deaktiverte apper",
    "Updates" : "Oppdateringer",
    "App bundles" : "App-pakker",
    "{license}-licensed" : "{license}-lisensiert",
    "New user" : "Ny bruker",
    "Add group" : "Legg til gruppe",
    "Everyone" : "Alle",
    "Admins" : "Administratorer",
    "Disabled users" : "Deaktiverte brukere",
    "Remove group" : "Fjern gruppe",
    "Default quota:" : "Standard kvote:",
    "Select default quota" : "Sett standard kvote",
    "Show Languages" : "Vis språk",
    "Show last login" : "Vis siste innlogging",
    "Show user backend" : "Vis bruker-bakende",
    "Show storage path" : "Vis lagrings-sti",
    "Send email to new user" : "Send e-post til ny bruker",
    "You are about to remove the group {group}. The users will NOT be deleted." : "Du skal til å fjerne gruppen {group}. Brukerne vil IKKE bli slettet.",
    "Please confirm the group removal " : "Vennligst bekreft fjerning av gruppe",
    "Never" : "Aldri",
    "An error occured during the request. Unable to proceed." : "En feil oppstod under forespørselen. Kan ikke fortsette.",
    "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Appen er aktivert men må oppdateres. Du vil bli videresendt til oppdateringssiden om 5 sekunder.",
    "App update" : "App-oppdatering",
    "Error: This app can not be enabled because it makes the server unstable" : "Feil: Denne appen kan ikke aktiveres fordi det gjør serveren ustabil",
    "Administrator documentation" : "Administratordokumentasjon",
    "Documentation" : "Dokumentasjon",
    "Forum" : "Forum",
    "None" : "Ingen",
    "Login" : "Innlogging",
    "Plain" : "Enkel",
    "NT LAN Manager" : "NT LAN-behandler",
    "SSL/TLS" : "SSL/TLS",
    "STARTTLS" : "STARTTLS",
    "Email server" : "E-postserver",
    "Open documentation" : "Åpne dokumentasjonen",
    "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Det er viktig å sette opp denne serveren for å kunne sende e-poster, som tilbakestilling av e-poster og merknader.",
    "Send mode" : "Forsendelsesmåte",
    "Encryption" : "Kryptering",
    "Sendmail mode" : "Sendmail-modus",
    "From address" : "Fra adresse",
    "mail" : "e-post",
    "Authentication method" : "Autentiseringsmetode",
    "Authentication required" : "Autentisering kreves",
    "Server address" : "Serveradresse",
    "Port" : "Port",
    "Credentials" : "Påloggingsdetaljer",
    "SMTP Username" : "SMTP-brukernavn",
    "SMTP Password" : "SMTP-passord",
    "Save" : "Lagre",
    "Test email settings" : "Test innstillinger for e-post",
    "Send email" : "Send e-post",
    "Security & setup warnings" : "Advarsler om sikkerhet og oppsett",
    "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Det er viktig for sikkerheten og ytelsen på din installasjon at alt er satt opp rett. For å hjelpe deg er det satt i verk noen automatiske sjekker. Se vedlagt lenke for å lese mer i dokumentasjonen.",
    "All checks passed." : "Alle sjekker bestått.",
    "There are some errors regarding your setup." : "Det er noen feil angående oppsettet ditt.",
    "There are some warnings regarding your setup." : "Det er noen advarsler angående oppsettet ditt.",
    "Checking for system and security issues." : "Sjekker for system- og sikkerhetsfeil.",
    "Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%2$s\">log</a>." : "Dobbeltsjekk <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installasjonsguidene ↗</a> og se etter feil eller advarsler i <a href=\"%2$s\">loggen</a>.",
    "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "Sjekk sikkerheten til din Nextcloud med <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">vår sikkerhetsskanning ↗</a>.",
    "Version" : "Versjon",
    "Two-Factor Authentication" : "Tofaktor-autentisering",
    "Server-side encryption" : "Kryptering på serverdelen",
    "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Kryptering på serverdelen gjør det mulig å kryptere files som er lastet opp til denne serveren. Dette har begrensninger som ytelsesforverring, så bare skru på dette hvis det trengs.",
    "Enable server-side encryption" : "Aktiver kryptering på serverdelen",
    "Please read carefully before activating server-side encryption: " : "Les dette nøye før du aktiverer kryptering på serverdelen:",
    "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Når kryptering er blitt aktivert, vil alle filer som lastes opp til serveren fra det tidspunktet av bli lagret kryptert på serveren. Det vil kun være mulig å deaktivere kryptering senere dersom den aktive krypteringsmodulen støtter det og alle forutsetninger (f.eks. å sette en gjenopprettingsnøkkel) er til stede.",
    "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Krypteringen alene gir ikke noen garanti for systemets sikkerhet. Sjekk Nextcloud-dokumentasjonen for mer informasjon om hvordan krypteringsappen virker, og de fungerende brukseksemplene.",
    "Be aware that encryption always increases the file size." : "Vær oppmerksom på at kryptering alltid øker filstørrelsen.",
    "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Det er alltid bra å ta regelmessig sikkerhetskopi av dataene dine. Pass på å ta kopi av krypteringsnøklene sammen med dataene når kryptering er i bruk.",
    "This is the final warning: Do you really want to enable encryption?" : "Dette er siste advarsel: Vil du virkelig aktivere kryptering?",
    "Enable encryption" : "Aktiver kryptering",
    "No encryption module loaded, please enable an encryption module in the app menu." : "Ingen krypteringsmodul er lastet. Aktiver en krypteringsmodul i appmenyen.",
    "Select default encryption module:" : "Velg forvalgt krypteringsmodul:",
    "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Du må migrere krypteringsnøklene din fra den gamle krypteringen (ownCloud <= 8.0) til den nye. Aktiver \"Forvalgt krypteringsmodul\" og kjør 'occ encryption:migrate'",
    "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du må migrere krypteringsnøklene din fra den gamle krypteringen (ownCloud <= 8.0) til den nye.",
    "Start migration" : "Start migrering",
    "Background jobs" : "Bakgrunnsjobber",
    "Last job execution ran %s. Something seems wrong." : "Siste jobbkjøring kjørte %s. Noe ser ut til å være galt.",
    "Last job ran %s." : "Siste jobb kjørte %s.",
    "Background job didn’t run yet!" : "Bakgrunnsjobben har ikke kjørt enda!",
    "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "For optimal ytelse er det viktig å sette opp bakgrunnsjobber rett. For kjøring på større installasjoner er 'Cron' anbefalt innstilling. Se dokumentasjonen for mer informasjon.",
    "Pick background job setting" : "Velg innstilling for bakgrunnsjobb",
    "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet",
    "The cron.php needs to be executed by the system user \"%s\"." : "Filen cron.php må kjøres systemet som følgende bruker \"%s\".",
    "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "For å kjøre denne trenger du PHP POSIX utvidelse. Se {linkstart}PHP-dokumentasjonen{linkend} for flere detaljer.",
    "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Som administrator kan du fininnstille delingsoppførselen. Se dokumentasjonen for mer informasjon.",
    "Allow apps to use the Share API" : "Tillat apper å bruke API for deling",
    "Expire after " : "Utløper etter",
    "days" : "dager",
    "Enforce expiration date" : "Krev utløpsdato",
    "Allow users to share via link" : "Tillat brukere å dele via lenke",
    "Allow public uploads" : "Tillat offentlig opplasting",
    "Always ask for a password" : "Alltid spør om passord",
    "Enforce password protection" : "Krev passordbeskyttelse",
    "Allow resharing" : "TIllat videre deling",
    "Allow sharing with groups" : "Tillat deling med grupper",
    "Restrict users to only share with users in their groups" : "Begrens brukere til kun å dele med brukere i deres grupper",
    "Exclude groups from sharing" : "Utelukk grupper fra deling",
    "These groups will still be able to receive shares, but not to initiate them." : "Disse gruppene vil fremdeles kunne motta delinger men ikke lage dem.",
    "Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "Tillat automatisk fullføring i delingsdialogvindu. Dette kan skrus av hvis hele brukernavnet eller e-postadressen må skrives inn.",
    "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Vis ansvarsfraskrivelse på den offentlige opplastingssiden. (Vises kun nå fillisten er tom.)",
    "This text will be shown on the public link upload page when the file list is hidden." : "Denne teksten vises på den offentlig opplastingssiden når fillisten er tom.",
    "Default share permissions" : "Standard delingsrettigheter",
    "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utviklet av {communityopen}Nextcloud-miljøet{linkclose},  {githubopen}kildekoden{linkclose} er lisensiert under {licenseopen}AGPL{linkclose}.",
    "Like our Facebook page" : "Lik vår Facebook-side",
    "Follow us on Twitter" : "Følg oss på Twitter",
    "Follow us on Mastodon" : "Følg oss på Mastadon",
    "Check out our blog" : "Sjekk ut bloggen vår",
    "Subscribe to our newsletter" : "Abonner på vårt nyhetsbrev",
    "Profile picture" : "Profilbilde",
    "Upload new" : "Last opp nytt",
    "Select from Files" : "Velg fra filer",
    "Remove image" : "Fjern bilde",
    "png or jpg, max. 20 MB" : "png eller jpg, maks. 20 MB",
    "Picture provided by original account" : "Bilde kommer fra opprinnelig konto",
    "Choose as profile picture" : "Velg som profilbilde",
    "Details" : "Detaljer",
    "You are a member of the following groups:" : "Du er medlem av følgende grupper:",
    "You are using <strong>%s</strong>" : "Du bruker <strong>%s</strong>",
    "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "Du bruker <strong>%1$s</strong> av <strong>%2$s</strong> (<strong>%3$s %%</strong>)",
    "Full name" : "Fullt navn",
    "No display name set" : "Visningsnavn ikke satt",
    "Your email address" : "Din e-postadresse",
    "No email address set" : "E-postadresse ikke satt",
    "For password reset and notifications" : "For å nullstille passord og varsler",
    "Phone number" : "Telefonnummer",
    "Your phone number" : "Ditt telefonnummer",
    "Address" : "Adresse",
    "Your postal address" : "Din postadresse",
    "Website" : "Nettsted",
    "It can take up to 24 hours before the account is displayed as verified." : "Det kan ta opptil ett døgn før kontoen vises som bekreftet.",
    "Link https://…" : "Lenke https://…",
    "Twitter" : "Twitter",
    "Twitter handle @…" : "Twitter-konto @ …",
    "Help translate" : "Bidra til oversettelsen",
    "Locale" : "Nasjonal innstilling",
    "Current password" : "Nåværende passord",
    "New password" : "Nytt passord",
    "Change password" : "Endre passord",
    "Use a second factor besides your password to increase security for your account." : "Bruk en annen faktor i tillegg til passordet ditt for å øke sikkerheten for kontoen din.",
    "Share" : "Del",
    "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Last opp et ASCII-kodet PEM-sertifikat.",
    "Valid until {date}" : "Gyldig til {date}",
    "Local" : "Lokal",
    "Only visible to local users" : "Kun synlig for lokale brukere",
    "Only visible to you" : "Kun synlig for deg",
    "Contacts" : "Kontakter",
    "Visible to local users and to trusted servers" : "Synlig for lokale brukere og klarerte servere",
    "Will be synced to a global and public address book" : "Vil blir synkronisert til global og offentlig addressbok",
    "Albanian" : "Albansk",
    "Arabic" : "Arabisk",
    "Tonga" : "Tonga",
    "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offisielle apper utvikles av og innenfor miljøet, de byr på sentral funksjonalitet og er klare for bruk i produksjon.",
    "Official" : "Offisiell",
    "The backend does not support changing the display name" : "Serveren støtter ikke endring av visningsnavn",
    "SSL Root Certificates" : "SSL-rotsertifikater",
    "Common Name" : "Vanlig navn",
    "Valid until" : "Gyldig til",
    "Issued By" : "Utstedt av",
    "Valid until %s" : "Gyldig til %s",
    "Import root certificate" : "Importer rotsertifikat",
    "Set default expiration date" : "Sett forvalgt utløpsdato",
    "Enter your name so other users can see who is editing" : "Skriv inn navnet ditt slik at andre brukere kan se hvem som redigerer",
    "Edit guest name" : "Rediger gjestenavn",
    "Save guest name" : "Lagre gjestenavn",
    "Add link" : "Legg ved lenke",
    "Last saved {lastSaved}" : "Sist lagret {lastSaved}",
    "The document has been changed outside of the editor. The changes cannot be applied." : "Dokumentet har blitt endret utenfor programmet. Endringene kan ikke benyttes. ",
    "Unpushed changes" : "Ulagrede endringer",
    "Unsaved changes" : "Ulagrede endringer",
    "Use current version" : "Bruk siste versjon",
    "Use the saved version" : "Bruk lagret versjon",
    "File could not be loaded. Please check your internet connection." : "Filen kunne ikke lastes. Vennligst sjekk internettforbindelsen din. ",
    "Retry" : "Prøv igjen",
    "Show image" : "Vis bilde",
    "Show file" : "Vis fil"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}