diff --git a/.gitea/scripts/wait-knowledge.sh b/.gitea/scripts/wait-knowledge.sh index d7ae258..f714b38 100755 --- a/.gitea/scripts/wait-knowledge.sh +++ b/.gitea/scripts/wait-knowledge.sh @@ -1,11 +1,16 @@ #!/bin/sh set -eu manifest=http://127.0.0.1:5480/api/knowledge -for attempt in $(seq 1 60); do - if curl -fsS "$manifest" >/dev/null 2>&1; then - echo "network data ready: $(curl -fsS "$manifest" | head -c 200)" +for attempt in $(seq 1 240); do + body=$(curl -fsS "$manifest" 2>/dev/null || true) + missing="" + for file in ip2asn.bin networks.bin carriers.json registry.bin; do + case "$body" in *"\"$file\""*) ;; *) missing="$missing $file" ;; esac + done + if [ -n "$body" ] && [ -z "$missing" ]; then + echo "network data ready: $(printf '%s' "$body" | head -c 200)" exit 0 fi sleep 10 done -echo "::warning::the server built no network data in ten minutes; the apps embed the provider map alone" +echo "::warning::the server's network data still lacks${missing:- everything} after forty minutes; the apps embed what it has" diff --git a/CLAUDE.md b/CLAUDE.md index 1da2738..ceed9f7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,7 +72,7 @@ The Android release key: alias `meweb`, certificate SHA-256 | `data/observed.json` | notes counted from shared findings and accepted by a person: per AS number and line (`home`, `mobile`), IPv4 shared or public, IPv6 offered or not, port 25, each with how many networks agree; embedded in every release | | `src/MeWeb.Server/ObservedNotes.cs` | every six hours (with the share sweep) counts the shared findings into `/var/lib/meweb/observed.json` on the box: one vote per /24 or /48, the latest check of each network, the publisher's own network left out; nothing is served | | `tools/observed.cs` | `show` prints that count, `accept AS/ ...` copies the ready notes (at least 5 networks, 4 in 5 agreeing) into `data/observed.json` | -| `src/MeWeb.Server/KnowledgeFeeder.cs` | refreshes the open network data under `/var/lib/meweb/knowledge` every six hours (iptoasn daily, DB-IP monthly, eight RouteViews RIBs weekly through `bzcat` (one or two collectors per continent, `Collectors`; each counts once per network in `UpstreamTally`, and a path's first AS, the collector's own neighbour, is never taken for an upstream), the AOSP carrier list weekly), builds `ip2asn.bin`, `networks.bin`, `carriers.json` and `SOURCES.txt` with `MeWeb.Core/Knowledge/Sources.cs`, and serves them at `/api/knowledge` | +| `src/MeWeb.Server/KnowledgeFeeder.cs` | refreshes the open network data under `/var/lib/meweb/knowledge` every six hours (iptoasn daily, DB-IP monthly, eight RouteViews RIBs weekly through `bzcat` (one or two collectors per continent, `Collectors`; each counts once per network in `UpstreamTally`, and a path's first AS, the collector's own neighbour, is never taken for an upstream), the AOSP carrier list weekly, RIPE's `inetnum` and `inet6num` split files weekly), builds `ip2asn.bin`, `networks.bin`, `carriers.json`, `registry.bin` and `SOURCES.txt` with `MeWeb.Core/Knowledge/Sources.cs`, and serves them at `/api/knowledge`; it also writes `registry-full.bin` (`RegistryIndex`), every RIPE block, which never leaves the box | | `tools/knowledge.cs` | takes the server's knowledge files (`MEWEB_KNOWLEDGE_URL`, default the public server; the release sets `http://127.0.0.1:5480` after deploying the server first) into `artifacts/knowledge/`, checking each SHA-256, and falls back to building `ip2asn.bin` alone from iptoasn (`--local` forces that); `MeWeb.Core` embeds whatever is there; `tools/release.cs` runs it before every app build | | `tools/setup.cs` + `setup.json` | pinned build tools | | `tools/Screenshots` | headless renders of every view in every language | @@ -122,6 +122,21 @@ The Android release key: alias `meweb`, certificate SHA-256 - **The knowledge build must fit the unit's `MemoryMax=512M`.** It peaked at 551 MB with Server GC on a 32-core machine; workstation GC (the server's csproj), streaming hashes and streaming the iptoasn ranges into compact tuples brought it to about 335 MB. Re-measure (`VmHWM`) after touching `Sources.cs` or `AsnTable.Write`. +- **RIPE Database data is used by permission, on a condition.** The RIPE NCC allowed it on 16 October 2026 (ticket + #1122623) "as long as there is no commercial intent where the RIPE Database data is behind a paywall or used for + monetization purposes". So it stays in this free app and its server: never behind a paywall, never in anything sold, + never reused by the publisher's business. The request promised range, netname, country and status only (no + persons, contacts, `descr` or `remarks`), RIPE credited with a link, the extract's date and a note that it may lag; + `SOURCES.txt` (the release notes) and `RegistryCredit` carry that. The RIR's own allocations (`ALLOCATED PA`, + `ALLOCATED UNSPECIFIED`, `ALLOCATED-BY-RIR`) are skipped: their names are registry-made (`IT-FASTWEB-20101230`). +- **No block is left out, but the apps cannot carry all of them.** Every RIPE block compresses to about 24 MB and took + 2.2 GB to build, so `registry.bin` (about 0.7 MB) holds the blocks of 2,048+ IPv4 addresses or a /40, plus those of + 256+ or a /48 whose name recurs (a provider's pool label, `FASTWEB-L3-PAT_NAT`); `RegistryIndex` keeps all five + million on disk (about 160 MB, binary search with `RandomAccess`, nothing resident) and `/api/ip` answers each + caller with the block of the address it sees, never another. The app prefers that answer and falls back to the + embedded table. `RegistryIndex.Build` reads IPv4 and then IPv6 and streams the flattened ranges out + (`RegistryTable.Narrowest`, the narrowest block wins): about 280 MB peak, under the unit's 512 MB. The first build + after a deploy takes some fifteen minutes, so `wait-knowledge.sh` waits for `registry.bin` in the manifest. - **The server cannot ping**: `NoNewPrivileges` drops `ping`'s file capability and `ping_group_range` is closed, so the trace back to a caller uses `tracepath` (UDP, unprivileged) and keeps only public hops outside `Probe:Refuse`, so the box's own network never reaches an app. diff --git a/Directory.Build.props b/Directory.Build.props index 571f929..2b186c1 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.10.0 + 0.11.0 “me-web?” Arasaka di Hvozdikov Yevheniy © 2026 Arasaka di Hvozdikov Yevheniy diff --git a/README.md b/README.md index b5b2ac2..bf3cfa4 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,14 @@ The APK is signed with the key whose certificate SHA-256 is neighbours are kept. "With contributions from network operators and volunteers all over the world, RouteViews collects BGP data by direct peering at Internet Exchange Points (IXPs) or multi-hop peering. Data are archived and made publicly available for download at archive.routeviews.org, lg.routeviews.org, and api.routeviews.org."; - - mobile operators by network code: the Android Open Source Project's carrier list, Apache License 2.0. + - mobile operators by network code: the Android Open Source Project's carrier list, Apache License 2.0; + - the name of the block of addresses a connection belongs to: the [RIPE Database](https://www.ripe.net/manage-ips-and-asns/db/) + of the RIPE NCC, used with the RIPE NCC's permission (16 October 2026) on condition that it is never put behind + a paywall or used to make money. Only each block's range, name and country are kept, nothing about people. The + apps carry every block of at least 2,048 IPv4 addresses or a /40 in IPv6, and the smaller ones, down to 256 + addresses or a /48, whose name recurs; the server keeps every block and tells each app only the block of the + address it sees. The + data may lag behind the live database; the release notes give its date. - Provider notes: each operator's own technical sheet (AGCOM 156/23 in Italy) and users' reports on [FibraClick](https://forum.fibra.click), each cited in `data/isps/`; and, for any country, totals from findings people chose to share (`data/observed.json`), published only after a person has reviewed them and only where at diff --git a/src/MeWeb.App/Strings/am.json b/src/MeWeb.App/Strings/am.json index 85c6bd8..2d1cb9f 100644 --- a/src/MeWeb.App/Strings/am.json +++ b/src/MeWeb.App/Strings/am.json @@ -84,6 +84,8 @@ "FactAdapter": "የአውታረ መረብ አስማሚ", "FactAddressesSeen": "የታዩ ይፋዊ IPv4 አድራሻዎች", "FactBattery": "ባትሪ", + "FactBlock": "የአድራሻ ክፍል", + "FactBlockIpv6": "የአድራሻ ክፍል ለIPv6", "FactChecks": "ፍተሻዎች", "FactCores": "የፕሮሰሰር ኮሮች (cores)", "FactDisk": "ነፃ የዲስክ ቦታ", @@ -259,6 +261,7 @@ "RefusalTooMany": "ለአሁኑ በጣም ብዙ ሙከራዎች", "RefusalUnknownTicket": "የሙከራው ጊዜ አልፏል", "RefusalUnreachable": "አገልጋዩን መድረስ አልተቻለም", + "RegistryCredit": "የአድራሻ ክፍሎች፦ የRIPE NCC RIPE Database (ripe.net)፣ በፈቃዱ የተጠቀምንበት፣ የ{0} መረጃ። በኢንተርኔት ላይ ካለው የመረጃ ቋት ወደ ኋላ ሊቀር ይችላል።", "ResultsTitle": "«me-web?» ያገኘው", "RouterMobile": "በሞባይል ዳታ ላይ የቤት ራውተር የለም፦ መጀመሪያ የሚመጣው የአቅራቢዎ አውታረ መረብ ነው።", "RouterNone": "በዚህ ግንኙነት ላይ የቤት ራውተር አልተገኘም።", diff --git a/src/MeWeb.App/Strings/ar.json b/src/MeWeb.App/Strings/ar.json index 2852cd4..2f44d69 100644 --- a/src/MeWeb.App/Strings/ar.json +++ b/src/MeWeb.App/Strings/ar.json @@ -84,6 +84,8 @@ "FactAdapter": "محوّل الشبكة", "FactAddressesSeen": "عناوين IPv4 العامة التي ظهرت", "FactBattery": "البطارية", + "FactBlock": "مجموعة العناوين", + "FactBlockIpv6": "مجموعة عناوين IPv6", "FactChecks": "الفحوص", "FactCores": "أنوية المعالج", "FactDisk": "المساحة الفارغة", @@ -259,6 +261,7 @@ "RefusalTooMany": "اختبارات كثيرة جدًا حاليًا", "RefusalUnknownTicket": "انتهت صلاحية الاختبار", "RefusalUnreachable": "تعذّر الوصول إلى الخادم", + "RegistryCredit": "مجموعات العناوين: RIPE Database من RIPE NCC (ripe.net)، مستخدمة بإذنه، بيانات بتاريخ {0}. قد تكون أقدم من قاعدة البيانات الحيّة.", "ResultsTitle": "ما وجده ”me-web?“", "RouterMobile": "على بيانات الجوّال لا يوجد راوتر منزلي: شبكة مزوّد الإنترنت تأتي أولًا.", "RouterNone": "لم يُعثر على راوتر منزلي في هذا الاتصال.", diff --git a/src/MeWeb.App/Strings/ay.json b/src/MeWeb.App/Strings/ay.json index 58912f1..a863886 100644 --- a/src/MeWeb.App/Strings/ay.json +++ b/src/MeWeb.App/Strings/ay.json @@ -84,6 +84,8 @@ "FactAdapter": "Red adaptador (mayachir tarjeta)", "FactAddressesSeen": "Uñjat público IPv4 direccionanaka", "FactBattery": "Batería", + "FactBlock": "Direccion t'aqa", + "FactBlockIpv6": "IPv6 ukatak direccion t'aqa", "FactChecks": "Uñakipawinaka", "FactCores": "Procesadoran núcleonakapa (núcleos)", "FactDisk": "Ch'usa chiqa (disco)", @@ -259,6 +261,7 @@ "RefusalTooMany": "jichhax walja yant'äwinaka", "RefusalUnknownTicket": "yant'äwix tukusxiwa", "RefusalUnreachable": "servidorar jan puriñjama", + "RegistryCredit": "Direccion t'aqanaka: RIPE NCC ukan RIPE Database (ripe.net), permisopampi apnaqata, {0} urun datonakapa. Internetan jichha utjki uka base de datos ukat sipanx qhipharataspawa.", "ResultsTitle": "«me-web?» kunanaks jikxatawayi", "RouterMobile": "Celular datonakampix janiw utan routerax utjkiti: celular empresaman redapaw nayraqat juti.", "RouterNone": "Aka conexionanx janiw utan routerax jikxatatäkiti.", diff --git a/src/MeWeb.App/Strings/az-Cyrl.json b/src/MeWeb.App/Strings/az-Cyrl.json index 4b6aa07..d284e34 100644 --- a/src/MeWeb.App/Strings/az-Cyrl.json +++ b/src/MeWeb.App/Strings/az-Cyrl.json @@ -84,6 +84,8 @@ "FactAdapter": "Шәбәкә адаптери", "FactAddressesSeen": "Ҝөрүлән иҹтимаи IPv4 үнванлары", "FactBattery": "Батареја", + "FactBlock": "Үнван блоку", + "FactBlockIpv6": "IPv6 үнван блоку", "FactChecks": "Јохламалар", "FactCores": "Просессор нүвәләри", "FactDisk": "Бош диск саһәси", @@ -259,6 +261,7 @@ "RefusalTooMany": "һәләлик һәддиндән чох тест", "RefusalUnknownTicket": "тестин вахты битиб", "RefusalUnreachable": "серверә чатмаг олмур", + "RegistryCredit": "Үнван блоклары: RIPE NCC-нин RIPE Database мәлумат базасы (ripe.net), онун иҹазәси илә истифадә олунур, {0} тарихли мәлуматлар. Мәлуматлар интернетдәки базадан ҝери гала биләр.", "ResultsTitle": "«me-web?» нәләр тапды", "RouterMobile": "Мобил интернетдә ев роутери олмур: биринҹи провајдеринизин шәбәкәси ҝәлир.", "RouterNone": "Бу бағлантыда ев роутери тапылмады.", diff --git a/src/MeWeb.App/Strings/az.json b/src/MeWeb.App/Strings/az.json index bf1f6b3..cf58136 100644 --- a/src/MeWeb.App/Strings/az.json +++ b/src/MeWeb.App/Strings/az.json @@ -84,6 +84,8 @@ "FactAdapter": "Şəbəkə adapteri", "FactAddressesSeen": "Görülən ictimai IPv4 ünvanları", "FactBattery": "Batareya", + "FactBlock": "Ünvan bloku", + "FactBlockIpv6": "IPv6 ünvan bloku", "FactChecks": "Yoxlamalar", "FactCores": "Prosessor nüvələri", "FactDisk": "Boş disk sahəsi", @@ -259,6 +261,7 @@ "RefusalTooMany": "hələlik həddindən çox test", "RefusalUnknownTicket": "testin vaxtı bitib", "RefusalUnreachable": "serverə çatmaq olmur", + "RegistryCredit": "Ünvan blokları: RIPE NCC-nin RIPE Database məlumat bazası (ripe.net), onun icazəsi ilə istifadə olunur, {0} tarixli məlumatlar. Məlumatlar internetdəki bazadan geri qala bilər.", "ResultsTitle": "“me-web?” nələr tapdı", "RouterMobile": "Mobil internetdə ev routeri olmur: birinci provayderinizin şəbəkəsi gəlir.", "RouterNone": "Bu bağlantıda ev routeri tapılmadı.", diff --git a/src/MeWeb.App/Strings/be.json b/src/MeWeb.App/Strings/be.json index 83959d5..b58d8c3 100644 --- a/src/MeWeb.App/Strings/be.json +++ b/src/MeWeb.App/Strings/be.json @@ -84,6 +84,8 @@ "FactAdapter": "Сеткавы адаптар", "FactAddressesSeen": "Заўважаныя публічныя адрасы IPv4", "FactBattery": "Батарэя", + "FactBlock": "Блок адрасоў", + "FactBlockIpv6": "Блок адрасоў для IPv6", "FactChecks": "Праверак", "FactCores": "Ядры працэсара", "FactDisk": "Вольна на дыску", @@ -259,6 +261,7 @@ "RefusalTooMany": "пакуль занадта шмат тэстаў", "RefusalUnknownTicket": "час тэсту скончыўся", "RefusalUnreachable": "сервер недаступны", + "RegistryCredit": "Блокі адрасоў: RIPE Database ад RIPE NCC (ripe.net), выкарыстоўваецца з яго дазволу, даныя на {0}. Яны могуць адставаць ад базы ў інтэрнэце.", "ResultsTitle": "Вынікі «me-web?»", "RouterMobile": "У мабільным інтэрнэце хатняга роўтара няма: першай ідзе сетка правайдара.", "RouterNone": "На гэтым падключэнні хатні роўтар не знойдзены.", diff --git a/src/MeWeb.App/Strings/bg.json b/src/MeWeb.App/Strings/bg.json index 3e363a7..5bd0701 100644 --- a/src/MeWeb.App/Strings/bg.json +++ b/src/MeWeb.App/Strings/bg.json @@ -84,6 +84,8 @@ "FactAdapter": "Мрежов адаптер", "FactAddressesSeen": "Видени публични IPv4 адреси", "FactBattery": "Батерия", + "FactBlock": "Адресен блок", + "FactBlockIpv6": "Адресен блок за IPv6", "FactChecks": "Проверки", "FactCores": "Ядра на процесора", "FactDisk": "Свободно място на диска", @@ -259,6 +261,7 @@ "RefusalTooMany": "твърде много тестове засега", "RefusalUnknownTicket": "тестът е изтекъл", "RefusalUnreachable": "сървърът е недостъпен", + "RegistryCredit": "Адресни блокове: RIPE Database на RIPE NCC (ripe.net), използвана с негово разрешение, данни от {0}. Данните може да изостават от онлайн базата данни.", "ResultsTitle": "Какво откри „me-web?“", "RouterMobile": "При мобилни данни няма домашен рутер: първа идва мрежата на доставчика.", "RouterNone": "На тази връзка не е открит домашен рутер.", diff --git a/src/MeWeb.App/Strings/bi.json b/src/MeWeb.App/Strings/bi.json index c5c90d7..7f6cee1 100644 --- a/src/MeWeb.App/Strings/bi.json +++ b/src/MeWeb.App/Strings/bi.json @@ -84,6 +84,8 @@ "FactAdapter": "Netwok adapta", "FactAddressesSeen": "Ol pablik IPv4 adres we mifala i luk", "FactBattery": "Bateri", + "FactBlock": "Blok blong adres", + "FactBlockIpv6": "Blok blong adres blong IPv6", "FactChecks": "Ol jekem", "FactCores": "Ol kor blong prosesa", "FactDisk": "Fri spes long disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "tumas tes blong naoia", "RefusalUnknownTicket": "taem blong tes i finis", "RefusalUnreachable": "mifala no save kasem seva", + "RegistryCredit": "Ol blok blong adres: RIPE Database blong RIPE NCC (ripe.net), mifala i yusum wetem pemisen blong hem, data blong {0}. Maet data ya i olfala moa long database we i stap long intanet.", "ResultsTitle": "Wanem we “me-web?” i faenem", "RouterMobile": "Long mobael data i no gat rauta long haos: fas step hem i netwok blong kampani blong intanet blong yu.", "RouterNone": "Mifala no faenem wan rauta blong haos long konekson ia.", diff --git a/src/MeWeb.App/Strings/bn.json b/src/MeWeb.App/Strings/bn.json index acd4e78..08e8991 100644 --- a/src/MeWeb.App/Strings/bn.json +++ b/src/MeWeb.App/Strings/bn.json @@ -84,6 +84,8 @@ "FactAdapter": "নেটওয়ার্ক অ্যাডাপ্টার", "FactAddressesSeen": "দেখা পাবলিক IPv4 ঠিকানা", "FactBattery": "ব্যাটারি", + "FactBlock": "ঠিকানার খণ্ড", + "FactBlockIpv6": "IPv6-এর ঠিকানার খণ্ড", "FactChecks": "যাচাই", "FactCores": "প্রসেসরের কোর", "FactDisk": "ডিস্কে খালি জায়গা", @@ -259,6 +261,7 @@ "RefusalTooMany": "আপাতত অনেক বেশি টেস্ট", "RefusalUnknownTicket": "টেস্টের মেয়াদ শেষ", "RefusalUnreachable": "সার্ভারে পৌঁছানো যায়নি", + "RegistryCredit": "ঠিকানার খণ্ড: RIPE NCC-এর RIPE Database (ripe.net), তাদের অনুমতি নিয়ে ব্যবহার করা, {0} তারিখের ডেটা। এটি অনলাইন ডেটাবেসের চেয়ে পিছিয়ে থাকতে পারে।", "ResultsTitle": "“me-web?” কী পেল", "RouterMobile": "মোবাইল ডেটায় বাড়ির রাউটার থাকে না: সবার আগে আসে আপনার মোবাইল অপারেটরের নেটওয়ার্ক।", "RouterNone": "এই সংযোগে বাড়ির কোনো রাউটার পাওয়া যায়নি।", diff --git a/src/MeWeb.App/Strings/bs-Cyrl.json b/src/MeWeb.App/Strings/bs-Cyrl.json index f090055..794f763 100644 --- a/src/MeWeb.App/Strings/bs-Cyrl.json +++ b/src/MeWeb.App/Strings/bs-Cyrl.json @@ -84,6 +84,8 @@ "FactAdapter": "Мрежни адаптер", "FactAddressesSeen": "Виђене јавне IPv4 адресе", "FactBattery": "Батерија", + "FactBlock": "Блок адреса", + "FactBlockIpv6": "Блок адреса за IPv6", "FactChecks": "Провјере", "FactCores": "Језгра процесора", "FactDisk": "Слободан простор на диску", @@ -259,6 +261,7 @@ "RefusalTooMany": "тренутно превише тестова", "RefusalUnknownTicket": "тест је истекао", "RefusalUnreachable": "сервер није доступан", + "RegistryCredit": "Блокови адреса: RIPE Database организације RIPE NCC (ripe.net), користи се уз њену дозволу, подаци од {0}. Подаци могу заостајати за базом на интернету.", "ResultsTitle": "Шта је апликација „me-web?“ пронашла", "RouterMobile": "На мобилним подацима нема кућног рутера: одмах на почетку је мрежа провајдера.", "RouterNone": "На овој вези није пронађен кућни рутер.", diff --git a/src/MeWeb.App/Strings/bs.json b/src/MeWeb.App/Strings/bs.json index 4daa519..c3a9084 100644 --- a/src/MeWeb.App/Strings/bs.json +++ b/src/MeWeb.App/Strings/bs.json @@ -84,6 +84,8 @@ "FactAdapter": "Mrežni adapter", "FactAddressesSeen": "Viđene javne IPv4 adrese", "FactBattery": "Baterija", + "FactBlock": "Blok adresa", + "FactBlockIpv6": "Blok adresa za IPv6", "FactChecks": "Provjere", "FactCores": "Jezgra procesora", "FactDisk": "Slobodan prostor na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "trenutno previše testova", "RefusalUnknownTicket": "test je istekao", "RefusalUnreachable": "server nije dostupan", + "RegistryCredit": "Blokovi adresa: RIPE Database organizacije RIPE NCC (ripe.net), koristi se uz njenu dozvolu, podaci od {0}. Podaci mogu zaostajati za bazom na internetu.", "ResultsTitle": "Šta je aplikacija „me-web?” pronašla", "RouterMobile": "Na mobilnim podacima nema kućnog rutera: odmah na početku je mreža provajdera.", "RouterNone": "Na ovoj vezi nije pronađen kućni ruter.", diff --git a/src/MeWeb.App/Strings/ca.json b/src/MeWeb.App/Strings/ca.json index 918c0e3..5cce7c6 100644 --- a/src/MeWeb.App/Strings/ca.json +++ b/src/MeWeb.App/Strings/ca.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptador de xarxa", "FactAddressesSeen": "Adreces IPv4 públiques vistes", "FactBattery": "Bateria", + "FactBlock": "Bloc d'adreces", + "FactBlockIpv6": "Bloc d'adreces per a IPv6", "FactChecks": "Comprovacions", "FactCores": "Nuclis del processador", "FactDisk": "Espai lliure al disc", @@ -259,6 +261,7 @@ "RefusalTooMany": "massa proves de moment", "RefusalUnknownTicket": "la prova ha caducat", "RefusalUnreachable": "no s'ha pogut arribar al servidor", + "RegistryCredit": "Blocs d'adreces: la RIPE Database del RIPE NCC (ripe.net), usada amb el seu permís, dades del {0}. Pot estar menys actualitzada que la base de dades en línia.", "ResultsTitle": "Què ha trobat «me-web?»", "RouterMobile": "Amb dades mòbils no hi ha router de casa: el primer és la xarxa del vostre operador.", "RouterNone": "No s'ha trobat cap router de casa en aquesta connexió.", diff --git a/src/MeWeb.App/Strings/cs.json b/src/MeWeb.App/Strings/cs.json index 2d51435..4ec52f1 100644 --- a/src/MeWeb.App/Strings/cs.json +++ b/src/MeWeb.App/Strings/cs.json @@ -84,6 +84,8 @@ "FactAdapter": "Síťový adaptér", "FactAddressesSeen": "Zjištěné veřejné adresy IPv4", "FactBattery": "Baterie", + "FactBlock": "Blok adres", + "FactBlockIpv6": "Blok adres pro IPv6", "FactChecks": "Kontroly", "FactCores": "Jádra procesoru", "FactDisk": "Volné místo na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "momentálně příliš mnoho testů", "RefusalUnknownTicket": "platnost testu vypršela", "RefusalUnreachable": "server je nedostupný", + "RegistryCredit": "Bloky adres: RIPE Database organizace RIPE NCC (ripe.net), použitá s jejím svolením, data k {0}. Data mohou zaostávat za databází online.", "ResultsTitle": "Co zjistila aplikace „me-web?“", "RouterMobile": "U mobilních dat žádný domácí router není: hned na začátku je síť poskytovatele.", "RouterNone": "U tohoto připojení nebyl nalezen žádný domácí router.", diff --git a/src/MeWeb.App/Strings/da.json b/src/MeWeb.App/Strings/da.json index d5b03f2..bca4387 100644 --- a/src/MeWeb.App/Strings/da.json +++ b/src/MeWeb.App/Strings/da.json @@ -84,6 +84,8 @@ "FactAdapter": "Netværksadapter", "FactAddressesSeen": "Offentlige IPv4-adresser set", "FactBattery": "Batteri", + "FactBlock": "Adresseblok", + "FactBlockIpv6": "Adresseblok for IPv6", "FactChecks": "Tjek", "FactCores": "Processorkerner", "FactDisk": "Ledig diskplads", @@ -259,6 +261,7 @@ "RefusalTooMany": "for mange tests lige nu", "RefusalUnknownTicket": "testen er udløbet", "RefusalUnreachable": "serveren kan ikke nås", + "RegistryCredit": "Adresseblokke: RIPE NCC's RIPE Database (ripe.net), brugt med deres tilladelse, data fra {0}. Dataene kan halte efter databasen online.", "ResultsTitle": "Hvad “me-web?” fandt", "RouterMobile": "På mobildata er der ingen router derhjemme: din udbyders netværk kommer først.", "RouterNone": "Der blev ikke fundet nogen router derhjemme på denne forbindelse.", diff --git a/src/MeWeb.App/Strings/de.json b/src/MeWeb.App/Strings/de.json index 85b7d2f..e80b6c8 100644 --- a/src/MeWeb.App/Strings/de.json +++ b/src/MeWeb.App/Strings/de.json @@ -84,6 +84,8 @@ "FactAdapter": "Netzwerkadapter", "FactAddressesSeen": "Gesehene öffentliche IPv4-Adressen", "FactBattery": "Akku", + "FactBlock": "Adressblock", + "FactBlockIpv6": "Adressblock für IPv6", "FactChecks": "Prüfungen", "FactCores": "Prozessorkerne", "FactDisk": "Freier Speicherplatz", @@ -259,6 +261,7 @@ "RefusalTooMany": "vorerst zu viele Tests", "RefusalUnknownTicket": "der Test ist abgelaufen", "RefusalUnreachable": "Server nicht erreichbar", + "RegistryCredit": "Adressblöcke: die RIPE Database des RIPE NCC (ripe.net), mit dessen Erlaubnis verwendet, Daten vom {0}. Die Daten können hinter der Online-Datenbank zurückliegen.", "ResultsTitle": "Was „me-web?“ gefunden hat", "RouterMobile": "Bei mobilen Daten gibt es keinen Router zu Hause: Zuerst kommt gleich das Mobilfunknetz Ihres Anbieters.", "RouterNone": "Bei dieser Verbindung wurde kein Router zu Hause gefunden.", diff --git a/src/MeWeb.App/Strings/dv.json b/src/MeWeb.App/Strings/dv.json index 423d471..3eb1ddb 100644 --- a/src/MeWeb.App/Strings/dv.json +++ b/src/MeWeb.App/Strings/dv.json @@ -84,6 +84,8 @@ "FactAdapter": "ނެޓްވޯކް އެޑަޕްޓަރު", "FactAddressesSeen": "ފެނުނު ޕަބްލިކް IPv4 އެޑްރެސްތައް", "FactBattery": "ބެޓަރީ", + "FactBlock": "އެޑްރެސް ބްލޮކް", + "FactBlockIpv6": "IPv6 ގެ އެޑްރެސް ބްލޮކް", "FactChecks": "ބެލުންތައް", "FactCores": "ޕްރޮސެސަރުގެ ކޯތައް", "FactDisk": "ހުސްޖާގަ", @@ -259,6 +261,7 @@ "RefusalTooMany": "މިވަގުތަށް ވަރަށް ގިނަ ޓެސްޓް", "RefusalUnknownTicket": "ޓެސްޓުގެ މުއްދަތު ހަމަވެއްޖެ", "RefusalUnreachable": "ސަރވަރާ ނުގުޅެވޭ", + "RegistryCredit": "އެޑްރެސް ބްލޮކްތައް: RIPE NCC ގެ RIPE Database (ripe.net)، އެ ފަރާތުގެ ހުއްދައާއެކު ބޭނުންކޮށްފައި، {0} ގެ ޑޭޓާ. މި ޑޭޓާ، އޮންލައިންގައިވާ ޑޭޓާބޭހަށްވުރެ ފަހަތުގައި ހުރެދާނެ.", "ResultsTitle": "”me-web?“ އަށް ފެނުނު ކަންތައްތައް", "RouterMobile": "މޮބައިލް ޑޭޓާގައި ގޭގެ ރައުޓަރެއް ނެތް: ފުރަތަމަ އަންނަނީ އިންޓަނެޓް ކުންފުނީގެ ނެޓްވޯކް.", "RouterNone": "މި ކަނެކްޝަނުގައި ގޭގެ ރައުޓަރެއް ނުފެނުނު.", diff --git a/src/MeWeb.App/Strings/dz.json b/src/MeWeb.App/Strings/dz.json index 535923a..f5f11c7 100644 --- a/src/MeWeb.App/Strings/dz.json +++ b/src/MeWeb.App/Strings/dz.json @@ -84,6 +84,8 @@ "FactAdapter": "ཡོངས་འབྲེལ་མཐུད་ཆས", "FactAddressesSeen": "མཐོང་ཡོད་པའི་ སྤྱི་ཡོངས་ IPv4 ཁ་བྱང་ཚུ", "FactBattery": "གློག་རྫས", + "FactBlock": "ཁ་བྱང་སྡེབ་ཚན", + "FactBlockIpv6": "IPv6 གི་ཁ་བྱང་སྡེབ་ཚན", "FactChecks": "བརྟག་ཞིབ་ཚུ", "FactCores": "ལས་སྣོན་ཆས་ཀྱི་སྙིང་པོ (processor cores)", "FactDisk": "ཌིཀསི་གི་སྟོང་ས", @@ -259,6 +261,7 @@ "RefusalTooMany": "ད་ལྟོ་ ཚོད་ལྟ་ ལེ་ཤ་འབད་ཡི", "RefusalUnknownTicket": "ཚོད་ལྟའི་དུས་ཚོད་ ཡོལ་ཡི", "RefusalUnreachable": "སར་བར་ལུ་ ལྷོད་མ་ཚུགས", + "RegistryCredit": "ཁ་བྱང་སྡེབ་ཚན་ཚུ། RIPE NCC གི་ RIPE Database (ripe.net), ཁོང་གི་གནང་བ་དང་གཅིག་ཁར་ ལག་ལེན་འཐབ་ཡོད, {0} གི་གནས་སྡུད། གནས་སྡུད་འདི་ ཨིན་ཊར་ནེཊ་གུ་ཡོད་པའི་ གནས་སྡུད་མཛོད་ལས་ རྒྱབ་ལུས་ཡོདཔ་འོང་།", "ResultsTitle": "“me-web?” གིས་ འཚོལ་ཐོབ་མི", "RouterMobile": "མོ་བཱའིལ་གནས་སྡུད་གུ་ ཁྱིམ་གྱི་རའུ་ཊར་མེད། ཁྱེད་ཀྱི་ཞབས་ཏོག་བྱིན་མིའི་ཡོངས་འབྲེལ་ དང་པ་ཨིན།", "RouterNone": "མཐུད་ལམ་འདི་གུ་ ཁྱིམ་གྱི་རའུ་ཊར་ འཚོལ་མ་ཐོབ།", diff --git a/src/MeWeb.App/Strings/el.json b/src/MeWeb.App/Strings/el.json index 0e7f5e4..b98c2f8 100644 --- a/src/MeWeb.App/Strings/el.json +++ b/src/MeWeb.App/Strings/el.json @@ -84,6 +84,8 @@ "FactAdapter": "Προσαρμογέας δικτύου", "FactAddressesSeen": "Δημόσιες διευθύνσεις IPv4 που εμφανίστηκαν", "FactBattery": "Μπαταρία", + "FactBlock": "Μπλοκ διευθύνσεων", + "FactBlockIpv6": "Μπλοκ διευθύνσεων για IPv6", "FactChecks": "Έλεγχοι", "FactCores": "Πυρήνες επεξεργαστή", "FactDisk": "Ελεύθερος χώρος δίσκου", @@ -259,6 +261,7 @@ "RefusalTooMany": "πάρα πολλές δοκιμές προς το παρόν", "RefusalUnknownTicket": "η δοκιμή έληξε", "RefusalUnreachable": "ο διακομιστής δεν είναι προσβάσιμος", + "RegistryCredit": "Μπλοκ διευθύνσεων: η RIPE Database του RIPE NCC (ripe.net), που χρησιμοποιείται με την άδειά του, δεδομένα της {0}. Τα δεδομένα μπορεί να υστερούν σε σχέση με τη βάση δεδομένων στο διαδίκτυο.", "ResultsTitle": "Τι βρήκε το «me-web?»", "RouterMobile": "Με δεδομένα κινητής δεν υπάρχει οικιακό ρούτερ: πρώτο έρχεται το δίκτυο του παρόχου σας.", "RouterNone": "Δεν βρέθηκε οικιακό ρούτερ σε αυτή τη σύνδεση.", diff --git a/src/MeWeb.App/Strings/en.json b/src/MeWeb.App/Strings/en.json index 1ad61a7..d6b9250 100644 --- a/src/MeWeb.App/Strings/en.json +++ b/src/MeWeb.App/Strings/en.json @@ -84,6 +84,8 @@ "FactAdapter": "Network adapter", "FactAddressesSeen": "Public IPv4 addresses seen", "FactBattery": "Battery", + "FactBlock": "Address block", + "FactBlockIpv6": "Address block for IPv6", "FactChecks": "Checks", "FactCores": "Processor cores", "FactDisk": "Free disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "too many tests for now", "RefusalUnknownTicket": "the test expired", "RefusalUnreachable": "server not reachable", + "RegistryCredit": "Address blocks: the RIPE NCC's RIPE Database (ripe.net), used with its permission, data of {0}. It may lag behind the live database.", "ResultsTitle": "What “me-web?” found", "RouterMobile": "On mobile data there is no home router: your provider's network comes first.", "RouterNone": "No home router was found on this connection.", diff --git a/src/MeWeb.App/Strings/es.json b/src/MeWeb.App/Strings/es.json index 1dec070..5fe6f05 100644 --- a/src/MeWeb.App/Strings/es.json +++ b/src/MeWeb.App/Strings/es.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptador de red", "FactAddressesSeen": "Direcciones IPv4 públicas vistas", "FactBattery": "Batería", + "FactBlock": "Bloque de direcciones", + "FactBlockIpv6": "Bloque de direcciones para IPv6", "FactChecks": "Comprobaciones", "FactCores": "Núcleos del procesador", "FactDisk": "Espacio libre en disco", @@ -259,6 +261,7 @@ "RefusalTooMany": "demasiadas pruebas por ahora", "RefusalUnknownTicket": "la prueba caducó", "RefusalUnreachable": "no se puede llegar al servidor", + "RegistryCredit": "Bloques de direcciones: la RIPE Database del RIPE NCC (ripe.net), usada con su permiso, datos del {0}. Puede estar menos actualizada que la base de datos en línea.", "ResultsTitle": "Lo que ha encontrado “me-web?”", "RouterMobile": "Con datos móviles no hay router en casa: lo primero es la red de su proveedor.", "RouterNone": "No se ha encontrado ningún router de casa en esta conexión.", diff --git a/src/MeWeb.App/Strings/et.json b/src/MeWeb.App/Strings/et.json index 3afe753..5706f34 100644 --- a/src/MeWeb.App/Strings/et.json +++ b/src/MeWeb.App/Strings/et.json @@ -84,6 +84,8 @@ "FactAdapter": "Võrguadapter", "FactAddressesSeen": "Nähtud avalikud IPv4-aadressid", "FactBattery": "Aku", + "FactBlock": "Aadressiplokk", + "FactBlockIpv6": "IPv6-aadressiplokk", "FactChecks": "Kontrollid", "FactCores": "Protsessori tuumad", "FactDisk": "Vaba kettaruum", @@ -259,6 +261,7 @@ "RefusalTooMany": "praegu liiga palju teste", "RefusalUnknownTicket": "test aegus", "RefusalUnreachable": "server pole kättesaadav", + "RegistryCredit": "Aadressiplokid: organisatsiooni RIPE NCC andmebaas RIPE Database (ripe.net), kasutatud selle loal, andmed seisuga {0}. Andmed võivad internetis olevast andmebaasist maha jääda.", "ResultsTitle": "Mida „me-web?“ leidis", "RouterMobile": "Mobiilse andmeside puhul kodust ruuterit pole: kohe algab teenusepakkuja võrk.", "RouterNone": "Selles ühenduses kodust ruuterit ei leitud.", diff --git a/src/MeWeb.App/Strings/fa.json b/src/MeWeb.App/Strings/fa.json index 4d71cb3..d6b5ccc 100644 --- a/src/MeWeb.App/Strings/fa.json +++ b/src/MeWeb.App/Strings/fa.json @@ -84,6 +84,8 @@ "FactAdapter": "کارت شبکه", "FactAddressesSeen": "نشانی‌های IPv4 عمومی دیده‌شده", "FactBattery": "باتری", + "FactBlock": "بازهٔ نشانی", + "FactBlockIpv6": "بازهٔ نشانی برای IPv6", "FactChecks": "بررسی‌ها", "FactCores": "هسته‌های پردازنده", "FactDisk": "فضای خالی دیسک", @@ -259,6 +261,7 @@ "RefusalTooMany": "فعلاً آزمایش‌ها بیش از حد است", "RefusalUnknownTicket": "مهلت آزمایش تمام شد", "RefusalUnreachable": "سرور در دسترس نیست", + "RegistryCredit": "بازه‌های نشانی: RIPE Database از RIPE NCC (ripe.net)، با اجازهٔ آن استفاده‌شده، داده‌های {0}. این داده‌ها ممکن است از پایگاه دادهٔ آنلاین عقب‌تر باشند.", "ResultsTitle": "آنچه «me-web?» پیدا کرد", "RouterMobile": "با اینترنت همراه، مودم خانگی در کار نیست: اول شبکهٔ ارائه‌دهندهٔ اینترنت شما قرار دارد.", "RouterNone": "روی این اتصال مودم خانگی پیدا نشد.", diff --git a/src/MeWeb.App/Strings/fi.json b/src/MeWeb.App/Strings/fi.json index cdbedf5..988c589 100644 --- a/src/MeWeb.App/Strings/fi.json +++ b/src/MeWeb.App/Strings/fi.json @@ -84,6 +84,8 @@ "FactAdapter": "Verkkosovitin", "FactAddressesSeen": "Nähdyt julkiset IPv4-osoitteet", "FactBattery": "Akku", + "FactBlock": "Osoitelohko", + "FactBlockIpv6": "IPv6-osoitelohko", "FactChecks": "Tarkistukset", "FactCores": "Suoritinytimet", "FactDisk": "Vapaa tallennustila", @@ -259,6 +261,7 @@ "RefusalTooMany": "liian monta testiä juuri nyt", "RefusalUnknownTicket": "testi vanhentui", "RefusalUnreachable": "palvelinta ei tavoitettu", + "RegistryCredit": "Osoitelohkot: RIPE NCC:n RIPE Database (ripe.net), käytetty sen luvalla, tiedot päivältä {0}. Tiedot voivat olla jäljessä verkossa olevasta tietokannasta.", "ResultsTitle": "Mitä ”me-web?” löysi", "RouterMobile": "Mobiilidatalla ei ole kotireititintä: ensimmäisenä tulee operaattorisi verkko.", "RouterNone": "Tältä yhteydeltä ei löytynyt kotireititintä.", diff --git a/src/MeWeb.App/Strings/fil.json b/src/MeWeb.App/Strings/fil.json index 1555781..520d1c3 100644 --- a/src/MeWeb.App/Strings/fil.json +++ b/src/MeWeb.App/Strings/fil.json @@ -84,6 +84,8 @@ "FactAdapter": "Network adapter", "FactAddressesSeen": "Mga pampublikong IPv4 address na nakita", "FactBattery": "Baterya", + "FactBlock": "Bloke ng address", + "FactBlockIpv6": "Bloke ng address para sa IPv6", "FactChecks": "Mga pagsusuri", "FactCores": "Mga core ng processor", "FactDisk": "Bakanteng disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "masyadong maraming test sa ngayon", "RefusalUnknownTicket": "nag-expire na ang test", "RefusalUnreachable": "hindi maabot ang server", + "RegistryCredit": "Mga bloke ng address: ang RIPE Database ng RIPE NCC (ripe.net), ginamit nang may pahintulot nito, data noong {0}. Maaaring nahuhuli ito sa database na nasa internet.", "ResultsTitle": "Ang nakita ng “me-web?”", "RouterMobile": "Sa mobile data, walang router sa bahay: ang network ng iyong provider ang unang hakbang.", "RouterNone": "Walang nakitang router sa bahay sa koneksyong ito.", diff --git a/src/MeWeb.App/Strings/fj.json b/src/MeWeb.App/Strings/fj.json index 0623c3a..218e4ee 100644 --- a/src/MeWeb.App/Strings/fj.json +++ b/src/MeWeb.App/Strings/fj.json @@ -84,6 +84,8 @@ "FactAdapter": "Tiki ni veisemati (network adapter)", "FactAddressesSeen": "Itikotiko raraba IPv4 e raici", "FactBattery": "Bateri", + "FactBlock": "Iwasewase ni itikotiko", + "FactBlockIpv6": "Iwasewase ni itikotiko ni IPv6", "FactChecks": "Vakadikevi", "FactCores": "Uto ni kompiuta (cores)", "FactDisk": "Vanua galala (disk)", @@ -259,6 +261,7 @@ "RefusalTooMany": "vuqa vakalevu na vakatovotovo ena gauna oqo", "RefusalUnknownTicket": "sa oti na gauna ni vakatovotovo", "RefusalUnreachable": "sega ni yacovi rawa na kompiuta ni veiqaravi", + "RegistryCredit": "Iwasewase ni itikotiko: na RIPE Database ni RIPE NCC (ripe.net), vakayagataki ena nona veivakadonui, itukutuku ni {0}. E rawa ni makawa cake na itukutuku oqo mai na database ena internet.", "ResultsTitle": "Na ka e kunea na “me-web?”", "RouterMobile": "Ena data ni talevoni e sega na router mai vale: na network ni nomuni kabani ni talevoni e liu.", "RouterNone": "E sega ni kunei e dua na router ni vale ena veisemati oqo.", diff --git a/src/MeWeb.App/Strings/fr.json b/src/MeWeb.App/Strings/fr.json index dde899c..294acc0 100644 --- a/src/MeWeb.App/Strings/fr.json +++ b/src/MeWeb.App/Strings/fr.json @@ -84,6 +84,8 @@ "FactAdapter": "Carte réseau", "FactAddressesSeen": "Adresses IPv4 publiques vues", "FactBattery": "Batterie", + "FactBlock": "Bloc d'adresses", + "FactBlockIpv6": "Bloc d'adresses pour l'IPv6", "FactChecks": "Vérifications", "FactCores": "Cœurs du processeur", "FactDisk": "Espace disque libre", @@ -259,6 +261,7 @@ "RefusalTooMany": "trop de tests pour le moment", "RefusalUnknownTicket": "le test a expiré", "RefusalUnreachable": "serveur injoignable", + "RegistryCredit": "Blocs d'adresses\u00A0: la RIPE Database du RIPE NCC (ripe.net), utilisée avec son autorisation, données du {0}. Elles peuvent être en retard sur la base de données en ligne.", "ResultsTitle": "Ce que «\u00A0me-web?\u00A0» a trouvé", "RouterMobile": "En données mobiles, il n'y a pas de box\u00A0: le réseau de votre opérateur vient en premier.", "RouterNone": "Aucune box n'a été trouvée sur cette connexion.", diff --git a/src/MeWeb.App/Strings/ga.json b/src/MeWeb.App/Strings/ga.json index 2d30dfb..5b44704 100644 --- a/src/MeWeb.App/Strings/ga.json +++ b/src/MeWeb.App/Strings/ga.json @@ -84,6 +84,8 @@ "FactAdapter": "Cuibheoir líonra", "FactAddressesSeen": "Seoltaí poiblí IPv4 a chonacthas", "FactBattery": "Ceallra", + "FactBlock": "Bloc seoltaí", + "FactBlockIpv6": "Bloc seoltaí do IPv6", "FactChecks": "Seiceálacha", "FactCores": "Croíthe an phróiseálaí", "FactDisk": "Spás saor ar an diosca", @@ -259,6 +261,7 @@ "RefusalTooMany": "an iomarca tástálacha faoi láthair", "RefusalUnknownTicket": "chuaigh an tástáil in éag", "RefusalUnreachable": "ní féidir an freastalaí a bhaint amach", + "RegistryCredit": "Bloic seoltaí: RIPE Database an RIPE NCC (ripe.net), a úsáidtear lena chead, sonraí ó {0}. D'fhéadfadh na sonraí a bheith níos sine ná an bunachar sonraí ar líne.", "ResultsTitle": "An méid a d'aimsigh “me-web?”", "RouterMobile": "Ar shonraí móibíleacha níl aon ródaire baile: is é líonra do sholáthraí an chéad rud.", "RouterNone": "Níor aimsíodh aon ródaire baile ar an nasc seo.", diff --git a/src/MeWeb.App/Strings/gil.json b/src/MeWeb.App/Strings/gil.json index c482b80..ae0e477 100644 --- a/src/MeWeb.App/Strings/gil.json +++ b/src/MeWeb.App/Strings/gil.json @@ -84,6 +84,8 @@ "FactAdapter": "Bwain kaitiboo (network adapter)", "FactAddressesSeen": "Atureti n IPv4 aika nooraki", "FactBattery": "Bwaatere", + "FactBlock": "Kurubun atureti", + "FactBlockIpv6": "Kurubun atureti ibukin IPv6", "FactChecks": "Tuoa", "FactCores": "Mwaakan te kambiuta (cores)", "FactDisk": "Tabo ae akea iai (disk)", @@ -259,6 +261,7 @@ "RefusalTooMany": "a rangi n bati kataneiai ngkai", "RefusalUnknownTicket": "e a toki tain te kataneiai", "RefusalUnreachable": "e aki rokoaki te server", + "RegistryCredit": "Kurubun atureti: te RIPE Database mairoun te RIPE NCC (ripe.net), kabonganaki ma ana kariaia, rongorongo man {0}. Taian rongorongo aikai a kona n rimwi nakon te database ae i aon te internet.", "ResultsTitle": "Bwaai aika kunea te “me-web?”", "RouterMobile": "N te data n tareboon akea te router n te auti: e moa ana network am kambwana n tareboon.", "RouterNone": "Akea te router n te auti ae kuneaki n te kaitiboo aei.", diff --git a/src/MeWeb.App/Strings/gn.json b/src/MeWeb.App/Strings/gn.json index 0833432..6e5984a 100644 --- a/src/MeWeb.App/Strings/gn.json +++ b/src/MeWeb.App/Strings/gn.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptador ñanduti (tarjeta joajuha)", "FactAddressesSeen": "Kundaharape IPv4 opavavapegua ojehecháva", "FactBattery": "Batería", + "FactBlock": "Kundaharape aty", + "FactBlockIpv6": "Kundaharape aty IPv6 peg̃uarã", "FactChecks": "Jehesa'ỹijo", "FactCores": "Procesador núcleo (núcleos)", "FactDisk": "Tenda nandi (disco)", @@ -259,6 +261,7 @@ "RefusalTooMany": "hetaiterei ñeha'ã ko'ág̃a", "RefusalUnknownTicket": "ñeha'ã opáma", "RefusalUnreachable": "servidor ndojehupytýi", + "RegistryCredit": "Kundaharape aty: RIPE Database, RIPE NCC mba'e (ripe.net), ojepuru omoneĩ haguére, mba'ekuaarã {0} rehegua. Ko'ã mba'ekuaarã ikatu itujave database ko'ãgaguágui.", "ResultsTitle": "Mba'épa ojuhu «me-web?»", "RouterMobile": "Celular datos ndive ndaipóri router ógape: nde celular empresa ñanduti ou raẽ.", "RouterNone": "Ndojejuhúi router ógape ko joajúpe.", diff --git a/src/MeWeb.App/Strings/gsw.json b/src/MeWeb.App/Strings/gsw.json index 4d6e4e7..b884bc5 100644 --- a/src/MeWeb.App/Strings/gsw.json +++ b/src/MeWeb.App/Strings/gsw.json @@ -84,6 +84,8 @@ "FactAdapter": "Netzwerkadapter", "FactAddressesSeen": "Gsehni öffentlichi IPv4-Adrässe", "FactBattery": "Akku", + "FactBlock": "Adrässblock", + "FactBlockIpv6": "Adrässblock für IPv6", "FactChecks": "Prüefige", "FactCores": "Prozessorkern", "FactDisk": "Freie Speicherplatz", @@ -259,6 +261,7 @@ "RefusalTooMany": "vorläufig z vill Tests", "RefusalUnknownTicket": "de Test isch abgloffe", "RefusalUnreachable": "Server nöd erreichbar", + "RegistryCredit": "Adrässblöck: d RIPE Database vom RIPE NCC (ripe.net), mit sinere Erlaubnis bruucht, Date vom {0}. D Date chönd älter sii als d Online-Datebank.", "ResultsTitle": "Was «me-web?» gfunde het", "RouterMobile": "Mit mobile Date gits kein Router dihei: Zerscht chunnt grad s Mobilfunknetz vo Ihrem Aabieter.", "RouterNone": "Bi dere Verbindig isch kein Router dihei gfunde worde.", diff --git a/src/MeWeb.App/Strings/he.json b/src/MeWeb.App/Strings/he.json index 42fc091..285f394 100644 --- a/src/MeWeb.App/Strings/he.json +++ b/src/MeWeb.App/Strings/he.json @@ -84,6 +84,8 @@ "FactAdapter": "מתאם רשת", "FactAddressesSeen": "כתובות IPv4 ציבוריות שנראו", "FactBattery": "סוללה", + "FactBlock": "גוש כתובות", + "FactBlockIpv6": "גוש כתובות ל-IPv6", "FactChecks": "בדיקות", "FactCores": "ליבות מעבד", "FactDisk": "מקום פנוי בדיסק", @@ -259,6 +261,7 @@ "RefusalTooMany": "יותר מדי מבחנים כרגע", "RefusalUnknownTicket": "תוקף המבחן פג", "RefusalUnreachable": "השרת לא נגיש", + "RegistryCredit": "גושי כתובות: RIPE Database של RIPE NCC (ripe.net), בשימוש ברשותו, נתונים מ-{0}. ייתכן שהנתונים מעודכנים פחות ממסד הנתונים המקוון.", "ResultsTitle": "מה ”me-web?” מצאה", "RouterMobile": "בנתונים סלולריים אין ראוטר ביתי: הרשת של ספק האינטרנט באה ראשונה.", "RouterNone": "לא נמצא ראוטר ביתי בחיבור הזה.", diff --git a/src/MeWeb.App/Strings/hi.json b/src/MeWeb.App/Strings/hi.json index 3397884..db35066 100644 --- a/src/MeWeb.App/Strings/hi.json +++ b/src/MeWeb.App/Strings/hi.json @@ -84,6 +84,8 @@ "FactAdapter": "नेटवर्क एडैप्टर", "FactAddressesSeen": "दिखे सार्वजनिक IPv4 पते", "FactBattery": "बैटरी", + "FactBlock": "पतों का खंड", + "FactBlockIpv6": "IPv6 के पतों का खंड", "FactChecks": "जाँचें", "FactCores": "प्रोसेसर कोर", "FactDisk": "डिस्क में खाली जगह", @@ -259,6 +261,7 @@ "RefusalTooMany": "अभी बहुत सारे टेस्ट हो चुके", "RefusalUnknownTicket": "टेस्ट का समय ख़त्म हो गया", "RefusalUnreachable": "सर्वर तक नहीं पहुँचा जा सका", + "RegistryCredit": "पतों के खंड: RIPE NCC का RIPE Database (ripe.net), उसकी अनुमति से इस्तेमाल किया गया, {0} का डेटा। यह डेटा ऑनलाइन डेटाबेस से पुराना हो सकता है।", "ResultsTitle": "“me-web?” को क्या मिला", "RouterMobile": "मोबाइल डेटा पर घर का कोई राउटर नहीं होता: सबसे पहले आपकी मोबाइल कंपनी का नेटवर्क आता है।", "RouterNone": "इस कनेक्शन पर घर का कोई राउटर नहीं मिला।", diff --git a/src/MeWeb.App/Strings/hif.json b/src/MeWeb.App/Strings/hif.json index 546aa5d..322fd31 100644 --- a/src/MeWeb.App/Strings/hif.json +++ b/src/MeWeb.App/Strings/hif.json @@ -84,6 +84,8 @@ "FactAdapter": "Network adapter", "FactAddressesSeen": "Dekha gaya public IPv4 address", "FactBattery": "Battery", + "FactBlock": "Address block", + "FactBlockIpv6": "IPv6 ke address block", "FactChecks": "Check", "FactCores": "Processor core", "FactDisk": "Disk me khaali jagah", @@ -259,6 +261,7 @@ "RefusalTooMany": "abhi bahut test hoe gais", "RefusalUnknownTicket": "test ke time khatam hoe gais", "RefusalUnreachable": "server tak nahi pahunche sakaa", + "RegistryCredit": "Address block: RIPE NCC ke RIPE Database (ripe.net), uske ijaazat se use kara jaawe hai, {0} ke data. Ii data online database se purana hoe sake hai.", "ResultsTitle": "“me-web?” ke ka mila", "RouterMobile": "Mobile data pe ghar ke router nahi hai: sab se pahile aap ke mobile company ke network aawe hai.", "RouterNone": "Ii connection pe ghar ke koi router nahi mila.", diff --git a/src/MeWeb.App/Strings/ho.json b/src/MeWeb.App/Strings/ho.json index f7056cb..7a4f991 100644 --- a/src/MeWeb.App/Strings/ho.json +++ b/src/MeWeb.App/Strings/ho.json @@ -84,6 +84,8 @@ "FactAdapter": "Netwek adapta (koneksen gauna)", "FactAddressesSeen": "Pablik IPv4 adres ai itaia", "FactBattery": "Bateri", + "FactBlock": "Adres hegogo", + "FactBlockIpv6": "IPv6 totona adres hegogo", "FactChecks": "Tahua", "FactCores": "Kompiuta ena goada (cores)", "FactDisk": "Gabu ia noho (disk)", @@ -259,6 +261,7 @@ "RefusalTooMany": "hari tes momo herea", "RefusalUnknownTicket": "tes ena nega ia ore", "RefusalUnreachable": "seva ai davaria diba lasi", + "RegistryCredit": "Adres hegogo: RIPE NCC ena RIPE Database (ripe.net), ena gwau namo dainai idia gaukaralaia, {0} ena data. Inai data be online database amo ia gunana herea diba.", "ResultsTitle": "“me-web?” ese ia davaria gaudia", "RouterMobile": "Telefon data ai ruma router ia lasi: emu telefon kampani ena netwek be ginigunana.", "RouterNone": "Inai koneksen ai ruma router ta ai davaria lasi.", diff --git a/src/MeWeb.App/Strings/hr.json b/src/MeWeb.App/Strings/hr.json index 7981a23..e8312ae 100644 --- a/src/MeWeb.App/Strings/hr.json +++ b/src/MeWeb.App/Strings/hr.json @@ -84,6 +84,8 @@ "FactAdapter": "Mrežni adapter", "FactAddressesSeen": "Viđene javne IPv4 adrese", "FactBattery": "Baterija", + "FactBlock": "Blok adresa", + "FactBlockIpv6": "Blok adresa za IPv6", "FactChecks": "Provjere", "FactCores": "Jezgre procesora", "FactDisk": "Slobodan prostor na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "trenutačno previše testova", "RefusalUnknownTicket": "test je istekao", "RefusalUnreachable": "server nije dostupan", + "RegistryCredit": "Blokovi adresa: RIPE Database organizacije RIPE NCC (ripe.net), koristi se uz njezino dopuštenje, podaci od {0}. Podaci mogu zaostajati za bazom podataka na mreži.", "ResultsTitle": "Što je aplikacija „me-web?“ pronašla", "RouterMobile": "Na mobilnim podacima nema kućnog routera: odmah na početku je mreža operatera.", "RouterNone": "Na ovoj vezi nije pronađen kućni router.", diff --git a/src/MeWeb.App/Strings/ht.json b/src/MeWeb.App/Strings/ht.json index 8033ab5..3da9886 100644 --- a/src/MeWeb.App/Strings/ht.json +++ b/src/MeWeb.App/Strings/ht.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptatè rezo", "FactAddressesSeen": "Adrès IPv4 piblik ki parèt", "FactBattery": "Batri", + "FactBlock": "Blòk adrès", + "FactBlockIpv6": "Blòk adrès pou IPv6", "FactChecks": "Verifikasyon", "FactCores": "Nwayo pwosesè", "FactDisk": "Espas lib sou disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "twòp tès pou kounye a", "RefusalUnknownTicket": "tès la ekspire", "RefusalUnreachable": "pa ka jwenn sèvè a", + "RegistryCredit": "Blòk adrès yo: RIPE Database RIPE NCC a (ripe.net), itilize ak pèmisyon li, done {0}. Done yo ka pi ansyen pase baz done an liy lan.", "ResultsTitle": "Sa «\u00A0me-web?\u00A0» jwenn", "RouterMobile": "Sou done mobil, pa gen routè lakay: rezo konpayi a vini an premye.", "RouterNone": "Pa jwenn okenn routè lakay sou koneksyon sa a.", diff --git a/src/MeWeb.App/Strings/hu.json b/src/MeWeb.App/Strings/hu.json index 8864870..0f0729e 100644 --- a/src/MeWeb.App/Strings/hu.json +++ b/src/MeWeb.App/Strings/hu.json @@ -84,6 +84,8 @@ "FactAdapter": "Hálózati adapter", "FactAddressesSeen": "Látott nyilvános IPv4-címek", "FactBattery": "Akkumulátor", + "FactBlock": "Címtömb", + "FactBlockIpv6": "Címtömb IPv6-hoz", "FactChecks": "Ellenőrzések", "FactCores": "Processzormagok", "FactDisk": "Szabad tárhely", @@ -259,6 +261,7 @@ "RefusalTooMany": "egyelőre túl sok teszt", "RefusalUnknownTicket": "a teszt lejárt", "RefusalUnreachable": "a szerver nem érhető el", + "RegistryCredit": "Címtömbök: a RIPE NCC RIPE Database-e (ripe.net), az engedélyével használva, az adatok dátuma: {0}. Az adatok régebbiek lehetnek az online adatbázisnál.", "ResultsTitle": "Amit a „me-web?” talált", "RouterMobile": "Mobiladattal nincs otthoni router: elsőként a szolgáltató hálózata következik.", "RouterNone": "Ezen a kapcsolaton nem található otthoni router.", diff --git a/src/MeWeb.App/Strings/hy.json b/src/MeWeb.App/Strings/hy.json index d6cbd34..674318b 100644 --- a/src/MeWeb.App/Strings/hy.json +++ b/src/MeWeb.App/Strings/hy.json @@ -84,6 +84,8 @@ "FactAdapter": "Ցանցային ադապտեր", "FactAddressesSeen": "Տեսած հանրային IPv4 հասցեներ", "FactBattery": "Մարտկոց", + "FactBlock": "Հասցեների բլոկ", + "FactBlockIpv6": "Հասցեների բլոկ IPv6-ի համար", "FactChecks": "Ստուգումներ", "FactCores": "Պրոցեսորի միջուկներ", "FactDisk": "Ազատ տեղ սկավառակում", @@ -259,6 +261,7 @@ "RefusalTooMany": "առայժմ չափազանց շատ թեստեր", "RefusalUnknownTicket": "թեստի ժամկետն անցել է", "RefusalUnreachable": "սերվերը հասանելի չէ", + "RegistryCredit": "Հասցեների բլոկներ՝ RIPE NCC-ի RIPE Database (ripe.net), օգտագործվում է նրա թույլտվությամբ, տվյալները՝ {0}-ի դրությամբ։ Տվյալները կարող են հետ մնալ առցանց տվյալների բազայից։", "ResultsTitle": "Ինչ գտավ «me-web?»-ը", "RouterMobile": "Բջջային ինտերնետով տնային ռոութեր չկա․ առաջինը ձեր մատակարարի ցանցն է։", "RouterNone": "Այս կապում տնային ռոութեր չգտնվեց։", diff --git a/src/MeWeb.App/Strings/id.json b/src/MeWeb.App/Strings/id.json index cd6a2d7..8fb3a5b 100644 --- a/src/MeWeb.App/Strings/id.json +++ b/src/MeWeb.App/Strings/id.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptor jaringan", "FactAddressesSeen": "Alamat IPv4 publik yang terlihat", "FactBattery": "Baterai", + "FactBlock": "Blok alamat", + "FactBlockIpv6": "Blok alamat untuk IPv6", "FactChecks": "Pemeriksaan", "FactCores": "Inti prosesor", "FactDisk": "Ruang disk kosong", @@ -259,6 +261,7 @@ "RefusalTooMany": "terlalu banyak tes untuk saat ini", "RefusalUnknownTicket": "tes sudah kedaluwarsa", "RefusalUnreachable": "server tidak bisa dijangkau", + "RegistryCredit": "Blok alamat: RIPE Database milik RIPE NCC (ripe.net), digunakan dengan izinnya, data per {0}. Data ini mungkin tertinggal dari database online.", "ResultsTitle": "Temuan “me-web?”", "RouterMobile": "Dengan data seluler tidak ada router rumah: langkah pertama adalah jaringan penyedia internet Anda.", "RouterNone": "Tidak ditemukan router rumah di koneksi ini.", diff --git a/src/MeWeb.App/Strings/is.json b/src/MeWeb.App/Strings/is.json index b7262a2..8135b6e 100644 --- a/src/MeWeb.App/Strings/is.json +++ b/src/MeWeb.App/Strings/is.json @@ -84,6 +84,8 @@ "FactAdapter": "Netkort", "FactAddressesSeen": "Opinberar IPv4-tölur sem hafa sést", "FactBattery": "Rafhlaða", + "FactBlock": "IP-tölublokk", + "FactBlockIpv6": "IP-tölublokk fyrir IPv6", "FactChecks": "Athuganir", "FactCores": "Örgjörvakjarnar", "FactDisk": "Laust geymslupláss", @@ -259,6 +261,7 @@ "RefusalTooMany": "of margar prófanir í bili", "RefusalUnknownTicket": "prófunin rann út", "RefusalUnreachable": "ekki næst í netþjóninn", + "RegistryCredit": "IP-tölublokkir: RIPE Database frá RIPE NCC (ripe.net), notaðar með leyfi RIPE NCC, gögn frá {0}. Gögnin geta verið eldri en gagnagrunnurinn á netinu.", "ResultsTitle": "Það sem „me-web?“ fann", "RouterMobile": "Á farsímagögnum er enginn beinir heima: net þjónustuaðilans kemur fyrst.", "RouterNone": "Enginn beinir fannst heima á þessari tengingu.", diff --git a/src/MeWeb.App/Strings/it.json b/src/MeWeb.App/Strings/it.json index 0b4f01f..63ac5e1 100644 --- a/src/MeWeb.App/Strings/it.json +++ b/src/MeWeb.App/Strings/it.json @@ -84,6 +84,8 @@ "FactAdapter": "Scheda di rete", "FactAddressesSeen": "Indirizzi IPv4 pubblici visti", "FactBattery": "Batteria", + "FactBlock": "Blocco di indirizzi", + "FactBlockIpv6": "Blocco di indirizzi per IPv6", "FactChecks": "Verifiche", "FactCores": "Core del processore", "FactDisk": "Disco libero", @@ -259,6 +261,7 @@ "RefusalTooMany": "troppe prove per ora", "RefusalUnknownTicket": "la prova è scaduta", "RefusalUnreachable": "server non raggiungibile", + "RegistryCredit": "Blocchi di indirizzi: il RIPE Database del RIPE NCC (ripe.net), usato con il suo permesso, dati del {0}. Può essere meno aggiornato del database in linea.", "ResultsTitle": "Che cosa ha trovato «me-web?»", "RouterMobile": "Con i dati mobili non c'è un router di casa: si passa subito dalla rete dell'operatore.", "RouterNone": "Su questa connessione non è stato trovato un router di casa.", diff --git a/src/MeWeb.App/Strings/ja.json b/src/MeWeb.App/Strings/ja.json index df12734..a6c9772 100644 --- a/src/MeWeb.App/Strings/ja.json +++ b/src/MeWeb.App/Strings/ja.json @@ -84,6 +84,8 @@ "FactAdapter": "ネットワークアダプター", "FactAddressesSeen": "これまでのグローバル IPv4 アドレス", "FactBattery": "バッテリー", + "FactBlock": "アドレス範囲", + "FactBlockIpv6": "IPv6 のアドレス範囲", "FactChecks": "チェック回数", "FactCores": "プロセッサーのコア数", "FactDisk": "ディスクの空き容量", @@ -259,6 +261,7 @@ "RefusalTooMany": "今はテストが多すぎる", "RefusalUnknownTicket": "テストの期限切れ", "RefusalUnreachable": "サーバーにつながらない", + "RegistryCredit": "アドレス範囲:RIPE NCC の RIPE Database(ripe.net)、同機関の許可を得て使用、{0} 時点のデータ。オンラインのデータベースより古い場合があります。", "ResultsTitle": "「me-web?」が見つけたこと", "RouterMobile": "モバイルデータでは家庭用ルーターはなく、最初にプロバイダーのネットワークを通ります。", "RouterNone": "この接続では家庭用ルーターが見つかりませんでした。", diff --git a/src/MeWeb.App/Strings/ka.json b/src/MeWeb.App/Strings/ka.json index 42a5798..4858812 100644 --- a/src/MeWeb.App/Strings/ka.json +++ b/src/MeWeb.App/Strings/ka.json @@ -84,6 +84,8 @@ "FactAdapter": "ქსელის ადაპტერი", "FactAddressesSeen": "ნანახი საჯარო IPv4 მისამართები", "FactBattery": "ბატარეა", + "FactBlock": "მისამართების ბლოკი", + "FactBlockIpv6": "მისამართების ბლოკი IPv6-ისთვის", "FactChecks": "შემოწმებები", "FactCores": "პროცესორის ბირთვები", "FactDisk": "თავისუფალი ადგილი დისკზე", @@ -259,6 +261,7 @@ "RefusalTooMany": "ახლა ძალიან ბევრი ტესტია", "RefusalUnknownTicket": "ტესტის ვადა ამოიწურა", "RefusalUnreachable": "სერვერი მიუწვდომელია", + "RegistryCredit": "მისამართების ბლოკები: RIPE NCC-ის RIPE Database (ripe.net), გამოყენებულია მისი ნებართვით, მონაცემები {0}-ის მდგომარეობით. მონაცემები შეიძლება ჩამორჩებოდეს ონლაინ მონაცემთა ბაზას.", "ResultsTitle": "რა იპოვა „me-web?“-მა", "RouterMobile": "მობილურ ინტერნეტზე სახლის როუტერი არ არის: პირდაპირ პროვაიდერის ქსელში ხვდებით.", "RouterNone": "ამ კავშირზე სახლის როუტერი ვერ მოიძებნა.", diff --git a/src/MeWeb.App/Strings/kk.json b/src/MeWeb.App/Strings/kk.json index 3c79262..dea09e6 100644 --- a/src/MeWeb.App/Strings/kk.json +++ b/src/MeWeb.App/Strings/kk.json @@ -84,6 +84,8 @@ "FactAdapter": "Желі адаптері", "FactAddressesSeen": "Көрінген жария IPv4 мекенжайлары", "FactBattery": "Батарея", + "FactBlock": "Мекенжай блогы", + "FactBlockIpv6": "IPv6 мекенжай блогы", "FactChecks": "Тексерулер", "FactCores": "Процессор ядролары", "FactDisk": "Дискідегі бос орын", @@ -259,6 +261,7 @@ "RefusalTooMany": "әзірге тест тым көп", "RefusalUnknownTicket": "тест мерзімі өтті", "RefusalUnreachable": "серверге жету мүмкін емес", + "RegistryCredit": "Мекенжай блоктары: RIPE NCC ұйымының RIPE Database дерекқоры (ripe.net), оның рұқсатымен пайдаланылады, {0} күнгі деректер. Деректер желідегі дерекқордан артта қалуы мүмкін.", "ResultsTitle": "«me-web?» не тапты", "RouterMobile": "Мобильді интернетте үй роутері болмайды: алдымен провайдердің желісі тұрады.", "RouterNone": "Бұл қосылымда үй роутері табылмады.", diff --git a/src/MeWeb.App/Strings/km.json b/src/MeWeb.App/Strings/km.json index 9a59eb3..c6b5080 100644 --- a/src/MeWeb.App/Strings/km.json +++ b/src/MeWeb.App/Strings/km.json @@ -84,6 +84,8 @@ "FactAdapter": "កាតបណ្ដាញ", "FactAddressesSeen": "អាសយដ្ឋាន IPv4 សាធារណៈដែលបានឃើញ", "FactBattery": "ថ្ម", + "FactBlock": "ចន្លោះអាសយដ្ឋាន", + "FactBlockIpv6": "ចន្លោះអាសយដ្ឋានសម្រាប់ IPv6", "FactChecks": "ការពិនិត្យ", "FactCores": "ស្នូលប្រូសេស្ស័រ", "FactDisk": "ទំហំផ្ទុកទំនេរ", @@ -259,6 +261,7 @@ "RefusalTooMany": "ការសាកល្បងច្រើនពេកសម្រាប់ពេលនេះ", "RefusalUnknownTicket": "ការសាកល្បងផុតពេលហើយ", "RefusalUnreachable": "មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេ", + "RegistryCredit": "ចន្លោះអាសយដ្ឋាន៖ RIPE Database របស់ RIPE NCC (ripe.net) ប្រើដោយមានការអនុញ្ញាតពីស្ថាប័ននេះ ទិន្នន័យនៃ {0}។ ទិន្នន័យនេះអាចចាស់ជាងមូលដ្ឋានទិន្នន័យអនឡាញ។", "ResultsTitle": "អ្វីដែល “me-web?” បានរកឃើញ", "RouterMobile": "ពេលប្រើទិន្នន័យចល័ត គ្មានរ៉ោតទ័រផ្ទះទេ៖ បណ្ដាញរបស់ក្រុមហ៊ុនអ៊ីនធឺណិតមកមុនគេ។", "RouterNone": "រកមិនឃើញរ៉ោតទ័រផ្ទះនៅលើការតភ្ជាប់នេះទេ។", diff --git a/src/MeWeb.App/Strings/ko.json b/src/MeWeb.App/Strings/ko.json index f0f93a5..b357265 100644 --- a/src/MeWeb.App/Strings/ko.json +++ b/src/MeWeb.App/Strings/ko.json @@ -84,6 +84,8 @@ "FactAdapter": "네트워크 어댑터", "FactAddressesSeen": "확인된 공인 IPv4 주소", "FactBattery": "배터리", + "FactBlock": "주소 묶음", + "FactBlockIpv6": "IPv6 주소 묶음", "FactChecks": "점검 횟수", "FactCores": "프로세서 코어", "FactDisk": "남은 저장 공간", @@ -259,6 +261,7 @@ "RefusalTooMany": "지금은 테스트가 너무 많음", "RefusalUnknownTicket": "테스트 시간이 지남", "RefusalUnreachable": "서버에 연결할 수 없음", + "RegistryCredit": "주소 묶음: RIPE NCC의 RIPE Database(ripe.net), 해당 기관의 허가를 받아 사용, {0} 기준 데이터. 온라인 데이터베이스보다 오래된 정보일 수 있습니다.", "ResultsTitle": "“me-web?”이 찾은 것", "RouterMobile": "모바일 데이터에는 집 공유기가 없습니다. 통신사 네트워크가 첫 단계입니다.", "RouterNone": "이 연결에서 집 공유기를 찾지 못했습니다.", diff --git a/src/MeWeb.App/Strings/ky.json b/src/MeWeb.App/Strings/ky.json index 9309ec0..3f568a5 100644 --- a/src/MeWeb.App/Strings/ky.json +++ b/src/MeWeb.App/Strings/ky.json @@ -84,6 +84,8 @@ "FactAdapter": "Тармак адаптери", "FactAddressesSeen": "Көрүнгөн тышкы IPv4 даректери", "FactBattery": "Батарея", + "FactBlock": "Дарек блогу", + "FactBlockIpv6": "IPv6 дарек блогу", "FactChecks": "Текшерүүлөр", "FactCores": "Процессордун ядролору", "FactDisk": "Дисктеги бош орун", @@ -259,6 +261,7 @@ "RefusalTooMany": "азырынча тест өтө көп", "RefusalUnknownTicket": "тесттин мөөнөтү бүттү", "RefusalUnreachable": "серверге жетүү мүмкүн эмес", + "RegistryCredit": "Дарек блоктору: RIPE NCC уюмунун RIPE Database маалымат базасы (ripe.net), анын уруксаты менен колдонулат, {0} күнкү маалыматтар. Маалыматтар онлайн маалымат базасынан артта калышы мүмкүн.", "ResultsTitle": "«me-web?» эмне тапты", "RouterMobile": "Мобилдик интернетте үй роутери болбойт: адегенде провайдердин тармагы турат.", "RouterNone": "Бул туташууда үй роутери табылган жок.", diff --git a/src/MeWeb.App/Strings/lb.json b/src/MeWeb.App/Strings/lb.json index dd640e1..e01ab59 100644 --- a/src/MeWeb.App/Strings/lb.json +++ b/src/MeWeb.App/Strings/lb.json @@ -84,6 +84,8 @@ "FactAdapter": "Netzwierkadapter", "FactAddressesSeen": "Gesinn ëffentlech IPv4-Adressen", "FactBattery": "Batterie", + "FactBlock": "Adressblock", + "FactBlockIpv6": "Adressblock fir IPv6", "FactChecks": "Kontrollen", "FactCores": "Prozessorkären", "FactDisk": "Fräi Späicherplaz", @@ -259,6 +261,7 @@ "RefusalTooMany": "fir de Moment ze vill Tester", "RefusalUnknownTicket": "den Test ass ofgelaf", "RefusalUnreachable": "Server net z'erreechen", + "RegistryCredit": "Adressbléck: d'RIPE Database vum RIPE NCC (ripe.net), mat senger Erlaabnis benotzt, Daten vum {0}. D'Daten kënne méi al si wéi d'Online-Datebank.", "ResultsTitle": "Wat „me-web?“ fonnt huet", "RouterMobile": "Mat mobilen Daten gëtt et kee Router doheem: Als éischt kënnt direkt d'Mobilfunknetz vun Ärem Ubidder.", "RouterNone": "Op dëser Verbindung gouf kee Router doheem fonnt.", diff --git a/src/MeWeb.App/Strings/lo.json b/src/MeWeb.App/Strings/lo.json index 682ca53..48709e9 100644 --- a/src/MeWeb.App/Strings/lo.json +++ b/src/MeWeb.App/Strings/lo.json @@ -84,6 +84,8 @@ "FactAdapter": "ອະແດັບເຕີເຄືອຂ່າຍ", "FactAddressesSeen": "ທີ່ຢູ່ IPv4 ສາທາລະນະທີ່ພົບ", "FactBattery": "ແບັດເຕີຣີ", + "FactBlock": "ຊ່ວງທີ່ຢູ່", + "FactBlockIpv6": "ຊ່ວງທີ່ຢູ່ສຳລັບ IPv6", "FactChecks": "ການກວດສອບ", "FactCores": "ແກນປະມວນຜົນ (core)", "FactDisk": "ພື້ນທີ່ຫວ່າງໃນດິສກ໌", @@ -259,6 +261,7 @@ "RefusalTooMany": "ທົດສອບຫຼາຍເກີນໄປໃນຕອນນີ້", "RefusalUnknownTicket": "ການທົດສອບໝົດອາຍຸແລ້ວ", "RefusalUnreachable": "ຕິດຕໍ່ເຊີເວີບໍ່ໄດ້", + "RegistryCredit": "ຊ່ວງທີ່ຢູ່: RIPE Database ຂອງ RIPE NCC (ripe.net), ໃຊ້ໂດຍໄດ້ຮັບອະນຸຍາດຈາກອົງການນີ້, ຂໍ້ມູນວັນທີ {0}. ຂໍ້ມູນນີ້ອາດເກົ່າກວ່າຖານຂໍ້ມູນອອນລາຍ.", "ResultsTitle": "ສິ່ງທີ່ “me-web?” ພົບ", "RouterMobile": "ເມື່ອໃຊ້ອິນເຕີເນັດມືຖື ຈະບໍ່ມີເຣົາເຕີໃນເຮືອນ: ເຄືອຂ່າຍຂອງຜູ້ໃຫ້ບໍລິການແມ່ນດ່ານທຳອິດ.", "RouterNone": "ບໍ່ພົບເຣົາເຕີໃນເຮືອນໃນການເຊື່ອມຕໍ່ນີ້.", diff --git a/src/MeWeb.App/Strings/lt.json b/src/MeWeb.App/Strings/lt.json index 734f957..ede125e 100644 --- a/src/MeWeb.App/Strings/lt.json +++ b/src/MeWeb.App/Strings/lt.json @@ -84,6 +84,8 @@ "FactAdapter": "Tinklo adapteris", "FactAddressesSeen": "Matyti viešieji IPv4 adresai", "FactBattery": "Baterija", + "FactBlock": "Adresų blokas", + "FactBlockIpv6": "IPv6 adresų blokas", "FactChecks": "Patikrinimai", "FactCores": "Procesoriaus branduoliai", "FactDisk": "Laisva vieta diske", @@ -259,6 +261,7 @@ "RefusalTooMany": "kol kas per daug testų", "RefusalUnknownTicket": "testo laikas baigėsi", "RefusalUnreachable": "serveris nepasiekiamas", + "RegistryCredit": "Adresų blokai: RIPE NCC duomenų bazė RIPE Database (ripe.net), naudojama su RIPE NCC leidimu, duomenys iš {0}. Duomenys gali atsilikti nuo internetinės duomenų bazės.", "ResultsTitle": "Ką rado „me-web?“", "RouterMobile": "Naudojant mobiliuosius duomenis namų maršrutizatoriaus nėra: iš karto prasideda teikėjo tinklas.", "RouterNone": "Šiame ryšyje namų maršrutizatorius nerastas.", diff --git a/src/MeWeb.App/Strings/lv.json b/src/MeWeb.App/Strings/lv.json index 9307ab8..b3aa6e1 100644 --- a/src/MeWeb.App/Strings/lv.json +++ b/src/MeWeb.App/Strings/lv.json @@ -84,6 +84,8 @@ "FactAdapter": "Tīkla adapteris", "FactAddressesSeen": "Redzētās publiskās IPv4 adreses", "FactBattery": "Akumulators", + "FactBlock": "Adrešu bloks", + "FactBlockIpv6": "IPv6 adrešu bloks", "FactChecks": "Pārbaudes", "FactCores": "Procesora kodoli", "FactDisk": "Brīvā vieta diskā", @@ -259,6 +261,7 @@ "RefusalTooMany": "pagaidām pārāk daudz testu", "RefusalUnknownTicket": "testa termiņš beidzās", "RefusalUnreachable": "serveris nav sasniedzams", + "RegistryCredit": "Adrešu bloki: RIPE NCC datubāze RIPE Database (ripe.net), izmantota ar RIPE NCC atļauju, dati uz {0}. Dati var atpalikt no tiešsaistes datubāzes.", "ResultsTitle": "Ko atrada “me-web?”", "RouterMobile": "Ar mobilajiem datiem mājas maršrutētāja nav: uzreiz sākas operatora tīkls.", "RouterNone": "Šajā savienojumā mājas maršrutētājs netika atrasts.", diff --git a/src/MeWeb.App/Strings/mg.json b/src/MeWeb.App/Strings/mg.json index a791037..e995a4e 100644 --- a/src/MeWeb.App/Strings/mg.json +++ b/src/MeWeb.App/Strings/mg.json @@ -84,6 +84,8 @@ "FactAdapter": "Karatra tambajotra", "FactAddressesSeen": "Adiresy IPv4 ampahibemaso hita", "FactBattery": "Bateria", + "FactBlock": "Vondron'adiresy", + "FactBlockIpv6": "Vondron'adiresy ho an'ny IPv6", "FactChecks": "Fanamarinana", "FactCores": "Fo amin'ny processeur (cores)", "FactDisk": "Toerana malalaka amin'ny kapila", @@ -259,6 +261,7 @@ "RefusalTooMany": "be loatra ny fitsapana amin'izao", "RefusalUnknownTicket": "lany daty ny fitsapana", "RefusalUnreachable": "tsy tratra ny mpizara", + "RegistryCredit": "Vondron'adiresy: RIPE Database an'ny RIPE NCC (ripe.net), ampiasaina noho ny fahazoan-dàlana nomeny, angona tamin'ny {0}. Mety ho tranainy noho ny tahiry angona an-tserasera ireo angona ireo.", "ResultsTitle": "Izay hitan'ny «me-web?»", "RouterMobile": "Amin'ny aterineto finday dia tsy misy router an-trano: ny tambajotran'ny mpamatsy anao no voalohany.", "RouterNone": "Tsy nisy router an-trano hita tamin'ity fifandraisana ity.", diff --git a/src/MeWeb.App/Strings/mh.json b/src/MeWeb.App/Strings/mh.json index f941edc..c11c6ab 100644 --- a/src/MeWeb.App/Strings/mh.json +++ b/src/MeWeb.App/Strings/mh.json @@ -84,6 +84,8 @@ "FactAdapter": "Kein kobaik (network adapter)", "FactAddressesSeen": "Address in IPv4 ko ear lo ilo internet", "FactBattery": "Battery", + "FactBlock": "Kumi in address", + "FactBlockIpv6": "Kumi in address n̄an IPv6", "FactChecks": "Etale", "FactCores": "Kajoor an kampiuta (cores)", "FactDisk": "Jikin ejjeļo̧k men ie (disk)", @@ -259,6 +261,7 @@ "RefusalTooMany": "eļap an lōn̄ kōmmālmel kiiō", "RefusalUnknownTicket": "iien in kōmmālmel eo ear jem̧ļo̧k", "RefusalUnreachable": "ejjab maron̄ tōpar server eo", + "RegistryCredit": "Kumi in address ko: RIPE Database eo an RIPE NCC (ripe.net), rej kōjerbali kōn an kōtļo̧k, melele jān {0}. Melele kein emaron̄ rūtto jān database eo ilo internet.", "ResultsTitle": "Ta eo “me-web?” ear loe", "RouterMobile": "Ilo data in talboon ejjeļo̧k router ilo m̧weo: network eo an kampeni in talboon eo am ej m̧oktata.", "RouterNone": "Ejjab lo router in m̧weo ilo kobaik in.", diff --git a/src/MeWeb.App/Strings/mi.json b/src/MeWeb.App/Strings/mi.json index 690ec5c..2bed391 100644 --- a/src/MeWeb.App/Strings/mi.json +++ b/src/MeWeb.App/Strings/mi.json @@ -84,6 +84,8 @@ "FactAdapter": "Urutau whatunga", "FactAddressesSeen": "Ngā wāhitau IPv4 tūmatanui kua kitea", "FactBattery": "Pūhiko", + "FactBlock": "Poraka wāhitau", + "FactBlockIpv6": "Poraka wāhitau mō te IPv6", "FactChecks": "Ngā arowhai", "FactCores": "Ngā iho pūtukatuka", "FactDisk": "Wāhi wātea i te kōpae", @@ -259,6 +261,7 @@ "RefusalTooMany": "he nui rawa ngā whakamātautau mō nāianei", "RefusalUnknownTicket": "kua pau te wā o te whakamātautau", "RefusalUnreachable": "kāore e taea te toro ki te tūmau", + "RegistryCredit": "Ngā poraka wāhitau: te RIPE Database a te RIPE NCC (ripe.net), ka whakamahia i runga i tōna whakaaetanga, raraunga o te {0}. Tērā pea he tawhito ake ngā raraunga i te pātengi raraunga ā-ipurangi.", "ResultsTitle": "Ngā mea i kitea e “me-web?”", "RouterMobile": "I te raraunga pūkoro, kāore he pouara kāinga: ko te whatunga a tō kaiwhakarato te hīkoi tuatahi.", "RouterNone": "Kāore i kitea he pouara kāinga i tēnei hononga.", diff --git a/src/MeWeb.App/Strings/mk.json b/src/MeWeb.App/Strings/mk.json index d1119d1..ea0a7ff 100644 --- a/src/MeWeb.App/Strings/mk.json +++ b/src/MeWeb.App/Strings/mk.json @@ -84,6 +84,8 @@ "FactAdapter": "Мрежен адаптер", "FactAddressesSeen": "Видени јавни IPv4 адреси", "FactBattery": "Батерија", + "FactBlock": "Блок адреси", + "FactBlockIpv6": "Блок адреси за IPv6", "FactChecks": "Проверки", "FactCores": "Јадра на процесорот", "FactDisk": "Слободен простор на дискот", @@ -259,6 +261,7 @@ "RefusalTooMany": "премногу тестови засега", "RefusalUnknownTicket": "тестот истече", "RefusalUnreachable": "серверот не е достапен", + "RegistryCredit": "Блокови адреси: RIPE Database на RIPE NCC (ripe.net), се користи со негова дозвола, податоци од {0}. Податоците може да заостануваат зад онлајн базата на податоци.", "ResultsTitle": "Што пронајде „me-web?“", "RouterMobile": "На мобилни податоци нема домашен рутер: прва доаѓа мрежата на провајдерот.", "RouterNone": "На оваа врска не е пронајден домашен рутер.", diff --git a/src/MeWeb.App/Strings/mn.json b/src/MeWeb.App/Strings/mn.json index 313f3f8..cfaf955 100644 --- a/src/MeWeb.App/Strings/mn.json +++ b/src/MeWeb.App/Strings/mn.json @@ -84,6 +84,8 @@ "FactAdapter": "Сүлжээний адаптер", "FactAddressesSeen": "Харагдсан нийтийн IPv4 хаягууд", "FactBattery": "Батарей", + "FactBlock": "Хаягийн блок", + "FactBlockIpv6": "IPv6 хаягийн блок", "FactChecks": "Шалгалтууд", "FactCores": "Процессорын цөм", "FactDisk": "Дискний сул зай", @@ -259,6 +261,7 @@ "RefusalTooMany": "одоогоор хэт олон туршилт", "RefusalUnknownTicket": "туршилтын хугацаа дууссан", "RefusalUnreachable": "серверт хүрэх боломжгүй", + "RegistryCredit": "Хаягийн блокууд: RIPE NCC-ийн RIPE Database (ripe.net), түүний зөвшөөрлөөр ашигласан, {0} өдрийн өгөгдөл. Өгөгдөл нь онлайн мэдээллийн сангаас хоцорсон байж болно.", "ResultsTitle": "“me-web?”-ийн олсон зүйл", "RouterMobile": "Мобайл датад гэрийн роутер байхгүй: эхлээд интернэтийн компанийн сүлжээ ирдэг.", "RouterNone": "Энэ холболтод гэрийн роутер олдсонгүй.", diff --git a/src/MeWeb.App/Strings/ms-Arab.json b/src/MeWeb.App/Strings/ms-Arab.json index 8ea1533..df55f55 100644 --- a/src/MeWeb.App/Strings/ms-Arab.json +++ b/src/MeWeb.App/Strings/ms-Arab.json @@ -84,6 +84,8 @@ "FactAdapter": "ڤڽسواي رڠکاين", "FactAddressesSeen": "علامت IPv4 عوام يڠ دليهت", "FactBattery": "باتري", + "FactBlock": "بلوک علامت", + "FactBlockIpv6": "بلوک علامت اونتوق IPv6", "FactChecks": "سماقن", "FactCores": "تراس ڤمڤروسيس", "FactDisk": "رواڠ کوسوڠ", @@ -259,6 +261,7 @@ "RefusalTooMany": "ترلالو باڽق اوجين بوات ماس اين", "RefusalUnknownTicket": "اوجين سوده تامت تيمڤوه", "RefusalUnreachable": "ڤلاين تيدق داڤت دچاڤاي", + "RegistryCredit": "بلوک علامت: RIPE Database ميليق RIPE NCC (ripe.net)، دݢوناکن دڠن کبنرنڽ، داتا برتاريخ {0}. داتا اين موڠکين کتيڠݢالن بربنديڠ ڤڠکالن داتا دالم تالين.", "ResultsTitle": "اڤ يڠ دتموءي “me-web?”", "RouterMobile": "دڠن داتا موده اليه، تيادا ڤڠهالا رومه: ڤرانتي اندا تروس برسمبوڠ ک رڠکاين ڤڽديا اينترنيت.", "RouterNone": "تيادا ڤڠهالا رومه دتموءي ڤد سمبوڠن اين.", diff --git a/src/MeWeb.App/Strings/ms.json b/src/MeWeb.App/Strings/ms.json index 8735deb..9b30222 100644 --- a/src/MeWeb.App/Strings/ms.json +++ b/src/MeWeb.App/Strings/ms.json @@ -84,6 +84,8 @@ "FactAdapter": "Penyesuai rangkaian", "FactAddressesSeen": "Alamat IPv4 awam yang dilihat", "FactBattery": "Bateri", + "FactBlock": "Blok alamat", + "FactBlockIpv6": "Blok alamat untuk IPv6", "FactChecks": "Semakan", "FactCores": "Teras pemproses", "FactDisk": "Ruang cakera kosong", @@ -259,6 +261,7 @@ "RefusalTooMany": "terlalu banyak ujian buat masa ini", "RefusalUnknownTicket": "ujian telah tamat tempoh", "RefusalUnreachable": "pelayan tidak dapat dicapai", + "RegistryCredit": "Blok alamat: RIPE Database milik RIPE NCC (ripe.net), digunakan dengan kebenarannya, data bertarikh {0}. Data ini mungkin ketinggalan berbanding pangkalan data dalam talian.", "ResultsTitle": "Apa yang ditemui “me-web?”", "RouterMobile": "Dengan data mudah alih tiada router rumah: langkah pertama ialah rangkaian pembekal internet anda.", "RouterNone": "Tiada router rumah ditemui pada sambungan ini.", diff --git a/src/MeWeb.App/Strings/mt.json b/src/MeWeb.App/Strings/mt.json index b6a4218..ab9fc80 100644 --- a/src/MeWeb.App/Strings/mt.json +++ b/src/MeWeb.App/Strings/mt.json @@ -84,6 +84,8 @@ "FactAdapter": "Adapter tan-netwerk", "FactAddressesSeen": "Indirizzi IPv4 pubbliċi li dehru", "FactBattery": "Batterija", + "FactBlock": "Blokk ta' indirizzi", + "FactBlockIpv6": "Blokk ta' indirizzi għal IPv6", "FactChecks": "Kontrolli", "FactCores": "Cores tal-proċessur", "FactDisk": "Spazju ħieles fuq id-diska", @@ -259,6 +261,7 @@ "RefusalTooMany": "wisq testijiet għalissa", "RefusalUnknownTicket": "it-test skada", "RefusalUnreachable": "is-server ma jintlaħaqx", + "RegistryCredit": "Blokki ta' indirizzi: ir-RIPE Database tar-RIPE NCC (ripe.net), użata bil-permess tiegħu, dejta ta' {0}. Tista' tkun eqdem mid-database online.", "ResultsTitle": "X'sab “me-web?”", "RouterMobile": "Fuq dejta mobbli m'hemmx router tad-dar: l-ewwel jiġi n-netwerk tal-fornitur tiegħek.", "RouterNone": "Ma nstab l-ebda router tad-dar fuq din il-konnessjoni.", diff --git a/src/MeWeb.App/Strings/my.json b/src/MeWeb.App/Strings/my.json index 60b9163..87850ab 100644 --- a/src/MeWeb.App/Strings/my.json +++ b/src/MeWeb.App/Strings/my.json @@ -84,6 +84,8 @@ "FactAdapter": "ကွန်ရက် ကိရိယာ", "FactAddressesSeen": "တွေ့ခဲ့သော ပြင်ပ IPv4 လိပ်စာများ", "FactBattery": "ဘက်ထရီ", + "FactBlock": "လိပ်စာ အစု", + "FactBlockIpv6": "IPv6 အတွက် လိပ်စာ အစု", "FactChecks": "စစ်ဆေးမှုများ", "FactCores": "ပရိုဆက်ဆာ အူတိုင် (core)", "FactDisk": "သိုလှောင်ရန် နေရာလွတ်", @@ -259,6 +261,7 @@ "RefusalTooMany": "ယခုအချိန်တွင် စမ်းသပ်မှု များလွန်းသည်", "RefusalUnknownTicket": "စမ်းသပ်မှု သက်တမ်း ကုန်သွားသည်", "RefusalUnreachable": "ဆာဗာကို ဆက်သွယ်၍ မရ", + "RegistryCredit": "လိပ်စာ အစုများ: RIPE NCC ၏ RIPE Database (ripe.net)၊ ၎င်း၏ ခွင့်ပြုချက်ဖြင့် အသုံးပြုသည်၊ {0} ရက်စွဲပါ ဒေတာ။ အွန်လိုင်း ဒေတာဘေ့စ်ထက် ဟောင်းနေနိုင်သည်။", "ResultsTitle": "“me-web?” ၏ တွေ့ရှိချက်များ", "RouterMobile": "မိုဘိုင်းဒေတာတွင် အိမ်သုံး ရောက်တာ မရှိပါ။ သင့် အင်တာနက် ကုမ္ပဏီ၏ ကွန်ရက်က ပထမဆုံး ဖြစ်ပါသည်။", "RouterNone": "ဤချိတ်ဆက်မှုတွင် အိမ်သုံး ရောက်တာ မတွေ့ပါ။", diff --git a/src/MeWeb.App/Strings/nb.json b/src/MeWeb.App/Strings/nb.json index 6b1134f..7e08cce 100644 --- a/src/MeWeb.App/Strings/nb.json +++ b/src/MeWeb.App/Strings/nb.json @@ -84,6 +84,8 @@ "FactAdapter": "Nettverksadapter", "FactAddressesSeen": "Offentlige IPv4-adresser sett", "FactBattery": "Batteri", + "FactBlock": "Adresseblokk", + "FactBlockIpv6": "Adresseblokk for IPv6", "FactChecks": "Sjekker", "FactCores": "Prosessorkjerner", "FactDisk": "Ledig lagringsplass", @@ -259,6 +261,7 @@ "RefusalTooMany": "for mange tester akkurat nå", "RefusalUnknownTicket": "testen er utløpt", "RefusalUnreachable": "serveren kan ikke nås", + "RegistryCredit": "Adresseblokker: RIPE Database fra RIPE NCC (ripe.net), brukt med tillatelse, data fra {0}. Dataene kan være eldre enn databasen på nett.", "ResultsTitle": "Hva «me-web?» fant", "RouterMobile": "På mobildata finnes det ingen ruter hjemme: leverandørens nettverk kommer først.", "RouterNone": "Fant ingen ruter hjemme på denne forbindelsen.", diff --git a/src/MeWeb.App/Strings/nd.json b/src/MeWeb.App/Strings/nd.json index 9267ee2..e871fc7 100644 --- a/src/MeWeb.App/Strings/nd.json +++ b/src/MeWeb.App/Strings/nd.json @@ -84,6 +84,8 @@ "FactAdapter": "Ikhadi lenethiwekhi", "FactAddressesSeen": "Amakheli e-IPv4 omphakathi abonakeleyo", "FactBattery": "Ibhetri", + "FactBlock": "Iqoqo lamakheli", + "FactBlockIpv6": "Iqoqo lamakheli le-IPv6", "FactChecks": "Ukuhlola", "FactCores": "Ama-core e-processor", "FactDisk": "Indawo eseleyo kudiski", @@ -259,6 +261,7 @@ "RefusalTooMany": "izivivinyo zinengi kakhulu okwamanje", "RefusalUnknownTicket": "isikhathi sesivivinyo siphelile", "RefusalUnreachable": "iseva kayifinyeleleki", + "RegistryCredit": "Amaqoqo amakheli: i-RIPE Database ye-RIPE NCC (ripe.net), esetshenziswa ngemvume yayo, ulwazi lwango-{0}. Ulwazi lungaba ludala kune-database eku-intanethi.", "ResultsTitle": "Lokho okutholwe yi-“me-web?”", "RouterMobile": "Kudatha yefoni kakulayo i-router yasekhaya: inethiwekhi yenkampani yakho yiyo eza kuqala.", "RouterNone": "Kakutholakalanga i-router yasekhaya kulokhu kuxhumana.", diff --git a/src/MeWeb.App/Strings/ne.json b/src/MeWeb.App/Strings/ne.json index 362997a..9a73878 100644 --- a/src/MeWeb.App/Strings/ne.json +++ b/src/MeWeb.App/Strings/ne.json @@ -84,6 +84,8 @@ "FactAdapter": "नेटवर्क एडाप्टर", "FactAddressesSeen": "देखिएका सार्वजनिक IPv4 ठेगाना", "FactBattery": "ब्याट्री", + "FactBlock": "ठेगाना खण्ड", + "FactBlockIpv6": "IPv6 को ठेगाना खण्ड", "FactChecks": "जाँच", "FactCores": "प्रोसेसर कोर", "FactDisk": "डिस्कमा खाली ठाउँ", @@ -259,6 +261,7 @@ "RefusalTooMany": "अहिलेलाई धेरै टेस्ट भए", "RefusalUnknownTicket": "टेस्टको समय सकियो", "RefusalUnreachable": "सर्भरसम्म पुग्न सकिएन", + "RegistryCredit": "ठेगाना खण्डहरू: RIPE NCC को RIPE Database (ripe.net), यसको अनुमतिमा प्रयोग गरिएको, {0} को डेटा। यो डेटा अनलाइन डेटाबेसभन्दा पुरानो हुन सक्छ।", "ResultsTitle": "“me-web?” ले के भेट्टायो", "RouterMobile": "मोबाइल डेटामा घरको राउटर हुँदैन: सबैभन्दा पहिले तपाईंको मोबाइल कम्पनीको नेटवर्क आउँछ।", "RouterNone": "यो कनेक्सनमा घरको कुनै राउटर भेटिएन।", diff --git a/src/MeWeb.App/Strings/nl.json b/src/MeWeb.App/Strings/nl.json index e4e2221..fd9f330 100644 --- a/src/MeWeb.App/Strings/nl.json +++ b/src/MeWeb.App/Strings/nl.json @@ -84,6 +84,8 @@ "FactAdapter": "Netwerkadapter", "FactAddressesSeen": "Geziene openbare IPv4-adressen", "FactBattery": "Batterij", + "FactBlock": "Adresblok", + "FactBlockIpv6": "Adresblok voor IPv6", "FactChecks": "Controles", "FactCores": "Processorkernen", "FactDisk": "Vrije opslag", @@ -259,6 +261,7 @@ "RefusalTooMany": "voorlopig te veel tests", "RefusalUnknownTicket": "de test is verlopen", "RefusalUnreachable": "server niet bereikbaar", + "RegistryCredit": "Adresblokken: de RIPE Database van het RIPE NCC (ripe.net), gebruikt met toestemming, gegevens van {0}. De gegevens kunnen achterlopen op de online database.", "ResultsTitle": "Wat ‘me-web?’ heeft gevonden", "RouterMobile": "Via mobiele data is er geen router thuis: het netwerk van uw provider komt meteen eerst.", "RouterNone": "Op deze verbinding is geen router thuis gevonden.", diff --git a/src/MeWeb.App/Strings/nn.json b/src/MeWeb.App/Strings/nn.json index bc3901f..303f9e9 100644 --- a/src/MeWeb.App/Strings/nn.json +++ b/src/MeWeb.App/Strings/nn.json @@ -84,6 +84,8 @@ "FactAdapter": "Nettverksadapter", "FactAddressesSeen": "Offentlege IPv4-adresser sett", "FactBattery": "Batteri", + "FactBlock": "Adresseblokk", + "FactBlockIpv6": "Adresseblokk for IPv6", "FactChecks": "Sjekkar", "FactCores": "Prosessorkjernar", "FactDisk": "Ledig lagringsplass", @@ -259,6 +261,7 @@ "RefusalTooMany": "for mange testar akkurat no", "RefusalUnknownTicket": "testen har gått ut", "RefusalUnreachable": "serveren kan ikkje nåast", + "RegistryCredit": "Adresseblokker: RIPE Database frå RIPE NCC (ripe.net), brukt med løyve, data frå {0}. Dataa kan vere eldre enn databasen på nett.", "ResultsTitle": "Kva «me-web?» fann", "RouterMobile": "På mobildata finst det ingen ruter heime: nettverket til leverandøren din kjem først.", "RouterNone": "Fann ingen ruter heime på denne tilkoplinga.", diff --git a/src/MeWeb.App/Strings/no.json b/src/MeWeb.App/Strings/no.json index 6b1134f..7e08cce 100644 --- a/src/MeWeb.App/Strings/no.json +++ b/src/MeWeb.App/Strings/no.json @@ -84,6 +84,8 @@ "FactAdapter": "Nettverksadapter", "FactAddressesSeen": "Offentlige IPv4-adresser sett", "FactBattery": "Batteri", + "FactBlock": "Adresseblokk", + "FactBlockIpv6": "Adresseblokk for IPv6", "FactChecks": "Sjekker", "FactCores": "Prosessorkjerner", "FactDisk": "Ledig lagringsplass", @@ -259,6 +261,7 @@ "RefusalTooMany": "for mange tester akkurat nå", "RefusalUnknownTicket": "testen er utløpt", "RefusalUnreachable": "serveren kan ikke nås", + "RegistryCredit": "Adresseblokker: RIPE Database fra RIPE NCC (ripe.net), brukt med tillatelse, data fra {0}. Dataene kan være eldre enn databasen på nett.", "ResultsTitle": "Hva «me-web?» fant", "RouterMobile": "På mobildata finnes det ingen ruter hjemme: leverandørens nettverk kommer først.", "RouterNone": "Fant ingen ruter hjemme på denne forbindelsen.", diff --git a/src/MeWeb.App/Strings/ny.json b/src/MeWeb.App/Strings/ny.json index ef757a6..3cd3d6a 100644 --- a/src/MeWeb.App/Strings/ny.json +++ b/src/MeWeb.App/Strings/ny.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaputala ya netiweki", "FactAddressesSeen": "Ma adiresi apagulu a IPv4 owoneka", "FactBattery": "Batire", + "FactBlock": "Gulu la ma adiresi", + "FactBlockIpv6": "Gulu la ma adiresi la IPv6", "FactChecks": "Kufufuza", "FactCores": "Ma core a purosesa (cores)", "FactDisk": "Malo otsala pa disiki", @@ -259,6 +261,7 @@ "RefusalTooMany": "mayeso ambiri kwambiri pakali pano", "RefusalUnknownTicket": "nthawi ya kuyesa yatha", "RefusalUnreachable": "seva sikufikika", + "RegistryCredit": "Magulu a ma adiresi: RIPE Database ya RIPE NCC (ripe.net), yogwiritsidwa ntchito ndi chilolezo chake, data ya {0}. Data ikhoza kukhala yakale kuposa database ya pa intaneti.", "ResultsTitle": "Zomwe “me-web?” yapeza", "RouterMobile": "Pa data ya foni palibe rauta ya kunyumba: netiweki ya wopereka intaneti wanu ndiyo imabwera koyamba.", "RouterNone": "Palibe rauta ya kunyumba yomwe yapezeka pa kulumikizana uku.", diff --git a/src/MeWeb.App/Strings/pl.json b/src/MeWeb.App/Strings/pl.json index e4ae90d..60569a8 100644 --- a/src/MeWeb.App/Strings/pl.json +++ b/src/MeWeb.App/Strings/pl.json @@ -84,6 +84,8 @@ "FactAdapter": "Karta sieciowa", "FactAddressesSeen": "Zauważone publiczne adresy IPv4", "FactBattery": "Bateria", + "FactBlock": "Blok adresów", + "FactBlockIpv6": "Blok adresów dla IPv6", "FactChecks": "Sprawdzenia", "FactCores": "Rdzenie procesora", "FactDisk": "Wolne miejsce na dysku", @@ -259,6 +261,7 @@ "RefusalTooMany": "na razie zbyt wiele testów", "RefusalUnknownTicket": "test wygasł", "RefusalUnreachable": "serwer nieosiągalny", + "RegistryCredit": "Bloki adresów: RIPE Database organizacji RIPE NCC (ripe.net), używana za jej zgodą, dane z {0}. Mogą być starsze niż baza dostępna online.", "ResultsTitle": "Co znalazła aplikacja „me-web?”", "RouterMobile": "Na danych mobilnych nie ma routera domowego: od razu zaczyna się sieć dostawcy.", "RouterNone": "W tym połączeniu nie znaleziono routera domowego.", diff --git a/src/MeWeb.App/Strings/ps.json b/src/MeWeb.App/Strings/ps.json index 4804a9f..f9c5029 100644 --- a/src/MeWeb.App/Strings/ps.json +++ b/src/MeWeb.App/Strings/ps.json @@ -84,6 +84,8 @@ "FactAdapter": "د شبکې اډاپټر", "FactAddressesSeen": "لیدل شوې عامې IPv4 پتې", "FactBattery": "بیټري", + "FactBlock": "د پتو ډله", + "FactBlockIpv6": "د IPv6 د پتو ډله", "FactChecks": "کتنې", "FactCores": "د پروسېسر کورونه", "FactDisk": "په ډیسک کې خالي ځای", @@ -259,6 +261,7 @@ "RefusalTooMany": "اوس ډېرې ازموینې شوې دي", "RefusalUnknownTicket": "د ازموینې وخت تېر شو", "RefusalUnreachable": "سرور ته رسېدل نه کېږي", + "RegistryCredit": "د پتو ډلې: د RIPE NCC د RIPE Database (ripe.net)، د هغه په اجازه کارول کېږي، د {0} معلومات. کېدای شي دا معلومات له آنلاین ډیټابېس څخه زاړه وي.", "ResultsTitle": "“me-web?” څه وموندل", "RouterMobile": "په موبایل ډېټا کې د کور روټر نشته: لومړی ستاسو د انټرنېټ شرکت شبکه راځي.", "RouterNone": "په دې اړیکه کې د کور روټر ونه موندل شو.", diff --git a/src/MeWeb.App/Strings/pt.json b/src/MeWeb.App/Strings/pt.json index 346f0b9..fbd8cbe 100644 --- a/src/MeWeb.App/Strings/pt.json +++ b/src/MeWeb.App/Strings/pt.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptador de rede", "FactAddressesSeen": "Endereços IPv4 públicos vistos", "FactBattery": "Bateria", + "FactBlock": "Bloco de endereços", + "FactBlockIpv6": "Bloco de endereços para IPv6", "FactChecks": "Verificações", "FactCores": "Núcleos do processador", "FactDisk": "Espaço livre no disco", @@ -259,6 +261,7 @@ "RefusalTooMany": "testes demais por enquanto", "RefusalUnknownTicket": "o teste expirou", "RefusalUnreachable": "servidor inacessível", + "RegistryCredit": "Blocos de endereços: o RIPE Database do RIPE NCC (ripe.net), usado com sua permissão, dados de {0}. Podem estar defasados em relação ao banco de dados online.", "ResultsTitle": "O que o “me-web?” encontrou", "RouterMobile": "Nos dados móveis não há roteador de casa: a rede da operadora vem primeiro.", "RouterNone": "Nenhum roteador de casa foi encontrado nesta conexão.", diff --git a/src/MeWeb.App/Strings/qu.json b/src/MeWeb.App/Strings/qu.json index 09bd2b8..74a2592 100644 --- a/src/MeWeb.App/Strings/qu.json +++ b/src/MeWeb.App/Strings/qu.json @@ -84,6 +84,8 @@ "FactAdapter": "Red adaptador (tinkiq tarjeta)", "FactAddressesSeen": "Rikusqa público IPv4 direccionkuna", "FactBattery": "Batería", + "FactBlock": "Direccion t'aqa", + "FactBlockIpv6": "IPv6 nisqapaq direccion t'aqa", "FactChecks": "Qhawaykuna", "FactCores": "Procesadorpa núcleonkuna (núcleos)", "FactDisk": "Ch'usaq kiti (disco)", @@ -259,6 +261,7 @@ "RefusalTooMany": "kunanqa achka pruebakuna", "RefusalUnknownTicket": "pruebaqa tukukapunñam", "RefusalUnreachable": "servidorman mana chayay atikun", + "RegistryCredit": "Direccion t'aqakuna: RIPE NCC nisqapa RIPE Database (ripe.net), paypa permisonwan llamk'achisqa, {0} p'unchawpa datonkuna. Kay datokunaqa internetpi kaq database nisqamanta aswan mawk'a kanman.", "ResultsTitle": "“me-web?” imakunatam tarirqan", "RouterMobile": "Celular datokunawanqa manam wasi router kanchu: celular empresaykipa redninmi ñawpaqta hamun.", "RouterNone": "Kay conexionpiqa manam wasi router tarikurqanchu.", diff --git a/src/MeWeb.App/Strings/rn.json b/src/MeWeb.App/Strings/rn.json index 9886aa8..f96db4a 100644 --- a/src/MeWeb.App/Strings/rn.json +++ b/src/MeWeb.App/Strings/rn.json @@ -84,6 +84,8 @@ "FactAdapter": "Ikarata ya rezo", "FactAddressesSeen": "Aderese rusangi za IPv4 zabonetse", "FactBattery": "Bateri", + "FactBlock": "Umugwi w'aderese", + "FactBlockIpv6": "Umugwi w'aderese wa IPv6", "FactChecks": "Amasuzuma", "FactCores": "Ibice vya porosesa (cores)", "FactDisk": "Umwanya usigaye kuri disiki", @@ -259,6 +261,7 @@ "RefusalTooMany": "amagerageza menshi cane kuri ubu", "RefusalUnknownTicket": "igihe c'igerageza carangiye", "RefusalUnreachable": "seriveri ntishikwako", + "RegistryCredit": "Imigwi y'aderese: RIPE Database ya RIPE NCC (ripe.net), ikoreshwa ku ruhusha rwayo, amakuru yo ku wa {0}. Ayo makuru ashobora kuba ashaje kuruta database yo kuri interineti.", "ResultsTitle": "Ivyo ”me-web?” yabonye", "RouterMobile": "Kuri interineti ya telefone nta router yo mu rugo iriho: rezo y'uwuguha interineti ni yo iza imbere.", "RouterNone": "Nta router yo mu rugo yabonetse kuri uyu murongo.", diff --git a/src/MeWeb.App/Strings/ro.json b/src/MeWeb.App/Strings/ro.json index 4d22762..51db0f0 100644 --- a/src/MeWeb.App/Strings/ro.json +++ b/src/MeWeb.App/Strings/ro.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptor de rețea", "FactAddressesSeen": "Adrese IPv4 publice văzute", "FactBattery": "Baterie", + "FactBlock": "Bloc de adrese", + "FactBlockIpv6": "Bloc de adrese pentru IPv6", "FactChecks": "Verificări", "FactCores": "Nuclee ale procesorului", "FactDisk": "Spațiu liber pe disc", @@ -259,6 +261,7 @@ "RefusalTooMany": "prea multe teste deocamdată", "RefusalUnknownTicket": "testul a expirat", "RefusalUnreachable": "serverul nu poate fi contactat", + "RegistryCredit": "Blocuri de adrese: RIPE Database de la RIPE NCC (ripe.net), folosită cu permisiunea acestuia, date din {0}. Pot fi mai vechi decât baza de date online.", "ResultsTitle": "Ce a găsit „me-web?”", "RouterMobile": "Pe date mobile nu există router de acasă: primul pas este rețeaua furnizorului.", "RouterNone": "Nu s-a găsit niciun router de acasă pe această conexiune.", diff --git a/src/MeWeb.App/Strings/ru.json b/src/MeWeb.App/Strings/ru.json index bc990ef..b39dfcb 100644 --- a/src/MeWeb.App/Strings/ru.json +++ b/src/MeWeb.App/Strings/ru.json @@ -84,6 +84,8 @@ "FactAdapter": "Сетевой адаптер", "FactAddressesSeen": "Замеченные публичные адреса IPv4", "FactBattery": "Батарея", + "FactBlock": "Блок адресов", + "FactBlockIpv6": "Блок адресов для IPv6", "FactChecks": "Проверок", "FactCores": "Ядра процессора", "FactDisk": "Свободно на диске", @@ -259,6 +261,7 @@ "RefusalTooMany": "пока слишком много тестов", "RefusalUnknownTicket": "время теста истекло", "RefusalUnreachable": "сервер недоступен", + "RegistryCredit": "Блоки адресов: RIPE Database организации RIPE NCC (ripe.net), используется с её разрешения, данные на {0}. Они могут отставать от базы в интернете.", "ResultsTitle": "Результаты «me-web?»", "RouterMobile": "В мобильном интернете домашнего роутера нет: первой идёт сеть провайдера.", "RouterNone": "На этом подключении домашний роутер не найден.", diff --git a/src/MeWeb.App/Strings/rw.json b/src/MeWeb.App/Strings/rw.json index 36c0578..5c28b07 100644 --- a/src/MeWeb.App/Strings/rw.json +++ b/src/MeWeb.App/Strings/rw.json @@ -84,6 +84,8 @@ "FactAdapter": "Ikarita y'urusobe", "FactAddressesSeen": "Aderesi rusange za IPv4 zabonetse", "FactBattery": "Bateri", + "FactBlock": "Igice cy'aderesi", + "FactBlockIpv6": "Igice cy'aderesi cya IPv6", "FactChecks": "Igenzura", "FactCores": "Ibice bya porosesa (cores)", "FactDisk": "Umwanya usigaye kuri disiki", @@ -259,6 +261,7 @@ "RefusalTooMany": "amagerageza menshi cyane kuri ubu", "RefusalUnknownTicket": "igihe cy'igerageza cyarangiye", "RefusalUnreachable": "seriveri ntigerwaho", + "RegistryCredit": "Ibice by'aderesi: RIPE Database ya RIPE NCC (ripe.net), ikoreshwa ku ruhushya rwayo, amakuru yo ku wa {0}. Ayo makuru ashobora kuba ashaje kurusha database yo kuri interineti.", "ResultsTitle": "Ibyo «me-web?» yabonye", "RouterMobile": "Kuri interineti ya telefoni nta router yo mu rugo ihari: urusobe rw'ikigo gitanga interineti ni rwo ruza mbere.", "RouterNone": "Nta router yo mu rugo yabonetse kuri iri huza.", diff --git a/src/MeWeb.App/Strings/sg.json b/src/MeWeb.App/Strings/sg.json index 2b4ed0b..8bb7531 100644 --- a/src/MeWeb.App/Strings/sg.json +++ b/src/MeWeb.App/Strings/sg.json @@ -84,6 +84,8 @@ "FactAdapter": "Carte ti réseau", "FactAddressesSeen": "Adrêse IPv4 ti azo kûê so a bâ", "FactBattery": "Batterie", + "FactBlock": "Bloc ti adrêse", + "FactBlockIpv6": "Bloc ti adrêse ti IPv6", "FactChecks": "Atârango", "FactCores": "Cœur ti processeur", "FactDisk": "Ndo so angbâ", @@ -259,6 +261,7 @@ "RefusalTooMany": "aessai ahon ndö ni fadë so", "RefusalUnknownTicket": "ngoi ti essai ahûnzi", "RefusalUnreachable": "a lîngbi ti sï na serveur pëpe", + "RegistryCredit": "Abloc ti adrêse: RIPE Database ti RIPE NCC (ripe.net), a sâra kua na ni na lêgë so lo mû, adonnée ti {0}. Adonnée ni alingbi ti duti ngbêne ahon base de données so ayeke na internet.", "ResultsTitle": "Ye so «me-web?» awara", "RouterMobile": "Na données ti téléphone, routeur ti da ayeke dä pëpe: réseau ti fournisseur ti mo la aga kôzo.", "RouterNone": "A wara routeur ti da na connexion so pëpe.", diff --git a/src/MeWeb.App/Strings/si.json b/src/MeWeb.App/Strings/si.json index 81983ed..24c02ab 100644 --- a/src/MeWeb.App/Strings/si.json +++ b/src/MeWeb.App/Strings/si.json @@ -84,6 +84,8 @@ "FactAdapter": "ජාල ඇඩැප්ටරය", "FactAddressesSeen": "දුටු පොදු IPv4 ලිපින", "FactBattery": "බැටරිය", + "FactBlock": "ලිපින කාණ්ඩය", + "FactBlockIpv6": "IPv6 සඳහා ලිපින කාණ්ඩය", "FactChecks": "පරීක්ෂා", "FactCores": "ප්‍රොසෙසර කෝර්", "FactDisk": "නිදහස් ඉඩ", @@ -259,6 +261,7 @@ "RefusalTooMany": "දැනට පරීක්ෂණ වැඩියි", "RefusalUnknownTicket": "පරීක්ෂණයේ කාලය ඉකුත් විය", "RefusalUnreachable": "සර්වරයට ළඟා විය නොහැක", + "RegistryCredit": "ලිපින කාණ්ඩ: RIPE NCC හි RIPE Database (ripe.net), එහි අවසරය ඇතිව භාවිත කෙරේ, {0} දින දත්ත. මෙම දත්ත මාර්ගගත දත්ත ගබඩාවට වඩා පැරණි විය හැක.", "ResultsTitle": "“me-web?” සොයා ගත් දේ", "RouterMobile": "ජංගම දත්තවලදී නිවසේ රවුටරයක් නැත: මුලින්ම ඇත්තේ ඔබගේ සේවා සපයන්නාගේ ජාලයයි.", "RouterNone": "මෙම සම්බන්ධතාවයේ නිවසේ රවුටරයක් හමු නොවීය.", diff --git a/src/MeWeb.App/Strings/sk.json b/src/MeWeb.App/Strings/sk.json index 694c481..d2683bc 100644 --- a/src/MeWeb.App/Strings/sk.json +++ b/src/MeWeb.App/Strings/sk.json @@ -84,6 +84,8 @@ "FactAdapter": "Sieťový adaptér", "FactAddressesSeen": "Zistené verejné adresy IPv4", "FactBattery": "Batéria", + "FactBlock": "Blok adries", + "FactBlockIpv6": "Blok adries pre IPv6", "FactChecks": "Kontroly", "FactCores": "Jadrá procesora", "FactDisk": "Voľné miesto na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "momentálne príliš veľa testov", "RefusalUnknownTicket": "platnosť testu vypršala", "RefusalUnreachable": "server je nedostupný", + "RegistryCredit": "Bloky adries: RIPE Database organizácie RIPE NCC (ripe.net), používaná s jej povolením, údaje k {0}. Môžu byť staršie ako databáza online.", "ResultsTitle": "Čo zistila aplikácia „me-web?“", "RouterMobile": "Pri mobilných dátach žiadny domáci router nie je: hneď na začiatku je sieť poskytovateľa.", "RouterNone": "Pri tomto pripojení sa nenašiel žiadny domáci router.", diff --git a/src/MeWeb.App/Strings/sl.json b/src/MeWeb.App/Strings/sl.json index bcc10e6..f36b3b5 100644 --- a/src/MeWeb.App/Strings/sl.json +++ b/src/MeWeb.App/Strings/sl.json @@ -84,6 +84,8 @@ "FactAdapter": "Omrežni vmesnik", "FactAddressesSeen": "Opaženi javni naslovi IPv4", "FactBattery": "Baterija", + "FactBlock": "Blok naslovov", + "FactBlockIpv6": "Blok naslovov za IPv6", "FactChecks": "Preverjanja", "FactCores": "Jedra procesorja", "FactDisk": "Prost prostor na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "trenutno preveč preizkusov", "RefusalUnknownTicket": "preizkus je potekel", "RefusalUnreachable": "strežnik ni dosegljiv", + "RegistryCredit": "Bloki naslovov: RIPE Database organizacije RIPE NCC (ripe.net), uporabljena z njenim dovoljenjem, podatki z dne {0}. Podatki so lahko starejši od tistih v spletni bazi.", "ResultsTitle": "Kaj je ugotovila aplikacija „me-web?“", "RouterMobile": "Pri mobilnih podatkih ni domačega usmerjevalnika: takoj na začetku je omrežje ponudnika.", "RouterNone": "Na tej povezavi ni bilo mogoče najti domačega usmerjevalnika.", diff --git a/src/MeWeb.App/Strings/sm.json b/src/MeWeb.App/Strings/sm.json index f1e8c03..3153522 100644 --- a/src/MeWeb.App/Strings/sm.json +++ b/src/MeWeb.App/Strings/sm.json @@ -84,6 +84,8 @@ "FactAdapter": "Adapter o le network", "FactAddressesSeen": "Tuatusi IPv4 lautele na vaʻaia", "FactBattery": "Pateri", + "FactBlock": "Poloka o tuatusi", + "FactBlockIpv6": "Poloka o tuatusi mo le IPv6", "FactChecks": "Siaki", "FactCores": "Cores o le processor", "FactDisk": "Avanoa i le disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "ua tele naua suʻega mo le taimi nei", "RefusalUnknownTicket": "ua uma le taimi o le suʻega", "RefusalUnreachable": "e lē oʻo atu i le server", + "RegistryCredit": "Poloka o tuatusi: le RIPE Database a le RIPE NCC (ripe.net), ua faʻaaogā ma lona faʻatagaga, faʻamaumauga o le {0}. Atonu e tuai atu nai lo le database i luga o le initaneti.", "ResultsTitle": "Mea na maua e “me-web?”", "RouterMobile": "I le data telefoni e leai se router o le fale: ʻo le laasaga muamua o le network a lau kamupani initaneti.", "RouterNone": "E leʻi maua se router o le fale i lenei fesoʻotaʻiga.", diff --git a/src/MeWeb.App/Strings/sn.json b/src/MeWeb.App/Strings/sn.json index 1b7f119..12954ed 100644 --- a/src/MeWeb.App/Strings/sn.json +++ b/src/MeWeb.App/Strings/sn.json @@ -84,6 +84,8 @@ "FactAdapter": "Adapter yenetiweki", "FactAddressesSeen": "Kero dzeIPv4 dzeruzhinji dzakaonekwa", "FactBattery": "Bhatiri", + "FactBlock": "Boka rekero", + "FactBlockIpv6": "Boka rekero reIPv6", "FactChecks": "Ongororo", "FactCores": "Macore eprocessor (cores)", "FactDisk": "Nzvimbo yakasara padhisiki", @@ -259,6 +261,7 @@ "RefusalTooMany": "miedzo yakawandisa parizvino", "RefusalUnknownTicket": "muedzo wapera nguva", "RefusalUnreachable": "seva haisvikike", + "RegistryCredit": "Mapoka ekero: RIPE Database yeRIPE NCC (ripe.net), inoshandiswa nemvumo yayo, data ya{0}. Data iyi inogona kuva yekare kupfuura database iri paindaneti.", "ResultsTitle": "Zvakawanikwa ne”me-web?”", "RouterMobile": "Padata yenhare hapana router yepamba: netiweki yemupi wenyu wendaneti ndiyo inouya pakutanga.", "RouterNone": "Hapana router yepamba yakawanikwa pakubatana uku.", diff --git a/src/MeWeb.App/Strings/so.json b/src/MeWeb.App/Strings/so.json index 42bd011..206ebb8 100644 --- a/src/MeWeb.App/Strings/so.json +++ b/src/MeWeb.App/Strings/so.json @@ -84,6 +84,8 @@ "FactAdapter": "Kaarka shabakadda", "FactAddressesSeen": "Cinwaannada guud ee IPv4 ee la arkay", "FactBattery": "Baytariga", + "FactBlock": "Qaybta cinwaannada", + "FactBlockIpv6": "Qaybta cinwaannada IPv6", "FactChecks": "Hubinnada", "FactCores": "Xudumada processor-ka (cores)", "FactDisk": "Meesha bannaan ee diskiga", @@ -259,6 +261,7 @@ "RefusalTooMany": "tijaabooyin aad u badan hadda", "RefusalUnknownTicket": "waqtiga tijaabada wuu dhammaaday", "RefusalUnreachable": "server-ka lama gaari karo", + "RegistryCredit": "Qaybaha cinwaannada: RIPE Database ee RIPE NCC (ripe.net), oo la isticmaalo iyadoo la haysto oggolaanshaha RIPE NCC, xogta {0}. Xogtu waxay ka dambayn kartaa database-ka internetka ku jira.", "ResultsTitle": "Waxa “me-web?” heshay", "RouterMobile": "Xogta mobilka ma laha router guri: shabakadda shirkaddaada ayaa ugu horreysa.", "RouterNone": "Router guri lagama helin xiriirkan.", diff --git a/src/MeWeb.App/Strings/sq.json b/src/MeWeb.App/Strings/sq.json index a56a7ef..1405758 100644 --- a/src/MeWeb.App/Strings/sq.json +++ b/src/MeWeb.App/Strings/sq.json @@ -84,6 +84,8 @@ "FactAdapter": "Përshtatësi i rrjetit", "FactAddressesSeen": "Adresa publike IPv4 të para", "FactBattery": "Bateria", + "FactBlock": "Blloku i adresave", + "FactBlockIpv6": "Blloku i adresave për IPv6", "FactChecks": "Kontrolle", "FactCores": "Bërthamat e procesorit", "FactDisk": "Hapësirë e lirë në disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "shumë teste për momentin", "RefusalUnknownTicket": "testi ka skaduar", "RefusalUnreachable": "serveri nuk arrihet", + "RegistryCredit": "Blloqet e adresave: RIPE Database nga RIPE NCC (ripe.net), përdorur me leje, të dhëna të {0}. Mund të jenë më të vjetra se baza e të dhënave në internet.", "ResultsTitle": "Çfarë gjeti «me-web?»", "RouterMobile": "Me të dhëna celulare nuk ka ruter shtëpie: e para vjen rrjeti i ofruesit tuaj.", "RouterNone": "Në këtë lidhje nuk u gjet asnjë ruter shtëpie.", diff --git a/src/MeWeb.App/Strings/sr-Latn.json b/src/MeWeb.App/Strings/sr-Latn.json index 2faffab..86a618f 100644 --- a/src/MeWeb.App/Strings/sr-Latn.json +++ b/src/MeWeb.App/Strings/sr-Latn.json @@ -84,6 +84,8 @@ "FactAdapter": "Mrežni adapter", "FactAddressesSeen": "Viđene javne IPv4 adrese", "FactBattery": "Baterija", + "FactBlock": "Blok adresa", + "FactBlockIpv6": "Blok adresa za IPv6", "FactChecks": "Provere", "FactCores": "Jezgra procesora", "FactDisk": "Slobodan prostor na disku", @@ -259,6 +261,7 @@ "RefusalTooMany": "previše testova za sada", "RefusalUnknownTicket": "test je istekao", "RefusalUnreachable": "server nije dostupan", + "RegistryCredit": "Blokovi adresa: RIPE Database organizacije RIPE NCC (ripe.net), koristi se uz njenu dozvolu, podaci od {0}. Podaci mogu biti stariji od baze na internetu.", "ResultsTitle": "Rezultati aplikacije „me-web?”", "RouterMobile": "Na mobilnim podacima nema kućnog rutera: prva dolazi mreža provajdera.", "RouterNone": "Na ovoj vezi nije pronađen kućni ruter.", diff --git a/src/MeWeb.App/Strings/sr.json b/src/MeWeb.App/Strings/sr.json index 4c72c05..282c27b 100644 --- a/src/MeWeb.App/Strings/sr.json +++ b/src/MeWeb.App/Strings/sr.json @@ -84,6 +84,8 @@ "FactAdapter": "Мрежни адаптер", "FactAddressesSeen": "Виђене јавне IPv4 адресе", "FactBattery": "Батерија", + "FactBlock": "Блок адреса", + "FactBlockIpv6": "Блок адреса за IPv6", "FactChecks": "Провере", "FactCores": "Језгра процесора", "FactDisk": "Слободан простор на диску", @@ -259,6 +261,7 @@ "RefusalTooMany": "превише тестова за сада", "RefusalUnknownTicket": "тест је истекао", "RefusalUnreachable": "сервер није доступан", + "RegistryCredit": "Блокови адреса: RIPE Database организације RIPE NCC (ripe.net), користи се уз њену дозволу, подаци од {0}. Подаци могу бити старији од базе на интернету.", "ResultsTitle": "Резултати апликације „me-web?”", "RouterMobile": "На мобилним подацима нема кућног рутера: прва долази мрежа провајдера.", "RouterNone": "На овој вези није пронађен кућни рутер.", diff --git a/src/MeWeb.App/Strings/ss.json b/src/MeWeb.App/Strings/ss.json index 6987eda..28c69e1 100644 --- a/src/MeWeb.App/Strings/ss.json +++ b/src/MeWeb.App/Strings/ss.json @@ -84,6 +84,8 @@ "FactAdapter": "Likhadi lenethiwekhi", "FactAddressesSeen": "Emakheli e-IPv4 asesidlangalaleni labonakele", "FactBattery": "Libhethri", + "FactBlock": "Licembu lemakheli", + "FactBlockIpv6": "Licembu lemakheli le-IPv6", "FactChecks": "Kuhlola", "FactCores": "Ema-core e-processor", "FactDisk": "Indzawo lesele kudiski", @@ -259,6 +261,7 @@ "RefusalTooMany": "tivivinyo tinyenti kakhulu kwanyalo", "RefusalUnknownTicket": "sikhatsi sesivivinyo siphelile", "RefusalUnreachable": "iseva ayifinyeleleki", + "RegistryCredit": "Emacembu emakheli: i-RIPE Database ye-RIPE NCC (ripe.net), isetjentiswa ngemvume yayo, lwati lwanga-{0}. Lungase lube ludzala kune-database lese-inthanethi.", "ResultsTitle": "Loko lokutfolwe yi-“me-web?”", "RouterMobile": "Kudatha yelucingo ayikho i-router yasekhaya: inethiwekhi yenkampani yakho yiyo lefika kucala.", "RouterNone": "Akutfolakalanga i-router yasekhaya kulokuxhumana.", diff --git a/src/MeWeb.App/Strings/st.json b/src/MeWeb.App/Strings/st.json index ff38638..c0fdcdc 100644 --- a/src/MeWeb.App/Strings/st.json +++ b/src/MeWeb.App/Strings/st.json @@ -84,6 +84,8 @@ "FactAdapter": "Karete ya netweke", "FactAddressesSeen": "Diaterese tsa IPv4 tsa setjhaba tse bonweng", "FactBattery": "Betri", + "FactBlock": "Sehlopha sa diaterese", + "FactBlockIpv6": "Sehlopha sa diaterese sa IPv6", "FactChecks": "Ditlhahlobo", "FactCores": "Di-core tsa processor", "FactDisk": "Sebaka se setseng", @@ -259,6 +261,7 @@ "RefusalTooMany": "diteko tse ngata haholo hajwale", "RefusalUnknownTicket": "nako ya teko e fedile", "RefusalUnreachable": "seva ha e fihlellehe", + "RegistryCredit": "Dihlopha tsa diaterese: RIPE Database ya RIPE NCC (ripe.net), e sebediswa ka tumello ya yona, dintlha tsa {0}. Dintlha di ka nna tsa sala morao ho database e leng inthaneteng.", "ResultsTitle": "Seo “me-web?” e se fumaneng", "RouterMobile": "Ka data ya selefouno ha ho router ya lapeng: netweke ya mofani wa hao ke yona e tlang pele.", "RouterNone": "Ha ho router ya lapeng e fumanweng kgokahanong ena.", diff --git a/src/MeWeb.App/Strings/sv.json b/src/MeWeb.App/Strings/sv.json index bda9ade..44dc634 100644 --- a/src/MeWeb.App/Strings/sv.json +++ b/src/MeWeb.App/Strings/sv.json @@ -84,6 +84,8 @@ "FactAdapter": "Nätverksadapter", "FactAddressesSeen": "Offentliga IPv4-adresser som setts", "FactBattery": "Batteri", + "FactBlock": "Adressblock", + "FactBlockIpv6": "Adressblock för IPv6", "FactChecks": "Kontroller", "FactCores": "Processorkärnor", "FactDisk": "Ledigt diskutrymme", @@ -259,6 +261,7 @@ "RefusalTooMany": "för många tester just nu", "RefusalUnknownTicket": "testet har gått ut", "RefusalUnreachable": "servern går inte att nå", + "RegistryCredit": "Adressblock: RIPE NCC:s RIPE Database (ripe.net), används med deras tillstånd, data från {0}. Uppgifterna kan ligga efter databasen online.", "ResultsTitle": "Vad ”me-web?” hittade", "RouterMobile": "På mobildata finns ingen router hemma: din operatörs nätverk kommer först.", "RouterNone": "Ingen router hemma hittades på den här anslutningen.", diff --git a/src/MeWeb.App/Strings/sw.json b/src/MeWeb.App/Strings/sw.json index 2f55fdc..ce81a67 100644 --- a/src/MeWeb.App/Strings/sw.json +++ b/src/MeWeb.App/Strings/sw.json @@ -84,6 +84,8 @@ "FactAdapter": "Adapta ya mtandao", "FactAddressesSeen": "Anwani za umma za IPv4 zilizoonekana", "FactBattery": "Betri", + "FactBlock": "Kundi la anwani", + "FactBlockIpv6": "Kundi la anwani la IPv6", "FactChecks": "Ukaguzi", "FactCores": "Viini vya prosesa (cores)", "FactDisk": "Nafasi ya diski iliyo wazi", @@ -259,6 +261,7 @@ "RefusalTooMany": "majaribio mengi mno kwa sasa", "RefusalUnknownTicket": "muda wa jaribio umekwisha", "RefusalUnreachable": "seva haifikiki", + "RegistryCredit": "Makundi ya anwani: RIPE Database ya RIPE NCC (ripe.net), inatumika kwa ruhusa yake, data ya {0}. Huenda data hii ikawa nyuma ya hifadhidata ya mtandaoni.", "ResultsTitle": "Kile ambacho “me-web?” imegundua", "RouterMobile": "Kwenye data ya simu hakuna ruta ya nyumbani: mtandao wa mtoa huduma wako ndio wa kwanza.", "RouterNone": "Hakuna ruta ya nyumbani iliyopatikana kwenye muunganisho huu.", diff --git a/src/MeWeb.App/Strings/ta.json b/src/MeWeb.App/Strings/ta.json index 4db5ed2..23de7be 100644 --- a/src/MeWeb.App/Strings/ta.json +++ b/src/MeWeb.App/Strings/ta.json @@ -84,6 +84,8 @@ "FactAdapter": "நெட்வொர்க் அடாப்டர்", "FactAddressesSeen": "பார்க்கப்பட்ட பொது IPv4 முகவரிகள்", "FactBattery": "பேட்டரி", + "FactBlock": "முகவரித் தொகுதி", + "FactBlockIpv6": "IPv6-க்கான முகவரித் தொகுதி", "FactChecks": "சரிபார்ப்புகள்", "FactCores": "செயலியின் கோர்கள்", "FactDisk": "காலி சேமிப்பு இடம்", @@ -259,6 +261,7 @@ "RefusalTooMany": "இப்போதைக்கு மிக அதிகமான சோதனைகள்", "RefusalUnknownTicket": "சோதனைக்கான நேரம் முடிந்துவிட்டது", "RefusalUnreachable": "சர்வரை அடைய முடியவில்லை", + "RegistryCredit": "முகவரித் தொகுதிகள்: RIPE NCC-யின் RIPE Database (ripe.net), அதன் அனுமதியுடன் பயன்படுத்தப்படுகிறது, {0} தேதியிட்ட தரவு. இணையத்தில் உள்ள தரவுத்தளத்தைவிட இது பழையதாக இருக்கலாம்.", "ResultsTitle": "“me-web?” கண்டறிந்தவை", "RouterMobile": "மொபைல் டேட்டாவில் வீட்டு ரூட்டர் இல்லை: முதலில் வருவது உங்கள் இணைய நிறுவனத்தின் நெட்வொர்க்.", "RouterNone": "இந்த இணைப்பில் வீட்டு ரூட்டர் எதுவும் கண்டறியப்படவில்லை.", diff --git a/src/MeWeb.App/Strings/tet.json b/src/MeWeb.App/Strings/tet.json index aa2f2b8..bf176b7 100644 --- a/src/MeWeb.App/Strings/tet.json +++ b/src/MeWeb.App/Strings/tet.json @@ -84,6 +84,8 @@ "FactAdapter": "Adaptadór rede", "FactAddressesSeen": "Enderesu IPv4 públiku ne'ebé haree ona", "FactBattery": "Bateria", + "FactBlock": "Grupu enderesu", + "FactBlockIpv6": "Grupu enderesu ba IPv6", "FactChecks": "Verifikasaun", "FactCores": "Core prosesadór nian", "FactDisk": "Fatin livre iha diskú", @@ -259,6 +261,7 @@ "RefusalTooMany": "teste barak liu agora daudaun", "RefusalUnknownTicket": "teste nia tempu hotu ona", "RefusalUnreachable": "la bele to'o servidór", + "RegistryCredit": "Grupu enderesu: RIPE Database husi RIPE NCC (ripe.net), uza ho ninia autorizasaun, dadus husi {0}. Dadus ne'e bele tuan liu database iha internet.", "ResultsTitle": "Saida mak “me-web?” hetan", "RouterMobile": "Ho dadus móvel la iha router uma nian: pasu dahuluk mak ita-nia fornesedór internet nia rede.", "RouterNone": "La hetan router uma nian iha ligasaun ne'e.", diff --git a/src/MeWeb.App/Strings/tg.json b/src/MeWeb.App/Strings/tg.json index 8a9c5e3..b3b988e 100644 --- a/src/MeWeb.App/Strings/tg.json +++ b/src/MeWeb.App/Strings/tg.json @@ -84,6 +84,8 @@ "FactAdapter": "Адаптери шабака", "FactAddressesSeen": "Суроғаҳои оммавии IPv4-и дидашуда", "FactBattery": "Батарея", + "FactBlock": "Гурӯҳи суроғаҳо", + "FactBlockIpv6": "Гурӯҳи суроғаҳо барои IPv6", "FactChecks": "Санҷишҳо", "FactCores": "Ядроҳои протсессор", "FactDisk": "Ҷои холии диск", @@ -259,6 +261,7 @@ "RefusalTooMany": "ҳоло озмоишҳо хеле зиёданд", "RefusalUnknownTicket": "мӯҳлати озмоиш гузашт", "RefusalUnreachable": "сервер дастнорас аст", + "RegistryCredit": "Гурӯҳҳои суроғаҳо: RIPE Database аз RIPE NCC (ripe.net), бо иҷозати он истифода мешавад, маълумот аз {0}. Маълумот метавонад аз пойгоҳи додаҳои онлайн ақиб монад.", "ResultsTitle": "Он чи “me-web?” ёфт", "RouterMobile": "Бо интернети мобилӣ роутери хонагӣ нест: аввал шабакаи провайдер меояд.", "RouterNone": "Дар ин пайваст роутери хонагӣ ёфт нашуд.", diff --git a/src/MeWeb.App/Strings/th.json b/src/MeWeb.App/Strings/th.json index e77dec2..8f19690 100644 --- a/src/MeWeb.App/Strings/th.json +++ b/src/MeWeb.App/Strings/th.json @@ -84,6 +84,8 @@ "FactAdapter": "อะแดปเตอร์เครือข่าย", "FactAddressesSeen": "ที่อยู่ IPv4 สาธารณะที่พบ", "FactBattery": "แบตเตอรี่", + "FactBlock": "ช่วงที่อยู่", + "FactBlockIpv6": "ช่วงที่อยู่สำหรับ IPv6", "FactChecks": "การตรวจสอบ", "FactCores": "คอร์ของซีพียู", "FactDisk": "พื้นที่ว่างในดิสก์", @@ -259,6 +261,7 @@ "RefusalTooMany": "ทดสอบบ่อยเกินไปในตอนนี้", "RefusalUnknownTicket": "การทดสอบหมดอายุแล้ว", "RefusalUnreachable": "ติดต่อเซิร์ฟเวอร์ไม่ได้", + "RegistryCredit": "ช่วงที่อยู่: RIPE Database ของ RIPE NCC (ripe.net) ใช้โดยได้รับอนุญาตจาก RIPE NCC ข้อมูลวันที่ {0} ซึ่งอาจเก่ากว่าฐานข้อมูลออนไลน์", "ResultsTitle": "สิ่งที่ “me-web?” พบ", "RouterMobile": "เมื่อใช้อินเทอร์เน็ตมือถือจะไม่มีเราเตอร์ในบ้าน เครือข่ายของผู้ให้บริการจะเป็นด่านแรก", "RouterNone": "ไม่พบเราเตอร์ในบ้านบนการเชื่อมต่อนี้", diff --git a/src/MeWeb.App/Strings/ti.json b/src/MeWeb.App/Strings/ti.json index 96d8460..e94821c 100644 --- a/src/MeWeb.App/Strings/ti.json +++ b/src/MeWeb.App/Strings/ti.json @@ -84,6 +84,8 @@ "FactAdapter": "ኣዳፕተር መርበብ", "FactAddressesSeen": "ዝተራእዩ ህዝባዊ IPv4 ኣድራሻታት", "FactBattery": "ባተሪ", + "FactBlock": "ጉጅለ ኣድራሻታት", + "FactBlockIpv6": "ጉጅለ ኣድራሻታት ንIPv6", "FactChecks": "ፍተሻታት", "FactCores": "ኮራት ፕሮሰሰር (cores)", "FactDisk": "ባዶ ቦታ ዲስክ", @@ -259,6 +261,7 @@ "RefusalTooMany": "ሕጂ ኣዝዩ ብዙሕ ፈተነታት", "RefusalUnknownTicket": "ግዜ ፈተነ ሓሊፉ", "RefusalUnreachable": "ሰርቨር ክብጻሕ ኣይከኣለን", + "RegistryCredit": "ጉጅለታት ኣድራሻታት፦ RIPE Database ናይ RIPE NCC (ripe.net)፣ ብፍቓዱ ዝተጠቕመ፣ ሓበሬታ ናይ {0}። ካብቲ ኣብ ኢንተርነት ዘሎ ዳታቤዝ ዝኣረገ ክኸውን ይኽእል።", "ResultsTitle": "«me-web?» ዝረኸቦ", "RouterMobile": "ኣብ ሞባይል ዳታ ራውተር ገዛ የለን፦ መርበብ ኣቕራቢኹም እዩ ቀዳማይ።", "RouterNone": "ኣብዚ ርክብ ራውተር ገዛ ኣይተረኽበን።", diff --git a/src/MeWeb.App/Strings/tk.json b/src/MeWeb.App/Strings/tk.json index ff8192b..78790ea 100644 --- a/src/MeWeb.App/Strings/tk.json +++ b/src/MeWeb.App/Strings/tk.json @@ -84,6 +84,8 @@ "FactAdapter": "Tor adapteri", "FactAddressesSeen": "Görlen daşky IPv4 salgylary", "FactBattery": "Batareýa", + "FactBlock": "Salgy topary", + "FactBlockIpv6": "IPv6 üçin salgy topary", "FactChecks": "Barlaglar", "FactCores": "Prosessor ýadrolary", "FactDisk": "Diskdäki boş ýer", @@ -259,6 +261,7 @@ "RefusalTooMany": "häzirlikçe gaty köp synag", "RefusalUnknownTicket": "synagyň möhleti geçdi", "RefusalUnreachable": "serwere ýetip bolmaýar", + "RegistryCredit": "Salgy toparlary: RIPE NCC guramasynyň RIPE Database binýady (ripe.net), onuň rugsady bilen ulanylýar, {0} senesiniň maglumatlary. Maglumatlar onlaýn binýatdan yzda galyp biler.", "ResultsTitle": "“me-web?” näme tapdy", "RouterMobile": "Mobil internetde öý routeri bolmaýar: ilki prowaýderiňiziň tory gelýär.", "RouterNone": "Bu birikmede öý routeri tapylmady.", diff --git a/src/MeWeb.App/Strings/tn.json b/src/MeWeb.App/Strings/tn.json index 0ef7c74..d0e3853 100644 --- a/src/MeWeb.App/Strings/tn.json +++ b/src/MeWeb.App/Strings/tn.json @@ -84,6 +84,8 @@ "FactAdapter": "Karata ya neteweke", "FactAddressesSeen": "Diaterese tsa IPv4 tsa setšhaba tse di bonweng", "FactBattery": "Beteri", + "FactBlock": "Setlhopha sa diaterese", + "FactBlockIpv6": "Setlhopha sa diaterese sa IPv6", "FactChecks": "Ditlhatlhobo", "FactCores": "Di-core tsa porosesara", "FactDisk": "Lefelo le le setseng", @@ -259,6 +261,7 @@ "RefusalTooMany": "diteko di dintsi thata ga jaana", "RefusalUnknownTicket": "nako ya teko e fedile", "RefusalUnreachable": "seva ga e fitlhelelesege", + "RegistryCredit": "Ditlhopha tsa diaterese: RIPE Database ya RIPE NCC (ripe.net), e dirisiwa ka tetla ya yone, tshedimosetso ya {0}. Tshedimosetso e ka nna ya sala morago ga database e e mo inthaneteng.", "ResultsTitle": "Se ‘me-web?’ e se boneng", "RouterMobile": "Ka data ya selula ga go na rauthara ya kwa gae: neteweke ya motlamedi wa gago e tla pele.", "RouterNone": "Ga go a bonwa rauthara ya kwa gae mo kgokaganong eno.", diff --git a/src/MeWeb.App/Strings/to.json b/src/MeWeb.App/Strings/to.json index 3ab5331..483a95f 100644 --- a/src/MeWeb.App/Strings/to.json +++ b/src/MeWeb.App/Strings/to.json @@ -84,6 +84,8 @@ "FactAdapter": "Adapter netiueka", "FactAddressesSeen": "Ngaahi tuʻasila IPv4 fakakakai kuo sio ki ai", "FactBattery": "Pātelī", + "FactBlock": "Kulupu tuʻasila", + "FactBlockIpv6": "Kulupu tuʻasila ki he IPv6", "FactChecks": "Ngaahi vakaiʻi", "FactCores": "Ngaahi core ʻo e processor", "FactDisk": "Feituʻu ʻataʻatā ʻi he disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "lahi fau ʻa e ngaahi sivi he taimi ni", "RefusalUnknownTicket": "kuo ʻosi ʻa e taimi ʻo e sivi", "RefusalUnreachable": "ʻikai lava ke aʻu ki he sēva", + "RegistryCredit": "Ngaahi kulupu tuʻasila: RIPE Database ʻa e RIPE NCC (ripe.net), ʻoku ngāueʻaki ʻi heʻenau ngofua, fakamatala ʻo e {0}. ʻE ala motuʻa ange ia ʻi he database ʻi he ʻinitaneti.", "ResultsTitle": "Meʻa naʻe maʻu ʻe he “me-web?”", "RouterMobile": "ʻI he data telefoni toʻotoʻo ʻoku ʻikai ha router ʻi ʻapi: ko e ʻuluaki sitepu ko e netiueka ʻa hoʻo kautaha ʻinitaneti.", "RouterNone": "Naʻe ʻikai maʻu ha router ʻapi ʻi he fehokotakiʻanga ko ʻeni.", diff --git a/src/MeWeb.App/Strings/tpi.json b/src/MeWeb.App/Strings/tpi.json index c689b8f..f60d935 100644 --- a/src/MeWeb.App/Strings/tpi.json +++ b/src/MeWeb.App/Strings/tpi.json @@ -84,6 +84,8 @@ "FactAdapter": "Netwok adapta", "FactAddressesSeen": "Ol adres IPv4 pablik mipela lukim", "FactBattery": "Bateri", + "FactBlock": "Grup adres", + "FactBlockIpv6": "Grup adres bilong IPv6", "FactChecks": "Ol sekim", "FactCores": "Ol kor bilong prosesa", "FactDisk": "Spes i stap fri long disk", @@ -259,6 +261,7 @@ "RefusalTooMany": "planti tumas tes nau", "RefusalUnknownTicket": "taim bilong tes i pinis", "RefusalUnreachable": "no inap kamap long seva", + "RegistryCredit": "Ol grup adres: RIPE Database bilong RIPE NCC (ripe.net), mipela yusim long tok orait bilong ol, data bilong {0}. Dispela data i ken olpela moa long database long intanet.", "ResultsTitle": "Wanem samting “me-web?” i painim", "RouterMobile": "Long mobail data i no gat rauta long haus: fes step em netwok bilong kampani intanet bilong yu.", "RouterNone": "Mipela no painim rauta bilong haus long dispela koneksen.", diff --git a/src/MeWeb.App/Strings/tr.json b/src/MeWeb.App/Strings/tr.json index 1f64b2e..eafdc75 100644 --- a/src/MeWeb.App/Strings/tr.json +++ b/src/MeWeb.App/Strings/tr.json @@ -84,6 +84,8 @@ "FactAdapter": "Ağ bağdaştırıcısı", "FactAddressesSeen": "Görülen genel IPv4 adresleri", "FactBattery": "Pil", + "FactBlock": "Adres bloğu", + "FactBlockIpv6": "IPv6 adres bloğu", "FactChecks": "Kontroller", "FactCores": "İşlemci çekirdekleri", "FactDisk": "Boş disk alanı", @@ -259,6 +261,7 @@ "RefusalTooMany": "şimdilik çok fazla test", "RefusalUnknownTicket": "testin süresi doldu", "RefusalUnreachable": "sunucuya ulaşılamıyor", + "RegistryCredit": "Adres blokları: RIPE NCC'nin RIPE Database'i (ripe.net), izniyle kullanılıyor, {0} tarihli veriler. Canlı veritabanının gerisinde kalabilir.", "ResultsTitle": "“me-web?” neler buldu", "RouterMobile": "Mobil veride ev modemi yoktur: ilk olarak sağlayıcınızın ağı gelir.", "RouterNone": "Bu bağlantıda ev modemi bulunamadı.", diff --git a/src/MeWeb.App/Strings/tvl.json b/src/MeWeb.App/Strings/tvl.json index a4529f2..3b9dcbb 100644 --- a/src/MeWeb.App/Strings/tvl.json +++ b/src/MeWeb.App/Strings/tvl.json @@ -84,6 +84,8 @@ "FactAdapter": "Kaata upega (network adapter)", "FactAddressesSeen": "Tuatusi IPv4 i te initaneti ne lavea", "FactBattery": "Bateli", + "FactBlock": "Kulupu o tuatusi", + "FactBlockIpv6": "Kulupu o tuatusi mo te IPv6", "FactChecks": "Siakiga", "FactCores": "Malosi o te komipiuta (cores)", "FactDisk": "Koga avanoa (disk)", @@ -259,6 +261,7 @@ "RefusalTooMany": "e uke fakalasi a tofotofoga nei", "RefusalUnknownTicket": "ko oti te taimi o te tofotofoga", "RefusalUnreachable": "e se maua te server", + "RegistryCredit": "Kulupu o tuatusi: te RIPE Database a te RIPE NCC (ripe.net), e fakaaoga mo te lotou fakatagaga, fakamatalaga o te {0}. E mafai o tuai atu i te database i te initaneti.", "ResultsTitle": "Mea ne maua ne “me-web?”", "RouterMobile": "I te data telefoni e seai se router i fale: ko te upega o tau kamupani telefoni te mea muamua.", "RouterNone": "Ne seai se router i fale ne maua i te fesokotakiga tenei.", diff --git a/src/MeWeb.App/Strings/tzm.json b/src/MeWeb.App/Strings/tzm.json index 7f98e36..d5a12bc 100644 --- a/src/MeWeb.App/Strings/tzm.json +++ b/src/MeWeb.App/Strings/tzm.json @@ -84,6 +84,8 @@ "FactAdapter": "Takarḍa n uẓeṭṭa", "FactAddressesSeen": "Tansiwin IPv4 timataytin ittwaẓṛan", "FactBattery": "Tabaṭrit", + "FactBlock": "Tagrumma n tansiwin", + "FactBlockIpv6": "Tagrumma n tansiwin i IPv6", "FactChecks": "Isenqaden", "FactCores": "Ulawen n uprosisur", "FactDisk": "Amkan ilmen", @@ -259,6 +261,7 @@ "RefusalTooMany": "aṭṭas n iremmen ɣilad", "RefusalUnknownTicket": "aremm ifukk lweqt nnes", "RefusalUnreachable": "aqeddac ur ittwalkam", + "RegistryCredit": "Tagrumma n tansiwin: RIPE Database n RIPE NCC (ripe.net), ittusxdam s turagt nnes, isefka n {0}. Isefka ẓḍarn ad qqimen deffir n database n unternit.", "ResultsTitle": "Mad yufa “me-web?”", "RouterMobile": "S isefka n tilifun ur illi uruter n taddart: aẓeṭṭa n tsudest nnun ay d imezwaren.", "RouterNone": "Ur nufi aruter n taddart g tuqqna ad.", diff --git a/src/MeWeb.App/Strings/uk.json b/src/MeWeb.App/Strings/uk.json index d307c85..c036f21 100644 --- a/src/MeWeb.App/Strings/uk.json +++ b/src/MeWeb.App/Strings/uk.json @@ -84,6 +84,8 @@ "FactAdapter": "Мережевий адаптер", "FactAddressesSeen": "Помічені публічні адреси IPv4", "FactBattery": "Батарея", + "FactBlock": "Блок адрес", + "FactBlockIpv6": "Блок адрес для IPv6", "FactChecks": "Перевірок", "FactCores": "Ядра процесора", "FactDisk": "Вільно на диску", @@ -259,6 +261,7 @@ "RefusalTooMany": "поки забагато тестів", "RefusalUnknownTicket": "час тесту минув", "RefusalUnreachable": "сервер недоступний", + "RegistryCredit": "Блоки адрес: RIPE Database від RIPE NCC (ripe.net), використано з дозволу RIPE NCC, дані на {0}. Вони можуть відставати від бази даних онлайн.", "ResultsTitle": "Результати «me-web?»", "RouterMobile": "У мобільному інтернеті домашнього роутера немає: першою йде мережа провайдера.", "RouterNone": "На цьому підключенні домашній роутер не знайдено.", diff --git a/src/MeWeb.App/Strings/ur.json b/src/MeWeb.App/Strings/ur.json index dba859a..2ef8ad6 100644 --- a/src/MeWeb.App/Strings/ur.json +++ b/src/MeWeb.App/Strings/ur.json @@ -84,6 +84,8 @@ "FactAdapter": "نیٹ ورک اڈاپٹر", "FactAddressesSeen": "دیکھے گئے عوامی IPv4 پتے", "FactBattery": "بیٹری", + "FactBlock": "پتوں کا گروپ", + "FactBlockIpv6": "IPv6 کے لیے پتوں کا گروپ", "FactChecks": "جانچیں", "FactCores": "پروسیسر کے کور", "FactDisk": "ڈسک پر خالی جگہ", @@ -259,6 +261,7 @@ "RefusalTooMany": "ابھی کے لیے بہت زیادہ ٹیسٹ", "RefusalUnknownTicket": "ٹیسٹ کا وقت ختم ہو گیا", "RefusalUnreachable": "سرور تک رسائی نہیں", + "RegistryCredit": "پتوں کے گروپ: RIPE NCC کا RIPE Database (ripe.net)، اس کی اجازت سے استعمال کیا گیا، {0} کا ڈیٹا۔ یہ آن لائن ڈیٹا بیس سے پیچھے ہو سکتا ہے۔", "ResultsTitle": "”me-web?“ کو کیا ملا", "RouterMobile": "موبائل ڈیٹا پر گھر کا راؤٹر نہیں ہوتا: سب سے پہلے آپ کی انٹرنیٹ کمپنی کا نیٹ ورک آتا ہے۔", "RouterNone": "اس کنکشن پر گھر کا کوئی راؤٹر نہیں ملا۔", diff --git a/src/MeWeb.App/Strings/uz-Cyrl.json b/src/MeWeb.App/Strings/uz-Cyrl.json index 749e6b7..91defe0 100644 --- a/src/MeWeb.App/Strings/uz-Cyrl.json +++ b/src/MeWeb.App/Strings/uz-Cyrl.json @@ -84,6 +84,8 @@ "FactAdapter": "Тармоқ адаптери", "FactAddressesSeen": "Кўрилган оммавий IPv4 манзиллар", "FactBattery": "Батарея", + "FactBlock": "Манзиллар блоки", + "FactBlockIpv6": "IPv6 учун манзиллар блоки", "FactChecks": "Текширувлар", "FactCores": "Процессор ядролари", "FactDisk": "Дискдаги бўш жой", @@ -259,6 +261,7 @@ "RefusalTooMany": "ҳозирча жуда кўп синов", "RefusalUnknownTicket": "синов муддати тугади", "RefusalUnreachable": "серверга уланиб бўлмайди", + "RegistryCredit": "Манзиллар блоклари: RIPE NCC ташкилотининг RIPE Database базаси (ripe.net), унинг рухсати билан фойдаланилган, {0} ҳолатига кўра маълумотлар. Улар онлайн базадан ортда қолиши мумкин.", "ResultsTitle": "“me-web?” нималарни топди", "RouterMobile": "Мобил интернетда уй роутери бўлмайди: биринчи бўлиб провайдерингиз тармоғи келади.", "RouterNone": "Бу уланишда уй роутери топилмади.", diff --git a/src/MeWeb.App/Strings/uz.json b/src/MeWeb.App/Strings/uz.json index f636a0a..cb48208 100644 --- a/src/MeWeb.App/Strings/uz.json +++ b/src/MeWeb.App/Strings/uz.json @@ -84,6 +84,8 @@ "FactAdapter": "Tarmoq adapteri", "FactAddressesSeen": "Koʻrilgan ommaviy IPv4 manzillar", "FactBattery": "Batareya", + "FactBlock": "Manzillar bloki", + "FactBlockIpv6": "IPv6 uchun manzillar bloki", "FactChecks": "Tekshiruvlar", "FactCores": "Protsessor yadrolari", "FactDisk": "Diskdagi boʻsh joy", @@ -259,6 +261,7 @@ "RefusalTooMany": "hozircha juda koʻp sinov", "RefusalUnknownTicket": "sinov muddati tugadi", "RefusalUnreachable": "serverga ulanib boʻlmaydi", + "RegistryCredit": "Manzillar bloklari: RIPE NCC tashkilotining RIPE Database bazasi (ripe.net), uning ruxsati bilan foydalanilgan, {0} holatiga koʻra maʼlumotlar. Ular onlayn bazadan ortda qolishi mumkin.", "ResultsTitle": "“me-web?” nimalarni topdi", "RouterMobile": "Mobil internetda uy routeri boʻlmaydi: birinchi boʻlib provayderingiz tarmogʻi keladi.", "RouterNone": "Bu ulanishda uy routeri topilmadi.", diff --git a/src/MeWeb.App/Strings/vi.json b/src/MeWeb.App/Strings/vi.json index 05e924c..64617d6 100644 --- a/src/MeWeb.App/Strings/vi.json +++ b/src/MeWeb.App/Strings/vi.json @@ -84,6 +84,8 @@ "FactAdapter": "Card mạng", "FactAddressesSeen": "Các địa chỉ IPv4 công khai đã thấy", "FactBattery": "Pin", + "FactBlock": "Dải địa chỉ", + "FactBlockIpv6": "Dải địa chỉ cho IPv6", "FactChecks": "Số lần kiểm tra", "FactCores": "Số nhân xử lý", "FactDisk": "Dung lượng trống", @@ -259,6 +261,7 @@ "RefusalTooMany": "tạm thời quá nhiều phép thử", "RefusalUnknownTicket": "phép thử đã hết hạn", "RefusalUnreachable": "không kết nối được máy chủ", + "RegistryCredit": "Dải địa chỉ: RIPE Database của RIPE NCC (ripe.net), được dùng với sự cho phép của họ, dữ liệu ngày {0}. Dữ liệu này có thể cũ hơn cơ sở dữ liệu trực tuyến.", "ResultsTitle": "Những gì “me-web?” tìm thấy", "RouterMobile": "Khi dùng dữ liệu di động thì không có modem gia đình: mạng của nhà mạng là chặng đầu tiên.", "RouterNone": "Không tìm thấy modem gia đình trên kết nối này.", diff --git a/src/MeWeb.App/Strings/wni.json b/src/MeWeb.App/Strings/wni.json index cd37c10..f34fc16 100644 --- a/src/MeWeb.App/Strings/wni.json +++ b/src/MeWeb.App/Strings/wni.json @@ -84,6 +84,8 @@ "FactAdapter": "Carte réseau", "FactAddressesSeen": "Adresses publiques IPv4 zionwa", "FactBattery": "Batterie", + "FactBlock": "Bloc ya adresses", + "FactBlockIpv6": "Bloc ya adresses ya IPv6", "FactChecks": "Vérifications", "FactCores": "Cœurs ya processeur", "FactDisk": "Nafasi ibakiyo", @@ -259,6 +261,7 @@ "RefusalTooMany": "tests nyingi mno hasa", "RefusalUnknownTicket": "muda wa test umaliza", "RefusalUnreachable": "serveur kayifikiwa", + "RegistryCredit": "Blocs za adresses: RIPE Database ya RIPE NCC (ripe.net), yitumiwa na idhini yahe, données za {0}. Ziweza uwa nyuma ya base ya données ya internet.", "ResultsTitle": "Ntsini «\u00A0me-web?\u00A0» iparisa", "RouterMobile": "Na données za simu kavu routeur ya dagoni: réseau ya opérateur yaho ndo ya mwandzo.", "RouterNone": "Kavu routeur ya dagoni yiparwa ha connexion iyi.", diff --git a/src/MeWeb.App/Strings/wo.json b/src/MeWeb.App/Strings/wo.json index 20a4a9e..dbc228f 100644 --- a/src/MeWeb.App/Strings/wo.json +++ b/src/MeWeb.App/Strings/wo.json @@ -84,6 +84,8 @@ "FactAdapter": "Kàrtu rezo", "FactAddressesSeen": "Adrees IPv4 publik yi ñu gis", "FactBattery": "Batri", + "FactBlock": "Kurélu adrees", + "FactBlockIpv6": "Kurélu adrees bu IPv6", "FactChecks": "Saytu yi", "FactCores": "Core yu prosesëer bi", "FactDisk": "Barab bu des", @@ -259,6 +261,7 @@ "RefusalTooMany": "natt yi bari nañu lool léegi", "RefusalUnknownTicket": "natt bi diiram jeex na", "RefusalUnreachable": "mënuñu jot serwëer bi", + "RegistryCredit": "Kurélu adrees: RIPE Database bu RIPE NCC (ripe.net), ñu koy jëfandikoo ak sañ-sañ bi mu nu jox, xibaar yu {0}. Xibaar yi mën nañu des ginnaaw database bi nekk ci internet.", "ResultsTitle": "Li “me-web?” gis", "RouterMobile": "Ci data mobil amul routeur bu kër: rezo bu sa operatëer moo jëkk.", "RouterNone": "Gisuñu benn routeur bu kër ci jokkoo bii.", diff --git a/src/MeWeb.App/Strings/yo.json b/src/MeWeb.App/Strings/yo.json index 3615174..332759d 100644 --- a/src/MeWeb.App/Strings/yo.json +++ b/src/MeWeb.App/Strings/yo.json @@ -84,6 +84,8 @@ "FactAdapter": "Káàdì nẹ́tíwọ́ọ̀kì", "FactAddressesSeen": "Àwọn àdírẹ́sì IPv4 gbangba tí a rí", "FactBattery": "Bátìrì", + "FactBlock": "Ìdìpọ̀ àdírẹ́sì", + "FactBlockIpv6": "Ìdìpọ̀ àdírẹ́sì fún IPv6", "FactChecks": "Àwọn àyẹ̀wò", "FactCores": "Kóòsì prosẹ́sọ̀", "FactDisk": "Àyè tó kù", @@ -259,6 +261,7 @@ "RefusalTooMany": "ìdánwò ti pọ̀ jù fún báyìí", "RefusalUnknownTicket": "àkókò ìdánwò náà ti kọjá", "RefusalUnreachable": "a kò lè dé sáfà náà", + "RegistryCredit": "Àwọn ìdìpọ̀ àdírẹ́sì: RIPE Database ti RIPE NCC (ripe.net), tí a lò pẹ̀lú ìyọ̀ǹda wọn, ìwífún ti {0}. Ìwífún yìí lè ti pẹ́ ju èyí tó wà lórí íntánẹ́ẹ̀tì lọ.", "ResultsTitle": "Ohun tí “me-web?” rí", "RouterMobile": "Lórí dátà fóònù kò sí ráútà ilé: nẹ́tíwọ́ọ̀kì olùpèsè yín ló kọ́kọ́ wà.", "RouterNone": "A kò rí ráútà ilé kankan lórí ìsopọ̀ yìí.", diff --git a/src/MeWeb.App/Strings/zdj.json b/src/MeWeb.App/Strings/zdj.json index 8a86414..faf4dc9 100644 --- a/src/MeWeb.App/Strings/zdj.json +++ b/src/MeWeb.App/Strings/zdj.json @@ -84,6 +84,8 @@ "FactAdapter": "Carte réseau", "FactAddressesSeen": "Adresses publiques IPv4 zionwa", "FactBattery": "Batterie", + "FactBlock": "Bloc ya adresses", + "FactBlockIpv6": "Bloc ya adresses ya IPv6", "FactChecks": "Vérifications", "FactCores": "Cœurs ya processeur", "FactDisk": "Nafasi ibakiyo", @@ -259,6 +261,7 @@ "RefusalTooMany": "tests nyingi mno hasa", "RefusalUnknownTicket": "muda wa test umaliza", "RefusalUnreachable": "serveur kayifikiwa", + "RegistryCredit": "Blocs za adresses: RIPE Database ya RIPE NCC (ripe.net), yitumiwa na idhini yahe, données za {0}. Ziweza huwa nyuma ya base ya données ya internet.", "ResultsTitle": "Trini «\u00A0me-web?\u00A0» iparisa", "RouterMobile": "Na données za simu kavu routeur ya dahoni: réseau ya opérateur yaho nde ya mwandzo.", "RouterNone": "Kavu routeur ya dahoni yiparwa ha connexion iyi.", diff --git a/src/MeWeb.App/Strings/zh.json b/src/MeWeb.App/Strings/zh.json index 73922ca..7da094d 100644 --- a/src/MeWeb.App/Strings/zh.json +++ b/src/MeWeb.App/Strings/zh.json @@ -84,6 +84,8 @@ "FactAdapter": "网卡", "FactAddressesSeen": "见过的公网 IPv4 地址", "FactBattery": "电池", + "FactBlock": "地址段", + "FactBlockIpv6": "IPv6 地址段", "FactChecks": "检测次数", "FactCores": "处理器核心数", "FactDisk": "剩余存储空间", @@ -259,6 +261,7 @@ "RefusalTooMany": "暂时测试次数过多", "RefusalUnknownTicket": "测试已过期", "RefusalUnreachable": "服务器连不上", + "RegistryCredit": "地址段:RIPE NCC 的 RIPE Database(ripe.net),经其许可使用,数据日期 {0}。可能落后于在线数据库。", "ResultsTitle": "“me-web?”发现了什么", "RouterMobile": "使用移动数据时没有家用路由器:最先经过的是运营商的网络。", "RouterNone": "这个连接上没有找到家用路由器。", diff --git a/src/MeWeb.App/ViewModels/CardViewModel.cs b/src/MeWeb.App/ViewModels/CardViewModel.cs index 6e6cbb3..9200fe4 100644 --- a/src/MeWeb.App/ViewModels/CardViewModel.cs +++ b/src/MeWeb.App/ViewModels/CardViewModel.cs @@ -15,7 +15,7 @@ public partial class FactViewModel(Fact fact, CheckId card, Action open) static readonly HashSet Copyable = [ "FactPublicV4", "FactPublicV6", "FactLocalAddress", "FactLocalIpv6", "FactLocalPort", "FactGateway", "FactRouterWan", - "FactRouter", "FactDns", "FactNetwork", "FactNetworkIpv6", "FactReverseName", "FactRedirectedTo", + "FactRouter", "FactDns", "FactNetwork", "FactNetworkIpv6", "FactBlock", "FactBlockIpv6", "FactReverseName", "FactRedirectedTo", "FactStunFirst", "FactStunSecond", "FactRoute", "FactRouteBack", ]; diff --git a/src/MeWeb.App/ViewModels/MainViewModel.cs b/src/MeWeb.App/ViewModels/MainViewModel.cs index 7e69d78..457b98d 100644 --- a/src/MeWeb.App/ViewModels/MainViewModel.cs +++ b/src/MeWeb.App/ViewModels/MainViewModel.cs @@ -151,6 +151,7 @@ public partial class MainViewModel : ObservableObject [ObservableProperty] [NotifyPropertyChangedFor(nameof(MapFormatted))] + [NotifyPropertyChangedFor(nameof(RegistryFormatted))] public partial bool ShowContacts { get; set; } [ObservableProperty] @@ -192,6 +193,8 @@ public partial class MainViewModel : ObservableObject public string UpdateFormatted => LatestVersion is null ? "" : Localizer.Instance.Format("UpdateAvailable", LatestVersion); public string MapFormatted => !ShowContacts ? "" : knowledge.HasAsnTable ? Localizer.Instance.Format("MapCredit", knowledge.Asn.SourceDate.ToString("d", Localizer.Instance.Culture)) : Localizer.Instance["MapMissing"]; + public string RegistryFormatted => !ShowContacts || knowledge.Registry is null ? "" : Localizer.Instance.Format("RegistryCredit", knowledge.Registry.SourceDate.ToString("d", Localizer.Instance.Culture)); + [RelayCommand] async Task Start(CancellationToken ct) { @@ -520,7 +523,7 @@ public partial class MainViewModel : ObservableObject if (providerNode is not null && network is not null) { providerNode.TitleText = run.Provider?.Name ?? network.Name; - providerNode.Details = Lines($"AS{network.Number}", network.Name != providerNode.TitleText ? network.Name : null); + providerNode.Details = Lines($"AS{network.Number}", network.Name != providerNode.TitleText ? network.Name : null, Texts.Isolate((run.NetworkV4 is not null ? run.BlockV4 : run.BlockV6)?.Name)); } Settle(NodeRole.Provider, finding.Outcome == Outcome.Info ? Outcome.Good : finding.Outcome); break; @@ -664,6 +667,7 @@ public partial class MainViewModel : ObservableObject OnPropertyChanged(nameof(VersionFormatted)); OnPropertyChanged(nameof(UpdateFormatted)); OnPropertyChanged(nameof(MapFormatted)); + OnPropertyChanged(nameof(RegistryFormatted)); OnPropertyChanged(nameof(Flow)); } } diff --git a/src/MeWeb.App/Views/MainView.axaml b/src/MeWeb.App/Views/MainView.axaml index 471a18f..13f354b 100644 --- a/src/MeWeb.App/Views/MainView.axaml +++ b/src/MeWeb.App/Views/MainView.axaml @@ -556,6 +556,7 @@ Command="{Binding OpenPrivacyCommand}" /> + diff --git a/src/MeWeb.Core/Checks/CheckRunner.cs b/src/MeWeb.Core/Checks/CheckRunner.cs index 9f21af9..ea4af36 100644 --- a/src/MeWeb.Core/Checks/CheckRunner.cs +++ b/src/MeWeb.Core/Checks/CheckRunner.cs @@ -15,6 +15,8 @@ public class RunReport public string PublicV6 { get; set; } public AsnEntry NetworkV4 { get; set; } public AsnEntry NetworkV6 { get; set; } + public RegistryBlock BlockV4 { get; set; } + public RegistryBlock BlockV6 { get; set; } public ProviderProfile Provider { get; set; } public RouterReport Router { get; set; } public List Hops { get; set; } = []; @@ -94,8 +96,12 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k var addresses = Step(CheckId.Addresses, async () => { - run.PublicV4 = await v4; - run.PublicV6 = await v6; + var echo4 = await v4; + var echo6 = await v6; + run.PublicV4 = echo4?.Address; + run.PublicV6 = echo6?.Address; + run.BlockV4 = echo4?.Block is null ? null : new RegistryBlock { Name = echo4.Block, Country = echo4.BlockCountry }; + run.BlockV6 = echo6?.Block is null ? null : new RegistryBlock { Name = echo6.Block, Country = echo6.BlockCountry }; await Task.WhenAll(connection, router); run.OwnNetwork = Addresses.SameNetwork(await ServerProbe.ServerAddresses(ct), run.PublicV4, run.PublicV6); Settle(Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local, run.Router)); @@ -107,8 +113,10 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k var table = knowledge.Asn; run.NetworkV4 = table?.Find(Addresses.Parse(run.PublicV4)); run.NetworkV6 = table?.Find(Addresses.Parse(run.PublicV6)); + run.BlockV4 ??= knowledge.Registry?.Find(Addresses.Parse(run.PublicV4)); + run.BlockV6 ??= knowledge.Registry?.Find(Addresses.Parse(run.PublicV6)); run.Provider = knowledge.ProviderFor((run.NetworkV4 ?? run.NetworkV6)?.Number ?? 0); - Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile)); + Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.BlockV4, run.BlockV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile)); }); var nat = Step(CheckId.Nat, async () => @@ -195,7 +203,7 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k PortLow = run.Stun?.Ports?.Pattern is PortPattern.InOrder or PortPattern.Block ? run.Stun.Ports.Low : 0, PortHigh = run.Stun?.Ports?.Pattern is PortPattern.InOrder or PortPattern.Block ? run.Stun.Ports.High : 0, }); - Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile, run)); + Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.BlockV4, run.BlockV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile, run)); Settle(Verdicts.History(run.History)); run.Uses = Uses.Decide(run); }); diff --git a/src/MeWeb.Core/Checks/ServerProbe.cs b/src/MeWeb.Core/Checks/ServerProbe.cs index bfa63d6..32b57cd 100644 --- a/src/MeWeb.Core/Checks/ServerProbe.cs +++ b/src/MeWeb.Core/Checks/ServerProbe.cs @@ -40,15 +40,14 @@ public class ServerProbe(HttpClient https, HttpClient plain) return new OnlineReport { State = names.Result ? OnlineState.Offline : OnlineState.NoNames }; } - public async Task Echo(bool v6, CancellationToken ct) + public async Task Echo(bool v6, CancellationToken ct) { try { using var timeout = CancellationTokenSource.CreateLinkedTokenSource(ct); timeout.CancelAfter(Patience); var origin = v6 ? Endpoints.BaseV6 : Endpoints.BaseV4; - var answer = await https.GetFromJsonAsync(origin + Endpoints.Server.GET_Ip, MeWebJsonContext.Default.ViewIp, timeout.Token); - return answer?.Address; + return await https.GetFromJsonAsync(origin + Endpoints.Server.GET_Ip, MeWebJsonContext.Default.ViewIp, timeout.Token); } catch (Exception) when (!ct.IsCancellationRequested) { diff --git a/src/MeWeb.Core/Checks/Verdicts.cs b/src/MeWeb.Core/Checks/Verdicts.cs index 3ad382a..64a9962 100644 --- a/src/MeWeb.Core/Checks/Verdicts.cs +++ b/src/MeWeb.Core/Checks/Verdicts.cs @@ -97,7 +97,7 @@ public static class Verdicts return finding; } - public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, bool anyAddress, bool mobile, RunReport run = null) + public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, RegistryBlock blockV4, RegistryBlock blockV6, bool anyAddress, bool mobile, RunReport run = null) { var finding = new Finding { Id = CheckId.Provider }; if (!anyAddress) @@ -127,6 +127,9 @@ public static class Verdicts finding.Args = [profile?.Name ?? Display(main)]; finding.With("FactNetwork", Describe(main)); if (v6 is not null && v4 is not null && v6.Number != v4.Number) finding.With("FactNetworkIpv6", Describe(v6)); + var block = v4 is not null ? blockV4 : blockV6; + finding.With("FactBlock", Describe(block)); + if (v4 is not null && blockV6 is not null && blockV6.Name != blockV4?.Name) finding.With("FactBlockIpv6", Describe(blockV6)); var upstreams = knowledge.NetworkFor(main.Number)?.Upstreams ?? []; if (upstreams.Count > 0) finding.With("FactUpstreams", string.Join("\n", upstreams.Select(u => $"{knowledge.NameOf(u) ?? "AS" + u} (AS{u})"))); if (hand is null && observed is null) return finding; @@ -483,6 +486,8 @@ public static class Verdicts static string Describe(AsnEntry entry) => $"{Display(entry)} (AS{entry.Number})"; + static string Describe(RegistryBlock block) => block is null ? null : string.IsNullOrEmpty(block.Country) ? block.Name : $"{block.Name} ({block.Country})"; + static string Join(string make, string label) { if (string.IsNullOrWhiteSpace(make)) return label; diff --git a/src/MeWeb.Core/Knowledge/AsnTable.cs b/src/MeWeb.Core/Knowledge/AsnTable.cs index a4e0a8d..2280e94 100644 --- a/src/MeWeb.Core/Knowledge/AsnTable.cs +++ b/src/MeWeb.Core/Knowledge/AsnTable.cs @@ -171,14 +171,14 @@ public sealed class AsnTable return result; } - static int Search(T[] starts, T value, int[] systems) where T : IComparable + internal static int Search(T[] starts, T value, int[] systems) where T : IComparable { var position = Array.BinarySearch(starts, value); if (position < 0) position = ~position - 1; return position < 0 ? -1 : systems[position]; } - static void WriteBig(BinaryWriter writer, UInt128 value) + internal static void WriteBig(BinaryWriter writer, UInt128 value) { do { @@ -189,7 +189,7 @@ public sealed class AsnTable while (value != UInt128.Zero); } - static UInt128 ReadBig(BinaryReader reader) + internal static UInt128 ReadBig(BinaryReader reader) { var value = UInt128.Zero; var shift = 0; diff --git a/src/MeWeb.Core/Knowledge/Providers.cs b/src/MeWeb.Core/Knowledge/Providers.cs index f89e349..dbabe88 100644 --- a/src/MeWeb.Core/Knowledge/Providers.cs +++ b/src/MeWeb.Core/Knowledge/Providers.cs @@ -38,6 +38,7 @@ public sealed class KnowledgeBase readonly Lazy asn = new(LoadAsn); readonly Lazy> providers = new(LoadProviders); readonly Lazy networks = new(LoadNetworks); + readonly Lazy registry = new(LoadRegistry); readonly Lazy> carriers = new(LoadCarriers); readonly Lazy> observed = new(LoadObserved); @@ -47,6 +48,8 @@ public sealed class KnowledgeBase public IReadOnlyList Providers => providers.Value; + public RegistryTable Registry => registry.Value; + public ProviderProfile ProviderFor(uint number) => number == 0 ? null : Providers.FirstOrDefault(p => p.Asns.Contains(number)); public ObservedNetwork ObservedFor(uint number, bool mobile) => @@ -64,6 +67,12 @@ public sealed class KnowledgeBase return stream is null ? null : NetworkTable.Read(stream); } + static RegistryTable LoadRegistry() + { + using var stream = typeof(KnowledgeBase).Assembly.GetManifestResourceStream("registry.bin"); + return stream is null ? null : RegistryTable.Read(stream); + } + static Dictionary LoadCarriers() { using var stream = typeof(KnowledgeBase).Assembly.GetManifestResourceStream("carriers.json"); diff --git a/src/MeWeb.Core/Knowledge/RegistryTable.cs b/src/MeWeb.Core/Knowledge/RegistryTable.cs new file mode 100644 index 0000000..a02912a --- /dev/null +++ b/src/MeWeb.Core/Knowledge/RegistryTable.cs @@ -0,0 +1,174 @@ +using System.Buffers.Binary; +using System.IO.Compression; +using System.Net; +using System.Net.Sockets; +using System.Numerics; +using System.Text; + +namespace MeWeb.Core.Knowledge; + +public class RegistryBlock +{ + public string Name { get; set; } + public string Country { get; set; } +} + +public class RegistryRange +{ + public bool V6 { get; set; } + public UInt128 Start { get; set; } + public UInt128 End { get; set; } + public string Name { get; set; } + public string Country { get; set; } +} + +public sealed class RegistryTable +{ + const uint Magic = 0x334B574D; + + RegistryBlock[] blocks; + uint[] v4Start; + int[] v4Block; + UInt128[] v6Start; + int[] v6Block; + + public DateTimeOffset SourceDate { get; private set; } + + public int Count => blocks.Length; + + public RegistryBlock Find(IPAddress address) + { + if (address is null) return null; + if (address.IsIPv4MappedToIPv6) address = address.MapToIPv4(); + var index = address.AddressFamily == AddressFamily.InterNetwork + ? AsnTable.Search(v4Start, BinaryPrimitives.ReadUInt32BigEndian(address.GetAddressBytes()), v4Block) + : AsnTable.Search(v6Start, BinaryPrimitives.ReadUInt128BigEndian(address.GetAddressBytes()), v6Block); + return index < 0 ? null : blocks[index]; + } + + public static RegistryTable Read(Stream compressed) + { + using var brotli = new BrotliStream(compressed, CompressionMode.Decompress); + using var reader = new BinaryReader(brotli, Encoding.UTF8); + if (reader.ReadUInt32() != Magic) throw new InvalidDataException("not a “me-web?” registry table"); + var table = new RegistryTable { SourceDate = DateTimeOffset.FromUnixTimeSeconds(reader.ReadInt64()) }; + table.blocks = new RegistryBlock[reader.Read7BitEncodedInt()]; + for (var i = 0; i < table.blocks.Length; i++) + table.blocks[i] = new RegistryBlock { Name = reader.ReadString(), Country = reader.ReadString() }; + + var count = reader.Read7BitEncodedInt(); + table.v4Start = new uint[count]; + table.v4Block = new int[count]; + var previous4 = 0u; + for (var i = 0; i < count; i++) + { + previous4 += (uint)reader.Read7BitEncodedInt64(); + table.v4Start[i] = previous4; + table.v4Block[i] = reader.Read7BitEncodedInt() - 1; + } + + count = reader.Read7BitEncodedInt(); + table.v6Start = new UInt128[count]; + table.v6Block = new int[count]; + var previous6 = UInt128.Zero; + for (var i = 0; i < count; i++) + { + previous6 += AsnTable.ReadBig(reader); + table.v6Start[i] = previous6; + table.v6Block[i] = reader.Read7BitEncodedInt() - 1; + } + return table; + } + + public static void Write(Stream output, DateTimeOffset sourceDate, List ranges) + { + var index = new Dictionary<(string, string), int>(); + var list = new List(); + var v4 = new List<(uint Start, uint End, int Block)>(); + var v6 = new List<(UInt128 Start, UInt128 End, int Block)>(); + foreach (var range in ranges.OrderBy(r => r.Name, StringComparer.Ordinal).ThenBy(r => r.Country, StringComparer.Ordinal)) + { + var key = (range.Name ?? "", range.Country ?? ""); + if (!index.TryGetValue(key, out var block)) + { + index[key] = block = list.Count; + list.Add(new RegistryBlock { Name = key.Item1, Country = key.Item2 }); + } + if (range.V6) v6.Add((range.Start, range.End, block)); + else v4.Add(((uint)range.Start, (uint)range.End, block)); + } + + using var brotli = new BrotliStream(output, CompressionLevel.SmallestSize, leaveOpen: true); + using var writer = new BinaryWriter(brotli, Encoding.UTF8); + writer.Write(Magic); + writer.Write(sourceDate.ToUnixTimeSeconds()); + writer.Write7BitEncodedInt(list.Count); + foreach (var block in list) + { + writer.Write(block.Name); + writer.Write(block.Country); + } + + var flat4 = new List<(uint Start, int Block)>(); + Narrowest(v4, uint.MaxValue, (start, block) => flat4.Add((start, block))); + writer.Write7BitEncodedInt(flat4.Count); + var previous4 = 0u; + foreach (var (start, block) in flat4) + { + writer.Write7BitEncodedInt64(start - previous4); + writer.Write7BitEncodedInt(block + 1); + previous4 = start; + } + + var flat6 = new List<(UInt128 Start, int Block)>(); + Narrowest(v6, UInt128.MaxValue, (start, block) => flat6.Add((start, block))); + writer.Write7BitEncodedInt(flat6.Count); + var previous6 = UInt128.Zero; + foreach (var (start, block) in flat6) + { + AsnTable.WriteBig(writer, start - previous6); + writer.Write7BitEncodedInt(block + 1); + previous6 = start; + } + } + + public static void Narrowest(List<(T Start, T End, int Block)> ranges, T max, Action write) where T : struct, IBinaryInteger + { + ranges.Sort((a, b) => a.Start != b.Start ? a.Start.CompareTo(b.Start) : b.End.CompareTo(a.End)); + var open = new Stack<(T Start, T End, int Block)>(); + var written = -1; + (T Start, int Block)? pending = null; + void Emit(T start, int block) + { + if (pending?.Start == start) + { + pending = block == written ? null : (start, block); + return; + } + if (block == (pending?.Block ?? written)) return; + if (pending is { } previous) + { + write(previous.Start, previous.Block); + written = previous.Block; + } + pending = (start, block); + } + void Close(T before) + { + while (open.Count > 0 && open.Peek().End < before) + { + var done = open.Pop(); + if (done.End < max) Emit(done.End + T.One, open.Count > 0 ? open.Peek().Block : -1); + } + } + foreach (var range in ranges) + { + Close(range.Start); + if (open.Count > 0 && range.End > open.Peek().End) continue; + open.Push(range); + Emit(range.Start, range.Block); + } + Close(max); + if (pending is { } last) write(last.Start, last.Block); + } +} diff --git a/src/MeWeb.Core/Knowledge/Sources.cs b/src/MeWeb.Core/Knowledge/Sources.cs index 0a8b395..6075146 100644 --- a/src/MeWeb.Core/Knowledge/Sources.cs +++ b/src/MeWeb.Core/Knowledge/Sources.cs @@ -1,6 +1,8 @@ using System.Buffers.Binary; using System.IO.Compression; using System.Net; +using System.Net.Sockets; +using System.Text; namespace MeWeb.Core.Knowledge; @@ -12,6 +14,13 @@ public class Carrier public static class Sources { + static readonly HashSet Allocations = ["ALLOCATED PA", "ALLOCATED UNSPECIFIED", "ALLOCATED-BY-RIR"]; + static readonly UInt128 WideV4 = 2048; + static readonly UInt128 NarrowV4 = 256; + static readonly UInt128 WideV6 = UInt128.One << 88; + static readonly UInt128 NarrowV6 = UInt128.One << 80; + const int Repeated = 3; + public static IEnumerable IpToAsn(Stream gzip) { var names = new Dictionary(StringComparer.Ordinal); @@ -46,6 +55,73 @@ public static class Sources return seen.ToDictionary(p => p.Key, p => p.Value.MaxBy(n => n.Value).Key); } + public static IEnumerable RipeBlocks(Stream gzip) + { + using var reader = new StreamReader(new GZipStream(gzip, CompressionMode.Decompress), Encoding.Latin1); + RegistryRange range = null; + string status = null; + string line; + while ((line = reader.ReadLine()) is not null) + { + if (line.Length == 0) + { + if (range?.Name is not null && !Allocations.Contains(status ?? "")) yield return range; + range = null; + status = null; + continue; + } + if (range is null) + { + range = RipeRange(line); + continue; + } + if (line.StartsWith("netname:", StringComparison.Ordinal)) range.Name ??= Value(line); + else if (line.StartsWith("country:", StringComparison.Ordinal)) range.Country ??= Value(line).ToUpperInvariant(); + else if (line.StartsWith("status:", StringComparison.Ordinal)) status ??= Value(line); + } + if (range?.Name is not null && !Allocations.Contains(status ?? "")) yield return range; + } + + public static List RipeSelection(IEnumerable blocks) + { + var counts = new Dictionary(StringComparer.Ordinal); + foreach (var block in blocks) + if (block.End - block.Start >= (block.V6 ? NarrowV6 : NarrowV4) - 1) counts[block.Name] = counts.GetValueOrDefault(block.Name) + 1; + var names = new Dictionary(StringComparer.Ordinal); + var kept = new List(); + foreach (var block in blocks) + { + var size = block.End - block.Start; + if (size < (block.V6 ? NarrowV6 : NarrowV4) - 1 || (size < (block.V6 ? WideV6 : WideV4) - 1 && counts[block.Name] < Repeated)) continue; + block.Name = Intern(names, block.Name); + block.Country = Intern(names, block.Country ?? ""); + kept.Add(block); + } + return kept; + } + + static RegistryRange RipeRange(string line) + { + if (line.StartsWith("inetnum:", StringComparison.Ordinal)) + { + var parts = Value(line).Split('-', StringSplitOptions.TrimEntries); + if (parts.Length != 2 || !IPAddress.TryParse(parts[0], out var first) || !IPAddress.TryParse(parts[1], out var last)) return null; + if (first.AddressFamily != AddressFamily.InterNetwork || last.AddressFamily != AddressFamily.InterNetwork) return null; + return new RegistryRange { Start = BinaryPrimitives.ReadUInt32BigEndian(first.GetAddressBytes()), End = BinaryPrimitives.ReadUInt32BigEndian(last.GetAddressBytes()) }; + } + if (!line.StartsWith("inet6num:", StringComparison.Ordinal) || !IPNetwork.TryParse(Value(line), out var network)) return null; + var start = BinaryPrimitives.ReadUInt128BigEndian(network.BaseAddress.GetAddressBytes()); + var span = network.PrefixLength == 0 ? UInt128.MaxValue : (UInt128.One << (128 - network.PrefixLength)) - 1; + return new RegistryRange { V6 = true, Start = start, End = start | span }; + } + + static string Value(string line) + { + var text = line.AsSpan(line.IndexOf(':') + 1); + var comment = text.IndexOf('#'); + return (comment < 0 ? text : text[..comment]).Trim().ToString(); + } + public static List Carriers(TextReader textpb) { var list = new List(); diff --git a/src/MeWeb.Core/MeWeb.Core.csproj b/src/MeWeb.Core/MeWeb.Core.csproj index a92503e..fe128ae 100644 --- a/src/MeWeb.Core/MeWeb.Core.csproj +++ b/src/MeWeb.Core/MeWeb.Core.csproj @@ -12,6 +12,7 @@ + diff --git a/src/MeWeb.Server/KnowledgeFeeder.cs b/src/MeWeb.Server/KnowledgeFeeder.cs index deac1e1..47b3416 100644 --- a/src/MeWeb.Server/KnowledgeFeeder.cs +++ b/src/MeWeb.Server/KnowledgeFeeder.cs @@ -23,12 +23,15 @@ public class KnowledgeOptions public partial class KnowledgeFeeder(IOptionsMonitor options, IHttpClientFactory factory, ILogger log) : BackgroundService { public const string Client = "knowledge"; - public static readonly string[] Published = ["ip2asn.bin", "networks.bin", "carriers.json", "SOURCES.txt"]; + public static readonly string[] Published = ["ip2asn.bin", "networks.bin", "carriers.json", "registry.bin", "SOURCES.txt"]; const string IpToAsn = "iptoasn"; const string DbIp = "dbip"; const string RouteViews = "routeviews:"; const string Carriers = "carriers"; + const string RipeV4 = "ripe:inetnum"; + const string RipeV6 = "ripe:inet6num"; + const string RipeSplit = "https://ftp.ripe.net/ripe/dbase/split/ripe.db.{0}.gz"; const string CarriersUrl = "https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/refs/heads/main/assets/latest_carrier_id/carrier_list.textpb?format=TEXT"; const string RibIndex = "https://archive.routeviews.org/{0}/bgpdata/{1}/RIBS/"; const string RouteViewsLicence = "RouteViews (www.routeviews.org), University of Oregon, Creative Commons Attribution 4.0 (CC BY 4.0); only each network's most frequent neighbours on the way in are kept"; @@ -50,8 +53,12 @@ public partial class KnowledgeFeeder(IOptionsMonitor options, [IpToAsn] = "iptoasn.com, Public Domain Dedication and License (PDDL) 1.0", [DbIp] = "IP to ASN Lite by DB-IP (https://db-ip.com), Creative Commons Attribution 4.0 (CC BY 4.0)", [Carriers] = "Android Open Source Project carrier list, Apache License 2.0", + [RipeV4] = RipeLicence, + [RipeV6] = RipeLicence, }; + const string RipeLicence = "RIPE Database extract, RIPE NCC (https://www.ripe.net), used with the RIPE NCC's permission (16 October 2026, ticket #1122623) for a free app with no commercial use; only each block's range, name and country are kept, from blocks of at least 2048 IPv4 addresses or a /40, or of at least 256 addresses or a /48 whose name recurs; it may lag behind the live database"; + public string Folder => options.CurrentValue.Folder; protected override async Task ExecuteAsync(CancellationToken stoppingToken) @@ -72,6 +79,8 @@ public partial class KnowledgeFeeder(IOptionsMonitor options, while (await timer.WaitForNextTickAsync(stoppingToken)); } + public RegistryBlock BlockFor(IPAddress address) => RegistryIndex.Find(Path.Combine(Folder, "current", RegistryIndex.FileName), address); + public ViewKnowledge Manifest() { var path = Path.Combine(Folder, "current", "manifest.json"); @@ -121,6 +130,17 @@ public partial class KnowledgeFeeder(IOptionsMonitor options, } } changed |= await Fetch(http, known, Carriers, CarriersUrl, Path.Combine(sources, "carrier_list.textpb"), TimeSpan.FromDays(7), true, ct); + foreach (var (name, kind) in new[] { (RipeV4, "inetnum"), (RipeV6, "inet6num") }) + { + try + { + changed |= await Fetch(http, known, name, string.Format(CultureInfo.InvariantCulture, RipeSplit, kind), Path.Combine(sources, $"ripe-{kind}.gz"), TimeSpan.FromDays(7), false, ct); + } + catch (HttpRequestException ex) + { + log.LogWarning("{Service} could not fetch the RIPE {Kind} file: {Error}", nameof(KnowledgeFeeder), kind, ex.Message); + } + } if (!changed && Manifest() is not null) return; Build(sources, known.Values.ToList(), ct); @@ -195,6 +215,9 @@ public partial class KnowledgeFeeder(IOptionsMonitor options, var built = DateTimeOffset.UtcNow; var byName = known.ToDictionary(s => s.Name); + var registry = Registry(sources, staging, byName.GetValueOrDefault(RipeV4)?.LastModified ?? built); + ct.ThrowIfCancellationRequested(); + var ip2asn = Path.Combine(sources, "ip2asn.tsv.gz"); if (File.Exists(ip2asn)) { @@ -251,9 +274,26 @@ public partial class KnowledgeFeeder(IOptionsMonitor options, if (Directory.Exists(previous)) Directory.Delete(previous, true); if (Directory.Exists(current)) Directory.Move(current, previous); Directory.Move(staging, current); - log.LogInformation("{Service} built {Files} in {Seconds:0.0} s: {Networks} networks, upstreams from {Collectors} routing tables, {Carriers} carriers", + log.LogInformation("{Service} built {Files} in {Seconds:0.0} s: {Networks} networks, upstreams from {Collectors} routing tables, {Carriers} carriers, {Kept} of {Blocks} registry blocks embedded", nameof(KnowledgeFeeder), string.Join(", ", manifest.Files.Select(f => $"{f.Name} {f.Bytes / 1024} KiB")), clock.Elapsed.TotalSeconds, - organisations.Keys.Union(upstreams.Keys).Count(), tally.Collectors, list.Count); + organisations.Keys.Union(upstreams.Keys).Count(), tally.Collectors, list.Count, registry.Kept, registry.All); + } + + static (int Kept, int All) Registry(string sources, string staging, DateTimeOffset date) + { + var v4 = Read(Path.Combine(sources, "ripe-inetnum.gz")); + var v6 = Read(Path.Combine(sources, "ripe-inet6num.gz")); + var kept = Sources.RipeSelection(v4.Concat(v6)); + if (kept.Count == 0) return (0, 0); + using (var output = File.Create(Path.Combine(staging, "registry.bin"))) RegistryTable.Write(output, date, kept); + return (kept.Count, RegistryIndex.Build(v4, v6, Path.Combine(staging, RegistryIndex.FileName), date)); + + static IEnumerable Read(string path) + { + if (!File.Exists(path)) yield break; + using var input = File.OpenRead(path); + foreach (var block in Sources.RipeBlocks(input)) yield return block; + } } static string Hash(string path) diff --git a/src/MeWeb.Server/PrivacyPage.cs b/src/MeWeb.Server/PrivacyPage.cs index 199535d..f34ef9e 100644 --- a/src/MeWeb.Server/PrivacyPage.cs +++ b/src/MeWeb.Server/PrivacyPage.cs @@ -12,7 +12,7 @@ public static class PrivacyPage "## Who is responsible", "Arasaka di Hvozdikov Yevheniy, a sole trader in Busto Arsizio (VA), Italy, VAT number IT03929200123, publishes “me-web?” and runs its server, meweb.arasaka.software, on its own hardware in Italy. Questions and requests: through the form at [https://arasaka.software/contact](https://arasaka.software/contact).", "## What the server sees on every check", - "To answer at all, the server sees your public IP address. It tells it back to the app and keeps no record of it: the web server writes no access log for meweb.arasaka.software, and the app server logs no addresses. To limit abuse, the server counts tests per address (per /64 for IPv6) in memory for up to one day; the counts are lost when it restarts.", + "To answer at all, the server sees your public IP address. It tells it back to the app, with the name of the block of addresses it belongs to in the server's own copy of the RIPE Database, and keeps no record of it: the web server writes no access log for meweb.arasaka.software, and the app server logs no addresses. To limit abuse, the server counts tests per address (per /64 for IPv6) in memory for up to one day; the counts are lost when it restarts.", "## The test from outside, only if you agree", "If you choose it in the app, the server connects back to your public address on up to three ports to see whether it reaches the app, and traces the route from the server towards that address, looking up the names of the routers on the way. The results go back to the app and are not stored. If you also choose to open ports, the app asks your router to open them for ten minutes and closes them afterwards.", "## Shared findings, only if you send them", @@ -29,7 +29,7 @@ public static class PrivacyPage "## Chi è responsabile", "Arasaka di Hvozdikov Yevheniy, ditta individuale di Busto Arsizio (VA), P.IVA 03929200123, pubblica «me-web?» e gestisce il suo server, meweb.arasaka.software, su hardware proprio in Italia. Domande e richieste: con il modulo su [https://arasaka.software/it/contatti](https://arasaka.software/it/contatti).", "## Che cosa vede il server a ogni verifica", - "Per poter rispondere, il server vede il suo indirizzo IP pubblico. Lo comunica all'app e non ne tiene traccia: il server web non scrive registri di accesso per meweb.arasaka.software e il server dell'app non registra indirizzi. Per limitare gli abusi, il server conta le prove per indirizzo (per /64 in IPv6) in memoria per al massimo un giorno; i conteggi si perdono al riavvio.", + "Per poter rispondere, il server vede il suo indirizzo IP pubblico. Lo comunica all'app, insieme al nome del blocco di indirizzi a cui appartiene secondo la copia del RIPE Database conservata sul server, e non ne tiene traccia: il server web non scrive registri di accesso per meweb.arasaka.software e il server dell'app non registra indirizzi. Per limitare gli abusi, il server conta le prove per indirizzo (per /64 in IPv6) in memoria per al massimo un giorno; i conteggi si perdono al riavvio.", "## La prova da fuori, solo se lei è d'accordo", "Se lo sceglie nell'app, il server si ricollega al suo indirizzo pubblico su al massimo tre porte per vedere se raggiunge l'app, e traccia il percorso dal server verso quell'indirizzo, cercando i nomi dei router lungo la strada. I risultati tornano all'app e non vengono conservati. Se sceglie anche di aprire le porte, l'app chiede al router di aprirle per dieci minuti e poi le richiude.", "## I risultati condivisi, solo se li invia", diff --git a/src/MeWeb.Server/RegistryIndex.cs b/src/MeWeb.Server/RegistryIndex.cs new file mode 100644 index 0000000..99e6dc6 --- /dev/null +++ b/src/MeWeb.Server/RegistryIndex.cs @@ -0,0 +1,112 @@ +using System.Buffers.Binary; +using System.Net; +using System.Net.Sockets; +using System.Text; + +using MeWeb.Core.Knowledge; + +namespace MeWeb.Server; + +public static class RegistryIndex +{ + public const string FileName = "registry-full.bin"; + + const uint Magic = 0x344B574D; + const int HeaderBytes = 32; + const int V4Bytes = 8; + const int V6Bytes = 20; + + public static int Build(IEnumerable v4Blocks, IEnumerable v6Blocks, string path, DateTimeOffset date) + { + var namesPath = path + ".names"; + var count = 0; + using (var names = File.Create(namesPath)) + using (var labels = new BinaryWriter(names, Encoding.UTF8)) + using (var output = File.Create(path)) + using (var writer = new BinaryWriter(output)) + { + int Label(RegistryRange block) + { + var at = checked((int)names.Position); + labels.Write(block.Name); + labels.Write(block.Country ?? ""); + count++; + return at; + } + writer.Write(new byte[HeaderBytes]); + var v4 = new List<(uint Start, uint End, int Block)>(5_000_000); + foreach (var block in v4Blocks.Where(b => !b.V6)) v4.Add(((uint)block.Start, (uint)block.End, Label(block))); + var count4 = 0; + RegistryTable.Narrowest(v4, uint.MaxValue, (start, block) => + { + writer.Write(start); + writer.Write(block); + count4++; + }); + v4 = null; + var v6 = new List<(UInt128 Start, UInt128 End, int Block)>(1_200_000); + foreach (var block in v6Blocks.Where(b => b.V6)) v6.Add((block.Start, block.End, Label(block))); + var count6 = 0; + RegistryTable.Narrowest(v6, UInt128.MaxValue, (start, block) => + { + writer.Write((ulong)(start >> 64)); + writer.Write((ulong)start); + writer.Write(block); + count6++; + }); + v6 = null; + labels.Flush(); + writer.Flush(); + var namesAt = output.Position; + names.Position = 0; + names.CopyTo(output); + output.Position = 0; + writer.Write(Magic); + writer.Write(date.ToUnixTimeSeconds()); + writer.Write(count4); + writer.Write(count6); + writer.Write(namesAt); + } + File.Delete(namesPath); + return count; + } + + public static RegistryBlock Find(string path, IPAddress address) + { + if (address is null || !File.Exists(path)) return null; + if (address.IsIPv4MappedToIPv6) address = address.MapToIPv4(); + using var handle = File.OpenHandle(path); + Span header = stackalloc byte[HeaderBytes]; + if (RandomAccess.Read(handle, header, 0) < HeaderBytes || BinaryPrimitives.ReadUInt32LittleEndian(header) != Magic) return null; + var count4 = BinaryPrimitives.ReadInt32LittleEndian(header[12..]); + var count6 = BinaryPrimitives.ReadInt32LittleEndian(header[16..]); + var namesAt = BinaryPrimitives.ReadInt64LittleEndian(header[20..]); + var v4 = address.AddressFamily == AddressFamily.InterNetwork; + var value = v4 ? BinaryPrimitives.ReadUInt32BigEndian(address.GetAddressBytes()) : BinaryPrimitives.ReadUInt128BigEndian(address.GetAddressBytes()); + var first = v4 ? HeaderBytes : HeaderBytes + (long)count4 * V4Bytes; + var size = v4 ? V4Bytes : V6Bytes; + Span record = stackalloc byte[V6Bytes]; + var low = 0; + var high = (v4 ? count4 : count6) - 1; + var block = -1; + while (low <= high) + { + var middle = low + (high - low) / 2; + RandomAccess.Read(handle, record[..size], first + (long)middle * size); + var start = v4 + ? BinaryPrimitives.ReadUInt32LittleEndian(record) + : ((UInt128)BinaryPrimitives.ReadUInt64LittleEndian(record) << 64) | BinaryPrimitives.ReadUInt64LittleEndian(record[8..]); + if (start <= value) + { + block = BinaryPrimitives.ReadInt32LittleEndian(record[(size - 4)..]); + low = middle + 1; + } + else high = middle - 1; + } + if (block < 0) return null; + var text = new byte[640]; + var read = RandomAccess.Read(handle, text, namesAt + block); + using var reader = new BinaryReader(new MemoryStream(text, 0, read), Encoding.UTF8); + return new RegistryBlock { Name = reader.ReadString(), Country = reader.ReadString() }; + } +} diff --git a/src/MeWeb.Server/ServerApi.cs b/src/MeWeb.Server/ServerApi.cs index fdcaf02..4d2bff9 100644 --- a/src/MeWeb.Server/ServerApi.cs +++ b/src/MeWeb.Server/ServerApi.cs @@ -116,13 +116,14 @@ public static class ServerApi static ViewInfo Info() => new() { Version = BuildInfo.Version, Commit = BuildInfo.Commit, BuiltAt = BuildInfo.BuiltAt }; - static IResult Ip(HttpContext context) + static IResult Ip(HttpContext context, KnowledgeFeeder knowledge) { var address = context.Connection.RemoteIpAddress; if (address is null) return Results.BadRequest(); if (address.IsIPv4MappedToIPv6) address = address.MapToIPv4(); var family = address.AddressFamily == AddressFamily.InterNetworkV6 ? "ipv6" : "ipv4"; - return Results.Ok(new ViewIp { Address = address.ToString(), Family = family }); + var block = knowledge.BlockFor(address); + return Results.Ok(new ViewIp { Address = address.ToString(), Family = family, Block = block?.Name, BlockCountry = block?.Country }); } static async Task Page(HttpContext context, ReleaseFeed feed, CancellationToken ct) diff --git a/src/MeWeb.Shared/ServerContracts.cs b/src/MeWeb.Shared/ServerContracts.cs index b16be1c..831d9b0 100644 --- a/src/MeWeb.Shared/ServerContracts.cs +++ b/src/MeWeb.Shared/ServerContracts.cs @@ -11,6 +11,8 @@ public class ViewIp { public string Address { get; set; } public string Family { get; set; } + public string Block { get; set; } + public string BlockCountry { get; set; } } public class ViewKnowledge diff --git a/tools/knowledge.cs b/tools/knowledge.cs index 7231df1..bdecb83 100644 --- a/tools/knowledge.cs +++ b/tools/knowledge.cs @@ -58,7 +58,7 @@ if (!File.Exists(download) || File.GetLastWriteTimeUtc(download) < DateTime.UtcN using (var input = File.OpenRead(download)) using (var file = File.Create(Path.Combine(output, "ip2asn.bin"))) AsnTable.Write(file, sourceDate, Sources.IpToAsn(input)); -foreach (var stale in new[] { "networks.bin", "carriers.json" }) File.Delete(Path.Combine(output, stale)); +foreach (var stale in new[] { "networks.bin", "carriers.json", "registry.bin" }) File.Delete(Path.Combine(output, stale)); string sha; using (var input = File.OpenRead(download)) sha = Convert.ToHexStringLower(SHA256.HashData(input)); File.WriteAllText(Path.Combine(output, "SOURCE.txt"), $"iptoasn.com, Public Domain Dedication and License (PDDL) 1.0\n{Fallback}\nlast-modified {sourceDate:O}\nsha256 {sha}\n"); @@ -73,7 +73,11 @@ void Report() NetworkTable networks = null; if (File.Exists(path)) using (var input = File.OpenRead(path)) networks = NetworkTable.Read(input); - Console.WriteLine($"knowledge: {table.Count} networks in the provider map (source {table.SourceDate:yyyy-MM-dd}), {networks?.Count ?? 0} with names or upstreams"); + RegistryTable registry = null; + path = Path.Combine(output, "registry.bin"); + if (File.Exists(path)) + using (var input = File.OpenRead(path)) registry = RegistryTable.Read(input); + Console.WriteLine($"knowledge: {table.Count} networks in the provider map (source {table.SourceDate:yyyy-MM-dd}), {networks?.Count ?? 0} with names or upstreams, {registry?.Count ?? 0} address block names"); } static string FindRoot()