From c72a6be433630ea264def93027f413695bb4e49c Mon Sep 17 00:00:00 2001 From: thepra Date: Thu, 15 Oct 2026 12:59:42 +0200 Subject: [PATCH] me-web? 0.5.3: the cards no longer contradict each other - From the publisher's own network, the tests aimed at its server stay inside the house, so the type of address translation, the ports, the hairpin, how long a connection stays open, the speed and the round trip described the home network: a report said "hard NAT" next to "ports kept". These cards now say the test can't run there, and those messages are not sent. - Who holds your public IPv4 address is now decided by the same evidence as the address sharing card, so a home router behind a provider's shared address no longer reads "your router" on one card and "shared with other customers" on the next. - When your connection differs from what the provider notes say is usual (a shared address, port 25), the provider card adds "On this line" with what was found, right under the note. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB --- CLAUDE.md | 8 ++++++ Directory.Build.props | 2 +- src/MeWeb.App/Strings/am.json | 1 + src/MeWeb.App/Strings/ar.json | 1 + src/MeWeb.App/Strings/ay.json | 1 + src/MeWeb.App/Strings/az-Cyrl.json | 1 + src/MeWeb.App/Strings/az.json | 1 + src/MeWeb.App/Strings/be.json | 1 + src/MeWeb.App/Strings/bg.json | 1 + src/MeWeb.App/Strings/bi.json | 1 + src/MeWeb.App/Strings/bn.json | 1 + src/MeWeb.App/Strings/bs-Cyrl.json | 1 + src/MeWeb.App/Strings/bs.json | 1 + src/MeWeb.App/Strings/ca.json | 1 + src/MeWeb.App/Strings/cs.json | 1 + src/MeWeb.App/Strings/da.json | 1 + src/MeWeb.App/Strings/de.json | 1 + src/MeWeb.App/Strings/dv.json | 1 + src/MeWeb.App/Strings/dz.json | 1 + src/MeWeb.App/Strings/el.json | 1 + src/MeWeb.App/Strings/en.json | 1 + src/MeWeb.App/Strings/es.json | 1 + src/MeWeb.App/Strings/et.json | 1 + src/MeWeb.App/Strings/fa.json | 1 + src/MeWeb.App/Strings/fi.json | 1 + src/MeWeb.App/Strings/fil.json | 1 + src/MeWeb.App/Strings/fj.json | 1 + src/MeWeb.App/Strings/fr.json | 1 + src/MeWeb.App/Strings/ga.json | 1 + src/MeWeb.App/Strings/gil.json | 1 + src/MeWeb.App/Strings/gn.json | 1 + src/MeWeb.App/Strings/gsw.json | 1 + src/MeWeb.App/Strings/he.json | 1 + src/MeWeb.App/Strings/hi.json | 1 + src/MeWeb.App/Strings/hif.json | 1 + src/MeWeb.App/Strings/ho.json | 1 + src/MeWeb.App/Strings/hr.json | 1 + src/MeWeb.App/Strings/ht.json | 1 + src/MeWeb.App/Strings/hu.json | 1 + src/MeWeb.App/Strings/hy.json | 1 + src/MeWeb.App/Strings/id.json | 1 + src/MeWeb.App/Strings/is.json | 1 + src/MeWeb.App/Strings/it.json | 1 + src/MeWeb.App/Strings/ja.json | 1 + src/MeWeb.App/Strings/ka.json | 1 + src/MeWeb.App/Strings/kk.json | 1 + src/MeWeb.App/Strings/km.json | 1 + src/MeWeb.App/Strings/ko.json | 1 + src/MeWeb.App/Strings/ky.json | 1 + src/MeWeb.App/Strings/lb.json | 1 + src/MeWeb.App/Strings/lo.json | 1 + src/MeWeb.App/Strings/lt.json | 1 + src/MeWeb.App/Strings/lv.json | 1 + src/MeWeb.App/Strings/mg.json | 1 + src/MeWeb.App/Strings/mh.json | 1 + src/MeWeb.App/Strings/mi.json | 1 + src/MeWeb.App/Strings/mk.json | 1 + src/MeWeb.App/Strings/mn.json | 1 + src/MeWeb.App/Strings/ms-Arab.json | 1 + src/MeWeb.App/Strings/ms.json | 1 + src/MeWeb.App/Strings/mt.json | 1 + src/MeWeb.App/Strings/my.json | 1 + src/MeWeb.App/Strings/nb.json | 1 + src/MeWeb.App/Strings/nd.json | 1 + src/MeWeb.App/Strings/ne.json | 1 + src/MeWeb.App/Strings/nl.json | 1 + src/MeWeb.App/Strings/nn.json | 1 + src/MeWeb.App/Strings/no.json | 1 + src/MeWeb.App/Strings/ny.json | 1 + src/MeWeb.App/Strings/pl.json | 1 + src/MeWeb.App/Strings/ps.json | 1 + src/MeWeb.App/Strings/pt.json | 1 + src/MeWeb.App/Strings/qu.json | 1 + src/MeWeb.App/Strings/rn.json | 1 + src/MeWeb.App/Strings/ro.json | 1 + src/MeWeb.App/Strings/ru.json | 1 + src/MeWeb.App/Strings/rw.json | 1 + src/MeWeb.App/Strings/sg.json | 1 + src/MeWeb.App/Strings/si.json | 1 + src/MeWeb.App/Strings/sk.json | 1 + src/MeWeb.App/Strings/sl.json | 1 + src/MeWeb.App/Strings/sm.json | 1 + src/MeWeb.App/Strings/sn.json | 1 + src/MeWeb.App/Strings/so.json | 1 + src/MeWeb.App/Strings/sq.json | 1 + src/MeWeb.App/Strings/sr-Latn.json | 1 + src/MeWeb.App/Strings/sr.json | 1 + src/MeWeb.App/Strings/ss.json | 1 + src/MeWeb.App/Strings/st.json | 1 + src/MeWeb.App/Strings/sv.json | 1 + src/MeWeb.App/Strings/sw.json | 1 + src/MeWeb.App/Strings/ta.json | 1 + src/MeWeb.App/Strings/tet.json | 1 + src/MeWeb.App/Strings/tg.json | 1 + src/MeWeb.App/Strings/th.json | 1 + src/MeWeb.App/Strings/ti.json | 1 + src/MeWeb.App/Strings/tk.json | 1 + src/MeWeb.App/Strings/tn.json | 1 + src/MeWeb.App/Strings/to.json | 1 + src/MeWeb.App/Strings/tpi.json | 1 + src/MeWeb.App/Strings/tr.json | 1 + src/MeWeb.App/Strings/tvl.json | 1 + src/MeWeb.App/Strings/tzm.json | 1 + src/MeWeb.App/Strings/uk.json | 1 + src/MeWeb.App/Strings/ur.json | 1 + src/MeWeb.App/Strings/uz-Cyrl.json | 1 + src/MeWeb.App/Strings/uz.json | 1 + src/MeWeb.App/Strings/vi.json | 1 + src/MeWeb.App/Strings/wni.json | 1 + src/MeWeb.App/Strings/wo.json | 1 + src/MeWeb.App/Strings/yo.json | 1 + src/MeWeb.App/Strings/zdj.json | 1 + src/MeWeb.App/Strings/zh.json | 1 + src/MeWeb.Core/Checks/CheckRunner.cs | 41 ++++++++++++++++++---------- src/MeWeb.Core/Checks/ServerProbe.cs | 12 ++++++++ src/MeWeb.Core/Checks/Verdicts.cs | 28 +++++++++++++++---- src/MeWeb.Core/Net/Addresses.cs | 11 ++++++++ 117 files changed, 192 insertions(+), 21 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c5ab384..72e32ab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,6 +99,14 @@ The Android release key: alias `meweb`, certificate SHA-256 `CheckRunner` skips the router protocols on a mobile link, and a private or 100.64 address on the device with a different public echo is the operator's NAT (`NatKind.Shared`); before 0.4 a phone on Iliad read "router not answering" and "can't tell" everywhere downstream. Provider profiles describe home lines, so on mobile the card says so. +- **The publisher's own network measures the house, not the line.** When the public IPv4 equals the server's, or + the IPv6 shares its /48 (`Addresses.SameNetwork`, `RunReport.OwnNetwork`), everything aimed at the server loops + back through the FRITZ!Box: the NAT type, the port burst, hairpin, lifetime, speed and round trip. Those cards then + say `ReachOwnNetwork` and the burst is not sent; before 0.5.3 a home report read "hard NAT" next to "ports kept". +- **One verdict decides who holds the IPv4.** `Verdicts.Holder(NatOf(...))` feeds both the address card and the + provider card's "On this line" row, so a home router behind CGNAT can no longer read "your router" on one card and + "shared with other customers" on the next. Provider notes that the check contradicts (sharing, port 25) get that row + right under them, added when the provider card is settled again at the end of the run. - **The route is drawn, never trusted.** `Route.Trace` (8 TTLs) feeds the path's wires: hops after the first, up to the first public one, sit before the shared exit or the provider; public ones carry their AS number into the internet; unanswered runs collapse to "…". The NAT verdict never reads them (see the 100.64 pitfall). diff --git a/Directory.Build.props b/Directory.Build.props index 88ed8e8..5daab62 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.5.2 + 0.5.3 me-web? Arasaka di Hvozdikov Yevheniy © 2026 Arasaka di Hvozdikov Yevheniy diff --git a/src/MeWeb.App/Strings/am.json b/src/MeWeb.App/Strings/am.json index 569692b..a450a4b 100644 --- a/src/MeWeb.App/Strings/am.json +++ b/src/MeWeb.App/Strings/am.json @@ -135,6 +135,7 @@ "FactStunFirst": "የመጀመሪያው STUN አገልጋይ", "FactStunSecond": "ሁለተኛው STUN አገልጋይ", "FactSystem": "ሲስተም", + "FactThisLine": "በዚህ መስመር ላይ", "FactUpload": "መስቀል", "FactUpnp": "UPnP", "FactUpstreams": "ከኢንተርኔት ጋር የሚያገናኙት አውታረ መረቦች", diff --git a/src/MeWeb.App/Strings/ar.json b/src/MeWeb.App/Strings/ar.json index 198b7f8..f945155 100644 --- a/src/MeWeb.App/Strings/ar.json +++ b/src/MeWeb.App/Strings/ar.json @@ -135,6 +135,7 @@ "FactStunFirst": "خادم STUN الأول", "FactStunSecond": "خادم STUN الثاني", "FactSystem": "النظام", + "FactThisLine": "على هذا الخط", "FactUpload": "الرفع", "FactUpnp": "UPnP", "FactUpstreams": "متصل بالإنترنت عبر", diff --git a/src/MeWeb.App/Strings/ay.json b/src/MeWeb.App/Strings/ay.json index e5296b1..9a8b3e8 100644 --- a/src/MeWeb.App/Strings/ay.json +++ b/src/MeWeb.App/Strings/ay.json @@ -135,6 +135,7 @@ "FactStunFirst": "Nayrïr STUN servidor", "FactStunSecond": "Payïr STUN servidor", "FactSystem": "Sistema", + "FactThisLine": "Aka líneana", "FactUpload": "Apkatäña", "FactUpnp": "UPnP", "FactUpstreams": "Internetar kuna redanak tuqis mayachasi", diff --git a/src/MeWeb.App/Strings/az-Cyrl.json b/src/MeWeb.App/Strings/az-Cyrl.json index 8613f19..aaa4e07 100644 --- a/src/MeWeb.App/Strings/az-Cyrl.json +++ b/src/MeWeb.App/Strings/az-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринҹи STUN сервери", "FactStunSecond": "Икинҹи STUN сервери", "FactSystem": "Систем", + "FactThisLine": "Бу хәтдә", "FactUpload": "Ҝөндәрмә", "FactUpnp": "UPnP", "FactUpstreams": "Интернетә бунлар васитәсилә гошулур", diff --git a/src/MeWeb.App/Strings/az.json b/src/MeWeb.App/Strings/az.json index 79ae60b..d4c931a 100644 --- a/src/MeWeb.App/Strings/az.json +++ b/src/MeWeb.App/Strings/az.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinci STUN serveri", "FactStunSecond": "İkinci STUN serveri", "FactSystem": "Sistem", + "FactThisLine": "Bu xətdə", "FactUpload": "Göndərmə", "FactUpnp": "UPnP", "FactUpstreams": "İnternetə qoşulduğu şəbəkələr", diff --git a/src/MeWeb.App/Strings/be.json b/src/MeWeb.App/Strings/be.json index 4f086d5..32018b5 100644 --- a/src/MeWeb.App/Strings/be.json +++ b/src/MeWeb.App/Strings/be.json @@ -135,6 +135,7 @@ "FactStunFirst": "Першы сервер STUN", "FactStunSecond": "Другі сервер STUN", "FactSystem": "Сістэма", + "FactThisLine": "На гэтай лініі", "FactUpload": "Запампоўка", "FactUpnp": "UPnP", "FactUpstreams": "Выхад у інтэрнэт праз", diff --git a/src/MeWeb.App/Strings/bg.json b/src/MeWeb.App/Strings/bg.json index 49aed9c..0956c91 100644 --- a/src/MeWeb.App/Strings/bg.json +++ b/src/MeWeb.App/Strings/bg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Първи STUN сървър", "FactStunSecond": "Втори STUN сървър", "FactSystem": "Система", + "FactThisLine": "На тази линия", "FactUpload": "Качване", "FactUpnp": "UPnP", "FactUpstreams": "Свързан с интернет чрез", diff --git a/src/MeWeb.App/Strings/bi.json b/src/MeWeb.App/Strings/bi.json index e164899..bd5821c 100644 --- a/src/MeWeb.App/Strings/bi.json +++ b/src/MeWeb.App/Strings/bi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Fas STUN seva", "FactStunSecond": "Seken STUN seva", "FactSystem": "Sistem", + "FactThisLine": "Long laen ia", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "I konek long intanet tru long", diff --git a/src/MeWeb.App/Strings/bn.json b/src/MeWeb.App/Strings/bn.json index 66c744a..37309a5 100644 --- a/src/MeWeb.App/Strings/bn.json +++ b/src/MeWeb.App/Strings/bn.json @@ -135,6 +135,7 @@ "FactStunFirst": "প্রথম STUN সার্ভার", "FactStunSecond": "দ্বিতীয় STUN সার্ভার", "FactSystem": "সিস্টেম", + "FactThisLine": "এই লাইনে", "FactUpload": "আপলোড", "FactUpnp": "UPnP", "FactUpstreams": "যাদের মাধ্যমে ইন্টারনেটে যুক্ত", diff --git a/src/MeWeb.App/Strings/bs-Cyrl.json b/src/MeWeb.App/Strings/bs-Cyrl.json index fd706dd..99a17d2 100644 --- a/src/MeWeb.App/Strings/bs-Cyrl.json +++ b/src/MeWeb.App/Strings/bs-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Први STUN сервер", "FactStunSecond": "Други STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На овој линији", "FactUpload": "Отпремање", "FactUpnp": "UPnP", "FactUpstreams": "Веза с интернетом преко", diff --git a/src/MeWeb.App/Strings/bs.json b/src/MeWeb.App/Strings/bs.json index bc5854e..9fe88c2 100644 --- a/src/MeWeb.App/Strings/bs.json +++ b/src/MeWeb.App/Strings/bs.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sistem", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Otpremanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano s internetom preko", diff --git a/src/MeWeb.App/Strings/ca.json b/src/MeWeb.App/Strings/ca.json index aba713c..5d464d0 100644 --- a/src/MeWeb.App/Strings/ca.json +++ b/src/MeWeb.App/Strings/ca.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primer servidor STUN", "FactStunSecond": "Segon servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "En aquesta línia", "FactUpload": "Pujada", "FactUpnp": "UPnP", "FactUpstreams": "Connectat a Internet a través de", diff --git a/src/MeWeb.App/Strings/cs.json b/src/MeWeb.App/Strings/cs.json index c8d6583..5b84359 100644 --- a/src/MeWeb.App/Strings/cs.json +++ b/src/MeWeb.App/Strings/cs.json @@ -135,6 +135,7 @@ "FactStunFirst": "První server STUN", "FactStunSecond": "Druhý server STUN", "FactSystem": "Systém", + "FactThisLine": "Na této přípojce", "FactUpload": "Odesílání", "FactUpnp": "UPnP", "FactUpstreams": "Připojeno k internetu přes", diff --git a/src/MeWeb.App/Strings/da.json b/src/MeWeb.App/Strings/da.json index 7093355..7c59804 100644 --- a/src/MeWeb.App/Strings/da.json +++ b/src/MeWeb.App/Strings/da.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Anden STUN-server", "FactSystem": "System", + "FactThisLine": "På denne forbindelse", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Forbundet til internettet gennem", diff --git a/src/MeWeb.App/Strings/de.json b/src/MeWeb.App/Strings/de.json index 9630484..6fe9092 100644 --- a/src/MeWeb.App/Strings/de.json +++ b/src/MeWeb.App/Strings/de.json @@ -135,6 +135,7 @@ "FactStunFirst": "Erster STUN-Server", "FactStunSecond": "Zweiter STUN-Server", "FactSystem": "System", + "FactThisLine": "An diesem Anschluss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mit dem Internet verbunden über", diff --git a/src/MeWeb.App/Strings/dv.json b/src/MeWeb.App/Strings/dv.json index ab50491..950b7b6 100644 --- a/src/MeWeb.App/Strings/dv.json +++ b/src/MeWeb.App/Strings/dv.json @@ -135,6 +135,7 @@ "FactStunFirst": "ފުރަތަމަ STUN ސަރވަރު", "FactStunSecond": "ދެވަނަ STUN ސަރވަރު", "FactSystem": "ސިސްޓަމް", + "FactThisLine": "މި ލައިނުގައި", "FactUpload": "އަޕްލޯޑް", "FactUpnp": "UPnP", "FactUpstreams": "އިންޓަނެޓާ ގުޅޭ ނެޓްވޯކްތައް", diff --git a/src/MeWeb.App/Strings/dz.json b/src/MeWeb.App/Strings/dz.json index 3cab0ab..431b734 100644 --- a/src/MeWeb.App/Strings/dz.json +++ b/src/MeWeb.App/Strings/dz.json @@ -135,6 +135,7 @@ "FactStunFirst": "STUN སར་བར་དང་པ", "FactStunSecond": "STUN སར་བར་གཉིས་པ", "FactSystem": "རིམ་ལུགས", + "FactThisLine": "མཐུད་ལམ་འདི་གུ", "FactUpload": "ཡར་བཏོན", "FactUpnp": "UPnP", "FactUpstreams": "ཨིན་ཊར་ནེཊ་ལུ་ མཐུད་ནིའི་བརྒྱུད་ལམ", diff --git a/src/MeWeb.App/Strings/el.json b/src/MeWeb.App/Strings/el.json index 5770910..9c8f207 100644 --- a/src/MeWeb.App/Strings/el.json +++ b/src/MeWeb.App/Strings/el.json @@ -135,6 +135,7 @@ "FactStunFirst": "Πρώτος διακομιστής STUN", "FactStunSecond": "Δεύτερος διακομιστής STUN", "FactSystem": "Σύστημα", + "FactThisLine": "Σε αυτή τη γραμμή", "FactUpload": "Αποστολή", "FactUpnp": "UPnP", "FactUpstreams": "Συνδέεται στο διαδίκτυο μέσω", diff --git a/src/MeWeb.App/Strings/en.json b/src/MeWeb.App/Strings/en.json index 036fb45..75fe350 100644 --- a/src/MeWeb.App/Strings/en.json +++ b/src/MeWeb.App/Strings/en.json @@ -135,6 +135,7 @@ "FactStunFirst": "First STUN server", "FactStunSecond": "Second STUN server", "FactSystem": "System", + "FactThisLine": "On this line", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Connected to the internet through", diff --git a/src/MeWeb.App/Strings/es.json b/src/MeWeb.App/Strings/es.json index ee7f74a..0e10215 100644 --- a/src/MeWeb.App/Strings/es.json +++ b/src/MeWeb.App/Strings/es.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primer servidor STUN", "FactStunSecond": "Segundo servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "En esta línea", "FactUpload": "Subida", "FactUpnp": "UPnP", "FactUpstreams": "Conectado a internet a través de", diff --git a/src/MeWeb.App/Strings/et.json b/src/MeWeb.App/Strings/et.json index ace5ab7..59aa31c 100644 --- a/src/MeWeb.App/Strings/et.json +++ b/src/MeWeb.App/Strings/et.json @@ -135,6 +135,7 @@ "FactStunFirst": "Esimene STUN-server", "FactStunSecond": "Teine STUN-server", "FactSystem": "Süsteem", + "FactThisLine": "Sellel ühendusel", "FactUpload": "Üleslaadimine", "FactUpnp": "UPnP", "FactUpstreams": "Internetiühendus järgmiste võrkude kaudu", diff --git a/src/MeWeb.App/Strings/fa.json b/src/MeWeb.App/Strings/fa.json index d4697fb..03240b7 100644 --- a/src/MeWeb.App/Strings/fa.json +++ b/src/MeWeb.App/Strings/fa.json @@ -135,6 +135,7 @@ "FactStunFirst": "سرور STUN اول", "FactStunSecond": "سرور STUN دوم", "FactSystem": "سیستم", + "FactThisLine": "روی این خط", "FactUpload": "آپلود", "FactUpnp": "UPnP", "FactUpstreams": "اتصال به اینترنت از طریق", diff --git a/src/MeWeb.App/Strings/fi.json b/src/MeWeb.App/Strings/fi.json index 1535cf1..7dca576 100644 --- a/src/MeWeb.App/Strings/fi.json +++ b/src/MeWeb.App/Strings/fi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Ensimmäinen STUN-palvelin", "FactStunSecond": "Toinen STUN-palvelin", "FactSystem": "Järjestelmä", + "FactThisLine": "Tässä liittymässä", "FactUpload": "Lähetys", "FactUpnp": "UPnP", "FactUpstreams": "Yhteys internetiin näiden verkkojen kautta", diff --git a/src/MeWeb.App/Strings/fil.json b/src/MeWeb.App/Strings/fil.json index 60e3b61..17dee19 100644 --- a/src/MeWeb.App/Strings/fil.json +++ b/src/MeWeb.App/Strings/fil.json @@ -135,6 +135,7 @@ "FactStunFirst": "Unang STUN server", "FactStunSecond": "Ikalawang STUN server", "FactSystem": "Sistema", + "FactThisLine": "Sa linyang ito", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Nakakonekta sa internet sa pamamagitan ng", diff --git a/src/MeWeb.App/Strings/fj.json b/src/MeWeb.App/Strings/fj.json index e5ad61b..bef9a1e 100644 --- a/src/MeWeb.App/Strings/fj.json +++ b/src/MeWeb.App/Strings/fj.json @@ -135,6 +135,7 @@ "FactStunFirst": "Imatai ni server ni STUN", "FactStunSecond": "Ikarua ni server ni STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Ena laini oqo", "FactUpload": "Vakacabe", "FactUpnp": "UPnP", "FactUpstreams": "E semati ki na internet ena", diff --git a/src/MeWeb.App/Strings/fr.json b/src/MeWeb.App/Strings/fr.json index 19a644b..dbc01f1 100644 --- a/src/MeWeb.App/Strings/fr.json +++ b/src/MeWeb.App/Strings/fr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Premier serveur STUN", "FactStunSecond": "Deuxième serveur STUN", "FactSystem": "Système", + "FactThisLine": "Sur cette ligne", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connecté à Internet via", diff --git a/src/MeWeb.App/Strings/ga.json b/src/MeWeb.App/Strings/ga.json index 1255eff..5e3c879 100644 --- a/src/MeWeb.App/Strings/ga.json +++ b/src/MeWeb.App/Strings/ga.json @@ -135,6 +135,7 @@ "FactStunFirst": "An chéad fhreastalaí STUN", "FactStunSecond": "An dara freastalaí STUN", "FactSystem": "Córas", + "FactThisLine": "Ar an líne seo", "FactUpload": "Uaslódáil", "FactUpnp": "UPnP", "FactUpstreams": "Ceangailte leis an idirlíon trí", diff --git a/src/MeWeb.App/Strings/gil.json b/src/MeWeb.App/Strings/gil.json index 0cb35dd..e8e01ac 100644 --- a/src/MeWeb.App/Strings/gil.json +++ b/src/MeWeb.App/Strings/gil.json @@ -135,6 +135,7 @@ "FactStunFirst": "Moan te server n STUN", "FactStunSecond": "Kauoua te server n STUN", "FactSystem": "Sistem", + "FactThisLine": "N te rain aei", "FactUpload": "Kanakoan", "FactUpnp": "UPnP", "FactUpstreams": "E kaboraoaki nakon te internet rinanon", diff --git a/src/MeWeb.App/Strings/gn.json b/src/MeWeb.App/Strings/gn.json index 1de357a..3c6f25d 100644 --- a/src/MeWeb.App/Strings/gn.json +++ b/src/MeWeb.App/Strings/gn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Servidor STUN peteĩha", "FactStunSecond": "Servidor STUN mokõiha", "FactSystem": "Sistema", + "FactThisLine": "Ko línea-pe", "FactUpload": "Ñemohupi", "FactUpnp": "UPnP", "FactUpstreams": "Ojoaju internet-pe ko'ã rupive", diff --git a/src/MeWeb.App/Strings/gsw.json b/src/MeWeb.App/Strings/gsw.json index 2fee1fc..375de8e 100644 --- a/src/MeWeb.App/Strings/gsw.json +++ b/src/MeWeb.App/Strings/gsw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Erschte STUN-Server", "FactStunSecond": "Zweite STUN-Server", "FactSystem": "System", + "FactThisLine": "A dem Aaschluss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mit em Internet verbunde über", diff --git a/src/MeWeb.App/Strings/he.json b/src/MeWeb.App/Strings/he.json index 4ee25a4..160c50f 100644 --- a/src/MeWeb.App/Strings/he.json +++ b/src/MeWeb.App/Strings/he.json @@ -135,6 +135,7 @@ "FactStunFirst": "שרת STUN ראשון", "FactStunSecond": "שרת STUN שני", "FactSystem": "מערכת", + "FactThisLine": "בקו הזה", "FactUpload": "העלאה", "FactUpnp": "UPnP", "FactUpstreams": "מחובר לאינטרנט דרך", diff --git a/src/MeWeb.App/Strings/hi.json b/src/MeWeb.App/Strings/hi.json index 87d1955..1e2e635 100644 --- a/src/MeWeb.App/Strings/hi.json +++ b/src/MeWeb.App/Strings/hi.json @@ -135,6 +135,7 @@ "FactStunFirst": "पहला STUN सर्वर", "FactStunSecond": "दूसरा STUN सर्वर", "FactSystem": "सिस्टम", + "FactThisLine": "इस लाइन पर", "FactUpload": "अपलोड", "FactUpnp": "UPnP", "FactUpstreams": "इंटरनेट से जोड़ने वाले नेटवर्क", diff --git a/src/MeWeb.App/Strings/hif.json b/src/MeWeb.App/Strings/hif.json index f5ea527..b31b050 100644 --- a/src/MeWeb.App/Strings/hif.json +++ b/src/MeWeb.App/Strings/hif.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pahila STUN server", "FactStunSecond": "Dusra STUN server", "FactSystem": "System", + "FactThisLine": "Ii line pe", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Internet se in network ke raste juraa hai", diff --git a/src/MeWeb.App/Strings/ho.json b/src/MeWeb.App/Strings/ho.json index be95632..25b2e95 100644 --- a/src/MeWeb.App/Strings/ho.json +++ b/src/MeWeb.App/Strings/ho.json @@ -135,6 +135,7 @@ "FactStunFirst": "STUN seva ginigunana", "FactStunSecond": "STUN seva iharuana", "FactSystem": "Sistem", + "FactThisLine": "Inai lain ai", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "Intanet dekenai ia konek dalana", diff --git a/src/MeWeb.App/Strings/hr.json b/src/MeWeb.App/Strings/hr.json index 02a124a..92cea41 100644 --- a/src/MeWeb.App/Strings/hr.json +++ b/src/MeWeb.App/Strings/hr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sustav", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Slanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezan s internetom preko", diff --git a/src/MeWeb.App/Strings/ht.json b/src/MeWeb.App/Strings/ht.json index 2188be1..bebdb68 100644 --- a/src/MeWeb.App/Strings/ht.json +++ b/src/MeWeb.App/Strings/ht.json @@ -135,6 +135,7 @@ "FactStunFirst": "Premye sèvè STUN", "FactStunSecond": "Dezyèm sèvè STUN", "FactSystem": "Sistèm", + "FactThisLine": "Sou liy sa a", "FactUpload": "Televèsman", "FactUpnp": "UPnP", "FactUpstreams": "Konekte ak entènèt la atravè", diff --git a/src/MeWeb.App/Strings/hu.json b/src/MeWeb.App/Strings/hu.json index 2fc2544..b3a194f 100644 --- a/src/MeWeb.App/Strings/hu.json +++ b/src/MeWeb.App/Strings/hu.json @@ -135,6 +135,7 @@ "FactStunFirst": "Első STUN-szerver", "FactStunSecond": "Második STUN-szerver", "FactSystem": "Rendszer", + "FactThisLine": "Ezen a vonalon", "FactUpload": "Feltöltés", "FactUpnp": "UPnP", "FactUpstreams": "Az internethez ezeken keresztül csatlakozik", diff --git a/src/MeWeb.App/Strings/hy.json b/src/MeWeb.App/Strings/hy.json index 425df1d..60f0bc5 100644 --- a/src/MeWeb.App/Strings/hy.json +++ b/src/MeWeb.App/Strings/hy.json @@ -135,6 +135,7 @@ "FactStunFirst": "Առաջին STUN սերվերը", "FactStunSecond": "Երկրորդ STUN սերվերը", "FactSystem": "Համակարգ", + "FactThisLine": "Այս գծում", "FactUpload": "Վերբեռնում", "FactUpnp": "UPnP", "FactUpstreams": "Համացանցին միացված է այս ցանցերի միջոցով", diff --git a/src/MeWeb.App/Strings/id.json b/src/MeWeb.App/Strings/id.json index b8a17b7..e7c19b6 100644 --- a/src/MeWeb.App/Strings/id.json +++ b/src/MeWeb.App/Strings/id.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN pertama", "FactStunSecond": "Server STUN kedua", "FactSystem": "Sistem", + "FactThisLine": "Di jalur ini", "FactUpload": "Unggah", "FactUpnp": "UPnP", "FactUpstreams": "Terhubung ke internet melalui", diff --git a/src/MeWeb.App/Strings/is.json b/src/MeWeb.App/Strings/is.json index 7ca6926..1e33ff5 100644 --- a/src/MeWeb.App/Strings/is.json +++ b/src/MeWeb.App/Strings/is.json @@ -135,6 +135,7 @@ "FactStunFirst": "Fyrri STUN-þjónn", "FactStunSecond": "Seinni STUN-þjónn", "FactSystem": "Kerfi", + "FactThisLine": "Á þessari tengingu", "FactUpload": "Upphal", "FactUpnp": "UPnP", "FactUpstreams": "Tengt internetinu um", diff --git a/src/MeWeb.App/Strings/it.json b/src/MeWeb.App/Strings/it.json index 5bef779..c9a0fe7 100644 --- a/src/MeWeb.App/Strings/it.json +++ b/src/MeWeb.App/Strings/it.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primo server STUN", "FactStunSecond": "Secondo server STUN", "FactSystem": "Sistema", + "FactThisLine": "Su questa linea", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Collegato a internet tramite", diff --git a/src/MeWeb.App/Strings/ja.json b/src/MeWeb.App/Strings/ja.json index e48be27..00f714b 100644 --- a/src/MeWeb.App/Strings/ja.json +++ b/src/MeWeb.App/Strings/ja.json @@ -135,6 +135,7 @@ "FactStunFirst": "1 つ目の STUN サーバー", "FactStunSecond": "2 つ目の STUN サーバー", "FactSystem": "システム", + "FactThisLine": "この回線では", "FactUpload": "アップロード", "FactUpnp": "UPnP", "FactUpstreams": "インターネットへの接続先", diff --git a/src/MeWeb.App/Strings/ka.json b/src/MeWeb.App/Strings/ka.json index f7194ba..eb6aada 100644 --- a/src/MeWeb.App/Strings/ka.json +++ b/src/MeWeb.App/Strings/ka.json @@ -135,6 +135,7 @@ "FactStunFirst": "პირველი STUN სერვერი", "FactStunSecond": "მეორე STUN სერვერი", "FactSystem": "სისტემა", + "FactThisLine": "ამ ხაზზე", "FactUpload": "ატვირთვა", "FactUpnp": "UPnP", "FactUpstreams": "ინტერნეტთან დამაკავშირებელი ქსელები", diff --git a/src/MeWeb.App/Strings/kk.json b/src/MeWeb.App/Strings/kk.json index d6ad765..3b5ce73 100644 --- a/src/MeWeb.App/Strings/kk.json +++ b/src/MeWeb.App/Strings/kk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Бірінші STUN сервері", "FactStunSecond": "Екінші STUN сервері", "FactSystem": "Жүйе", + "FactThisLine": "Бұл қосылымда", "FactUpload": "Жүктеп жіберу", "FactUpnp": "UPnP", "FactUpstreams": "Интернетке мына желілер арқылы қосылған", diff --git a/src/MeWeb.App/Strings/km.json b/src/MeWeb.App/Strings/km.json index 98dcae2..878e89b 100644 --- a/src/MeWeb.App/Strings/km.json +++ b/src/MeWeb.App/Strings/km.json @@ -135,6 +135,7 @@ "FactStunFirst": "ម៉ាស៊ីនមេ STUN ទីមួយ", "FactStunSecond": "ម៉ាស៊ីនមេ STUN ទីពីរ", "FactSystem": "ប្រព័ន្ធ", + "FactThisLine": "នៅលើខ្សែអ៊ីនធឺណិតនេះ", "FactUpload": "ផ្ទុកឡើង", "FactUpnp": "UPnP", "FactUpstreams": "តភ្ជាប់អ៊ីនធឺណិតតាមរយៈ", diff --git a/src/MeWeb.App/Strings/ko.json b/src/MeWeb.App/Strings/ko.json index f84d073..3f4b510 100644 --- a/src/MeWeb.App/Strings/ko.json +++ b/src/MeWeb.App/Strings/ko.json @@ -135,6 +135,7 @@ "FactStunFirst": "첫 번째 STUN 서버", "FactStunSecond": "두 번째 STUN 서버", "FactSystem": "시스템", + "FactThisLine": "이 회선에서는", "FactUpload": "업로드", "FactUpnp": "UPnP", "FactUpstreams": "인터넷 연결을 제공하는 네트워크", diff --git a/src/MeWeb.App/Strings/ky.json b/src/MeWeb.App/Strings/ky.json index 9c972ce..cb7cd08 100644 --- a/src/MeWeb.App/Strings/ky.json +++ b/src/MeWeb.App/Strings/ky.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринчи STUN сервери", "FactStunSecond": "Экинчи STUN сервери", "FactSystem": "Система", + "FactThisLine": "Бул линияда", "FactUpload": "Жүктөп жөнөтүү", "FactUpnp": "UPnP", "FactUpstreams": "Интернетке булар аркылуу туташкан", diff --git a/src/MeWeb.App/Strings/lb.json b/src/MeWeb.App/Strings/lb.json index d775372..82ae0a1 100644 --- a/src/MeWeb.App/Strings/lb.json +++ b/src/MeWeb.App/Strings/lb.json @@ -135,6 +135,7 @@ "FactStunFirst": "Éischten STUN-Server", "FactStunSecond": "Zweeten STUN-Server", "FactSystem": "System", + "FactThisLine": "Op dësem Uschloss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mam Internet verbonnen iwwer", diff --git a/src/MeWeb.App/Strings/lo.json b/src/MeWeb.App/Strings/lo.json index c1701e5..9ff489c 100644 --- a/src/MeWeb.App/Strings/lo.json +++ b/src/MeWeb.App/Strings/lo.json @@ -135,6 +135,7 @@ "FactStunFirst": "ເຊີເວີ STUN ທຳອິດ", "FactStunSecond": "ເຊີເວີ STUN ທີສອງ", "FactSystem": "ລະບົບ", + "FactThisLine": "ໃນສາຍອິນເຕີເນັດນີ້", "FactUpload": "ອັບໂຫຼດ", "FactUpnp": "UPnP", "FactUpstreams": "ເຊື່ອມຕໍ່ອິນເຕີເນັດຜ່ານ", diff --git a/src/MeWeb.App/Strings/lt.json b/src/MeWeb.App/Strings/lt.json index 714cf82..8f6e43e 100644 --- a/src/MeWeb.App/Strings/lt.json +++ b/src/MeWeb.App/Strings/lt.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pirmasis STUN serveris", "FactStunSecond": "Antrasis STUN serveris", "FactSystem": "Sistema", + "FactThisLine": "Šioje linijoje", "FactUpload": "Išsiuntimas", "FactUpnp": "UPnP", "FactUpstreams": "Prie interneto jungiasi per", diff --git a/src/MeWeb.App/Strings/lv.json b/src/MeWeb.App/Strings/lv.json index 948d875..1ec9154 100644 --- a/src/MeWeb.App/Strings/lv.json +++ b/src/MeWeb.App/Strings/lv.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pirmais STUN serveris", "FactStunSecond": "Otrais STUN serveris", "FactSystem": "Sistēma", + "FactThisLine": "Šajā pieslēgumā", "FactUpload": "Augšupielāde", "FactUpnp": "UPnP", "FactUpstreams": "Savienots ar internetu caur", diff --git a/src/MeWeb.App/Strings/mg.json b/src/MeWeb.App/Strings/mg.json index a3d9988..876398f 100644 --- a/src/MeWeb.App/Strings/mg.json +++ b/src/MeWeb.App/Strings/mg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Mpizara STUN voalohany", "FactStunSecond": "Mpizara STUN faharoa", "FactSystem": "Rafitra", + "FactThisLine": "Amin'ity tsipika ity", "FactUpload": "Fampakarana", "FactUpnp": "UPnP", "FactUpstreams": "Mifandray amin'ny aterineto amin'ny alalan'ny", diff --git a/src/MeWeb.App/Strings/mh.json b/src/MeWeb.App/Strings/mh.json index 267b38a..c4eca5d 100644 --- a/src/MeWeb.App/Strings/mh.json +++ b/src/MeWeb.App/Strings/mh.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server in STUN eo m̧oktata", "FactStunSecond": "Server in STUN eo kein karuo", "FactSystem": "System", + "FactThisLine": "Ilo laain in", "FactUpload": "Jilkinļo̧k", "FactUpnp": "UPnP", "FactUpstreams": "Ej kobaik ippān internet kōn", diff --git a/src/MeWeb.App/Strings/mi.json b/src/MeWeb.App/Strings/mi.json index 70633a4..060d798 100644 --- a/src/MeWeb.App/Strings/mi.json +++ b/src/MeWeb.App/Strings/mi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Tūmau STUN tuatahi", "FactStunSecond": "Tūmau STUN tuarua", "FactSystem": "Pūnaha", + "FactThisLine": "I tēnei rārangi", "FactUpload": "Tukuake", "FactUpnp": "UPnP", "FactUpstreams": "E hono ana ki te ipurangi mā", diff --git a/src/MeWeb.App/Strings/mk.json b/src/MeWeb.App/Strings/mk.json index a7020f2..f1d8e31 100644 --- a/src/MeWeb.App/Strings/mk.json +++ b/src/MeWeb.App/Strings/mk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Прв STUN сервер", "FactStunSecond": "Втор STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На оваа линија", "FactUpload": "Прикачување", "FactUpnp": "UPnP", "FactUpstreams": "Поврзано на интернет преку", diff --git a/src/MeWeb.App/Strings/mn.json b/src/MeWeb.App/Strings/mn.json index ee63564..f89295b 100644 --- a/src/MeWeb.App/Strings/mn.json +++ b/src/MeWeb.App/Strings/mn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Эхний STUN сервер", "FactStunSecond": "Хоёр дахь STUN сервер", "FactSystem": "Систем", + "FactThisLine": "Энэ шугам дээр", "FactUpload": "Илгээх", "FactUpnp": "UPnP", "FactUpstreams": "Интернэтэд дамжин холбогддог сүлжээ", diff --git a/src/MeWeb.App/Strings/ms-Arab.json b/src/MeWeb.App/Strings/ms-Arab.json index 582ade9..30daef6 100644 --- a/src/MeWeb.App/Strings/ms-Arab.json +++ b/src/MeWeb.App/Strings/ms-Arab.json @@ -135,6 +135,7 @@ "FactStunFirst": "ڤلاين STUN ڤرتام", "FactStunSecond": "ڤلاين STUN کدوا", "FactSystem": "سيستم", + "FactThisLine": "ڤد تالين اين", "FactUpload": "موات ناءيق", "FactUpnp": "UPnP", "FactUpstreams": "برسمبوڠ ک اينترنيت ملالوءي", diff --git a/src/MeWeb.App/Strings/ms.json b/src/MeWeb.App/Strings/ms.json index 8dd8912..20160cc 100644 --- a/src/MeWeb.App/Strings/ms.json +++ b/src/MeWeb.App/Strings/ms.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pelayan STUN pertama", "FactStunSecond": "Pelayan STUN kedua", "FactSystem": "Sistem", + "FactThisLine": "Pada talian ini", "FactUpload": "Muat naik", "FactUpnp": "UPnP", "FactUpstreams": "Disambungkan ke internet melalui", diff --git a/src/MeWeb.App/Strings/mt.json b/src/MeWeb.App/Strings/mt.json index 442820a..9ed31e2 100644 --- a/src/MeWeb.App/Strings/mt.json +++ b/src/MeWeb.App/Strings/mt.json @@ -135,6 +135,7 @@ "FactStunFirst": "L-ewwel server STUN", "FactStunSecond": "It-tieni server STUN", "FactSystem": "Sistema", + "FactThisLine": "Fuq din il-linja", "FactUpload": "Tlugħ", "FactUpnp": "UPnP", "FactUpstreams": "Imqabbad mal-internet permezz ta'", diff --git a/src/MeWeb.App/Strings/my.json b/src/MeWeb.App/Strings/my.json index 59896c4..8f1f7e2 100644 --- a/src/MeWeb.App/Strings/my.json +++ b/src/MeWeb.App/Strings/my.json @@ -135,6 +135,7 @@ "FactStunFirst": "ပထမ STUN ဆာဗာ", "FactStunSecond": "ဒုတိယ STUN ဆာဗာ", "FactSystem": "စနစ်", + "FactThisLine": "ဤလိုင်းတွင်", "FactUpload": "အပ်လုဒ်", "FactUpnp": "UPnP", "FactUpstreams": "အင်တာနက်သို့ ချိတ်ဆက်ရာ ကွန်ရက်များ", diff --git a/src/MeWeb.App/Strings/nb.json b/src/MeWeb.App/Strings/nb.json index 6a97b27..724b994 100644 --- a/src/MeWeb.App/Strings/nb.json +++ b/src/MeWeb.App/Strings/nb.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Andre STUN-server", "FactSystem": "System", + "FactThisLine": "På denne linjen", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Koblet til internett gjennom", diff --git a/src/MeWeb.App/Strings/nd.json b/src/MeWeb.App/Strings/nd.json index d3e62f2..93695d7 100644 --- a/src/MeWeb.App/Strings/nd.json +++ b/src/MeWeb.App/Strings/nd.json @@ -135,6 +135,7 @@ "FactStunFirst": "Iseva yokuqala ye-STUN", "FactStunSecond": "Iseva yesibili ye-STUN", "FactSystem": "Isistimu", + "FactThisLine": "Emugqeni lo", "FactUpload": "Ukuthumela", "FactUpnp": "UPnP", "FactUpstreams": "Ukuxhumana le-intanethi kudlula ku", diff --git a/src/MeWeb.App/Strings/ne.json b/src/MeWeb.App/Strings/ne.json index 2544f2c..21cb90d 100644 --- a/src/MeWeb.App/Strings/ne.json +++ b/src/MeWeb.App/Strings/ne.json @@ -135,6 +135,7 @@ "FactStunFirst": "पहिलो STUN सर्भर", "FactStunSecond": "दोस्रो STUN सर्भर", "FactSystem": "प्रणाली", + "FactThisLine": "यो लाइनमा", "FactUpload": "अपलोड", "FactUpnp": "UPnP", "FactUpstreams": "इन्टरनेटसँग जोड्ने नेटवर्कहरू", diff --git a/src/MeWeb.App/Strings/nl.json b/src/MeWeb.App/Strings/nl.json index 727daf7..654d54d 100644 --- a/src/MeWeb.App/Strings/nl.json +++ b/src/MeWeb.App/Strings/nl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Eerste STUN-server", "FactStunSecond": "Tweede STUN-server", "FactSystem": "Systeem", + "FactThisLine": "Op deze aansluiting", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Met het internet verbonden via", diff --git a/src/MeWeb.App/Strings/nn.json b/src/MeWeb.App/Strings/nn.json index 4a3f175..c9e5c55 100644 --- a/src/MeWeb.App/Strings/nn.json +++ b/src/MeWeb.App/Strings/nn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-tenar", "FactStunSecond": "Andre STUN-tenar", "FactSystem": "System", + "FactThisLine": "På denne linja", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Kopla til internett gjennom", diff --git a/src/MeWeb.App/Strings/no.json b/src/MeWeb.App/Strings/no.json index 3668759..5af0b91 100644 --- a/src/MeWeb.App/Strings/no.json +++ b/src/MeWeb.App/Strings/no.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Andre STUN-server", "FactSystem": "System", + "FactThisLine": "På denne linjen", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Koblet til internett gjennom", diff --git a/src/MeWeb.App/Strings/ny.json b/src/MeWeb.App/Strings/ny.json index 133ebbf..a4388c4 100644 --- a/src/MeWeb.App/Strings/ny.json +++ b/src/MeWeb.App/Strings/ny.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva yoyamba ya STUN", "FactStunSecond": "Seva yachiwiri ya STUN", "FactSystem": "Makina", + "FactThisLine": "Pa mzere uwu", "FactUpload": "Kukweza", "FactUpnp": "UPnP", "FactUpstreams": "Kulumikizana ndi intaneti kudzera mu", diff --git a/src/MeWeb.App/Strings/pl.json b/src/MeWeb.App/Strings/pl.json index ef6444c..b1e4985 100644 --- a/src/MeWeb.App/Strings/pl.json +++ b/src/MeWeb.App/Strings/pl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pierwszy serwer STUN", "FactStunSecond": "Drugi serwer STUN", "FactSystem": "System", + "FactThisLine": "Na tym łączu", "FactUpload": "Wysyłanie", "FactUpnp": "UPnP", "FactUpstreams": "Połączenie z internetem przez", diff --git a/src/MeWeb.App/Strings/ps.json b/src/MeWeb.App/Strings/ps.json index faca840..a6df955 100644 --- a/src/MeWeb.App/Strings/ps.json +++ b/src/MeWeb.App/Strings/ps.json @@ -135,6 +135,7 @@ "FactStunFirst": "لومړی STUN سرور", "FactStunSecond": "دویم STUN سرور", "FactSystem": "سیسټم", + "FactThisLine": "په دې لیکه کې", "FactUpload": "اپلوډ", "FactUpnp": "UPnP", "FactUpstreams": "له انټرنېټ سره د دغو شبکو له لارې نښلول شوی", diff --git a/src/MeWeb.App/Strings/pt.json b/src/MeWeb.App/Strings/pt.json index cedaf67..3727fb9 100644 --- a/src/MeWeb.App/Strings/pt.json +++ b/src/MeWeb.App/Strings/pt.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primeiro servidor STUN", "FactStunSecond": "Segundo servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "Nesta linha", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Chega à internet por meio de", diff --git a/src/MeWeb.App/Strings/qu.json b/src/MeWeb.App/Strings/qu.json index e3ae984..a8466ee 100644 --- a/src/MeWeb.App/Strings/qu.json +++ b/src/MeWeb.App/Strings/qu.json @@ -135,6 +135,7 @@ "FactStunFirst": "Ñawpaq kaq STUN servidor", "FactStunSecond": "Iskay kaq STUN servidor", "FactSystem": "Sistema", + "FactThisLine": "Kay líneapi", "FactUpload": "Wichachiy", "FactUpnp": "UPnP", "FactUpstreams": "Internetman tinkinan redkuna", diff --git a/src/MeWeb.App/Strings/rn.json b/src/MeWeb.App/Strings/rn.json index e7ee4c9..a61d69f 100644 --- a/src/MeWeb.App/Strings/rn.json +++ b/src/MeWeb.App/Strings/rn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seriveri ya mbere ya STUN", "FactStunSecond": "Seriveri ya kabiri ya STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Kuri uyu murongo", "FactUpload": "Kurungika", "FactUpnp": "UPnP", "FactUpstreams": "Ifatanijwe n'interineti biciye kuri", diff --git a/src/MeWeb.App/Strings/ro.json b/src/MeWeb.App/Strings/ro.json index 532db86..849a3b2 100644 --- a/src/MeWeb.App/Strings/ro.json +++ b/src/MeWeb.App/Strings/ro.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primul server STUN", "FactStunSecond": "Al doilea server STUN", "FactSystem": "Sistem", + "FactThisLine": "Pe această linie", "FactUpload": "Încărcare", "FactUpnp": "UPnP", "FactUpstreams": "Conectat la internet prin", diff --git a/src/MeWeb.App/Strings/ru.json b/src/MeWeb.App/Strings/ru.json index 016f5d4..c919c10 100644 --- a/src/MeWeb.App/Strings/ru.json +++ b/src/MeWeb.App/Strings/ru.json @@ -135,6 +135,7 @@ "FactStunFirst": "Первый сервер STUN", "FactStunSecond": "Второй сервер STUN", "FactSystem": "Система", + "FactThisLine": "На этой линии", "FactUpload": "Отправка", "FactUpnp": "UPnP", "FactUpstreams": "Подключение к интернету через", diff --git a/src/MeWeb.App/Strings/rw.json b/src/MeWeb.App/Strings/rw.json index eb9169d..d8d8803 100644 --- a/src/MeWeb.App/Strings/rw.json +++ b/src/MeWeb.App/Strings/rw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seriveri ya mbere ya STUN", "FactStunSecond": "Seriveri ya kabiri ya STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Kuri uyu murongo", "FactUpload": "Kohereza", "FactUpnp": "UPnP", "FactUpstreams": "Ihuzwa na murandasi binyuze kuri", diff --git a/src/MeWeb.App/Strings/sg.json b/src/MeWeb.App/Strings/sg.json index a6ce523..81e7e90 100644 --- a/src/MeWeb.App/Strings/sg.json +++ b/src/MeWeb.App/Strings/sg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur ti kôzo ti STUN", "FactStunSecond": "Serveur ti ûse ti STUN", "FactSystem": "Système", + "FactThisLine": "Na ndö ti ligne so", "FactUpload": "Tokua", "FactUpnp": "UPnP", "FactUpstreams": "A sâra connexion na internet na lêgë ti", diff --git a/src/MeWeb.App/Strings/si.json b/src/MeWeb.App/Strings/si.json index 64df035..dfda6d7 100644 --- a/src/MeWeb.App/Strings/si.json +++ b/src/MeWeb.App/Strings/si.json @@ -135,6 +135,7 @@ "FactStunFirst": "පළමු STUN සර්වරය", "FactStunSecond": "දෙවන STUN සර්වරය", "FactSystem": "පද්ධතිය", + "FactThisLine": "මෙම සම්බන්ධතාවයේ", "FactUpload": "උඩුගත කිරීම", "FactUpnp": "UPnP", "FactUpstreams": "අන්තර්ජාලයට සම්බන්ධ වන්නේ මේ හරහා", diff --git a/src/MeWeb.App/Strings/sk.json b/src/MeWeb.App/Strings/sk.json index e10fc9b..85ca121 100644 --- a/src/MeWeb.App/Strings/sk.json +++ b/src/MeWeb.App/Strings/sk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvý server STUN", "FactStunSecond": "Druhý server STUN", "FactSystem": "Systém", + "FactThisLine": "Na tejto prípojke", "FactUpload": "Odosielanie", "FactUpnp": "UPnP", "FactUpstreams": "Pripojenie k internetu cez", diff --git a/src/MeWeb.App/Strings/sl.json b/src/MeWeb.App/Strings/sl.json index 1aa4a58..2f50039 100644 --- a/src/MeWeb.App/Strings/sl.json +++ b/src/MeWeb.App/Strings/sl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi strežnik STUN", "FactStunSecond": "Drugi strežnik STUN", "FactSystem": "Sistem", + "FactThisLine": "Na tej liniji", "FactUpload": "Nalaganje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano z internetom prek", diff --git a/src/MeWeb.App/Strings/sm.json b/src/MeWeb.App/Strings/sm.json index 0b3d420..a9f1ddb 100644 --- a/src/MeWeb.App/Strings/sm.json +++ b/src/MeWeb.App/Strings/sm.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN muamua", "FactStunSecond": "Server STUN lona lua", "FactSystem": "Polokalama faʻavae", + "FactThisLine": "I lenei laina", "FactUpload": "Laʻu atu", "FactUpnp": "UPnP", "FactUpstreams": "Fesoʻotaʻi i le initaneti e ala i", diff --git a/src/MeWeb.App/Strings/sn.json b/src/MeWeb.App/Strings/sn.json index 5639dc4..e87c47e 100644 --- a/src/MeWeb.App/Strings/sn.json +++ b/src/MeWeb.App/Strings/sn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva yekutanga yeSTUN", "FactStunSecond": "Seva yechipiri yeSTUN", "FactSystem": "Sisitimu", + "FactThisLine": "Pamutsetse uyu", "FactUpload": "Kuapurodha", "FactUpnp": "UPnP", "FactUpstreams": "Netiweki dzinoibatanidza neindaneti", diff --git a/src/MeWeb.App/Strings/so.json b/src/MeWeb.App/Strings/so.json index 95ec91c..501079c 100644 --- a/src/MeWeb.App/Strings/so.json +++ b/src/MeWeb.App/Strings/so.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server-ka STUN ee koowaad", "FactStunSecond": "Server-ka STUN ee labaad", "FactSystem": "Nidaamka", + "FactThisLine": "Khadkan", "FactUpload": "Soo gelin", "FactUpnp": "UPnP", "FactUpstreams": "Ku xiran internetka iyadoo loo marayo", diff --git a/src/MeWeb.App/Strings/sq.json b/src/MeWeb.App/Strings/sq.json index 75e3dbb..3e45ccf 100644 --- a/src/MeWeb.App/Strings/sq.json +++ b/src/MeWeb.App/Strings/sq.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveri i parë STUN", "FactStunSecond": "Serveri i dytë STUN", "FactSystem": "Sistemi", + "FactThisLine": "Në këtë linjë", "FactUpload": "Ngarkimi", "FactUpnp": "UPnP", "FactUpstreams": "Lidhja me internetin përmes", diff --git a/src/MeWeb.App/Strings/sr-Latn.json b/src/MeWeb.App/Strings/sr-Latn.json index 2b33dbe..1a195cd 100644 --- a/src/MeWeb.App/Strings/sr-Latn.json +++ b/src/MeWeb.App/Strings/sr-Latn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sistem", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Otpremanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano na internet preko", diff --git a/src/MeWeb.App/Strings/sr.json b/src/MeWeb.App/Strings/sr.json index 6d45197..8ab6abd 100644 --- a/src/MeWeb.App/Strings/sr.json +++ b/src/MeWeb.App/Strings/sr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Први STUN сервер", "FactStunSecond": "Други STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На овој линији", "FactUpload": "Отпремање", "FactUpnp": "UPnP", "FactUpstreams": "Повезано са интернетом преко", diff --git a/src/MeWeb.App/Strings/ss.json b/src/MeWeb.App/Strings/ss.json index 43084ea..4bc3a71 100644 --- a/src/MeWeb.App/Strings/ss.json +++ b/src/MeWeb.App/Strings/ss.json @@ -135,6 +135,7 @@ "FactStunFirst": "Iseva yekucala ye-STUN", "FactStunSecond": "Iseva yesibili ye-STUN", "FactSystem": "Luhlelo", + "FactThisLine": "Kulomugca", "FactUpload": "Kutfumela", "FactUpnp": "UPnP", "FactUpstreams": "Tinethiwekhi letiyixhumanisa ne-inthanethi", diff --git a/src/MeWeb.App/Strings/st.json b/src/MeWeb.App/Strings/st.json index e5c42f1..f74bc37 100644 --- a/src/MeWeb.App/Strings/st.json +++ b/src/MeWeb.App/Strings/st.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya pele ya STUN", "FactStunSecond": "Seva ya bobedi ya STUN", "FactSystem": "Sistimi", + "FactThisLine": "Mohaleng ona", "FactUpload": "Ho romela", "FactUpnp": "UPnP", "FactUpstreams": "E hokahane le inthanete ka", diff --git a/src/MeWeb.App/Strings/sv.json b/src/MeWeb.App/Strings/sv.json index 26c21db..52b9a44 100644 --- a/src/MeWeb.App/Strings/sv.json +++ b/src/MeWeb.App/Strings/sv.json @@ -135,6 +135,7 @@ "FactStunFirst": "Första STUN-servern", "FactStunSecond": "Andra STUN-servern", "FactSystem": "System", + "FactThisLine": "På den här anslutningen", "FactUpload": "Uppladdning", "FactUpnp": "UPnP", "FactUpstreams": "Ansluten till internet via", diff --git a/src/MeWeb.App/Strings/sw.json b/src/MeWeb.App/Strings/sw.json index 2536b4e..f3d84fa 100644 --- a/src/MeWeb.App/Strings/sw.json +++ b/src/MeWeb.App/Strings/sw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya kwanza ya STUN", "FactStunSecond": "Seva ya pili ya STUN", "FactSystem": "Mfumo", + "FactThisLine": "Kwenye laini hii", "FactUpload": "Kupakia", "FactUpnp": "UPnP", "FactUpstreams": "Imeunganishwa na intaneti kupitia", diff --git a/src/MeWeb.App/Strings/ta.json b/src/MeWeb.App/Strings/ta.json index 1857053..9bd776f 100644 --- a/src/MeWeb.App/Strings/ta.json +++ b/src/MeWeb.App/Strings/ta.json @@ -135,6 +135,7 @@ "FactStunFirst": "முதல் STUN சர்வர்", "FactStunSecond": "இரண்டாவது STUN சர்வர்", "FactSystem": "இயக்க முறைமை", + "FactThisLine": "இந்த இணைப்பில்", "FactUpload": "பதிவேற்றம்", "FactUpnp": "UPnP", "FactUpstreams": "இணைய இணைப்பு இவற்றின் வழியாக", diff --git a/src/MeWeb.App/Strings/tet.json b/src/MeWeb.App/Strings/tet.json index 8640c29..8402cd8 100644 --- a/src/MeWeb.App/Strings/tet.json +++ b/src/MeWeb.App/Strings/tet.json @@ -135,6 +135,7 @@ "FactStunFirst": "Servidór STUN dahuluk", "FactStunSecond": "Servidór STUN daruak", "FactSystem": "Sistema", + "FactThisLine": "Iha liña ne'e", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Liga ba internet liuhusi", diff --git a/src/MeWeb.App/Strings/tg.json b/src/MeWeb.App/Strings/tg.json index dee0486..e4a8863 100644 --- a/src/MeWeb.App/Strings/tg.json +++ b/src/MeWeb.App/Strings/tg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Сервери якуми STUN", "FactStunSecond": "Сервери дуюми STUN", "FactSystem": "Система", + "FactThisLine": "Дар ин хат", "FactUpload": "Фиристодан", "FactUpnp": "UPnP", "FactUpstreams": "Ба интернет пайваст тавассути", diff --git a/src/MeWeb.App/Strings/th.json b/src/MeWeb.App/Strings/th.json index a9383ae..97702b2 100644 --- a/src/MeWeb.App/Strings/th.json +++ b/src/MeWeb.App/Strings/th.json @@ -135,6 +135,7 @@ "FactStunFirst": "เซิร์ฟเวอร์ STUN ตัวแรก", "FactStunSecond": "เซิร์ฟเวอร์ STUN ตัวที่สอง", "FactSystem": "ระบบ", + "FactThisLine": "บนสายนี้", "FactUpload": "อัปโหลด", "FactUpnp": "UPnP", "FactUpstreams": "เชื่อมต่ออินเทอร์เน็ตผ่าน", diff --git a/src/MeWeb.App/Strings/ti.json b/src/MeWeb.App/Strings/ti.json index 5f2ccc8..98038e1 100644 --- a/src/MeWeb.App/Strings/ti.json +++ b/src/MeWeb.App/Strings/ti.json @@ -135,6 +135,7 @@ "FactStunFirst": "ቀዳማይ ሰርቨር STUN", "FactStunSecond": "ካልኣይ ሰርቨር STUN", "FactSystem": "ስርዓት", + "FactThisLine": "ኣብዚ መስመር", "FactUpload": "ምልዓል", "FactUpnp": "UPnP", "FactUpstreams": "ምስ ኢንተርነት ዝራኸበሉ መርበባት", diff --git a/src/MeWeb.App/Strings/tk.json b/src/MeWeb.App/Strings/tk.json index 5e8bda1..5058c28 100644 --- a/src/MeWeb.App/Strings/tk.json +++ b/src/MeWeb.App/Strings/tk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinji STUN serweri", "FactStunSecond": "Ikinji STUN serweri", "FactSystem": "Ulgam", + "FactThisLine": "Bu liniýada", "FactUpload": "Ibermek", "FactUpnp": "UPnP", "FactUpstreams": "Internete şular arkaly birikýär", diff --git a/src/MeWeb.App/Strings/tn.json b/src/MeWeb.App/Strings/tn.json index 345275a..862789e 100644 --- a/src/MeWeb.App/Strings/tn.json +++ b/src/MeWeb.App/Strings/tn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya ntlha ya STUN", "FactStunSecond": "Seva ya bobedi ya STUN", "FactSystem": "Sisteme", + "FactThisLine": "Mo moleng o", "FactUpload": "Go tlhatlosa", "FactUpnp": "UPnP", "FactUpstreams": "Dineteweke tse di e golaganyang le inthanete", diff --git a/src/MeWeb.App/Strings/to.json b/src/MeWeb.App/Strings/to.json index 858eb9c..89568d1 100644 --- a/src/MeWeb.App/Strings/to.json +++ b/src/MeWeb.App/Strings/to.json @@ -135,6 +135,7 @@ "FactStunFirst": "ʻUluaki sēva STUN", "FactStunSecond": "Sēva STUN hono ua", "FactSystem": "Sisitemi", + "FactThisLine": "ʻI he laine ko ʻeni", "FactUpload": "Hiki atu", "FactUpnp": "UPnP", "FactUpstreams": "Fehokotaki ki he ʻinitaneti ʻo fakafou ʻi", diff --git a/src/MeWeb.App/Strings/tpi.json b/src/MeWeb.App/Strings/tpi.json index 3cd4f7c..7485501 100644 --- a/src/MeWeb.App/Strings/tpi.json +++ b/src/MeWeb.App/Strings/tpi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Namba wan seva STUN", "FactStunSecond": "Namba tu seva STUN", "FactSystem": "Sistem", + "FactThisLine": "Long dispela lain", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "I konek long intanet long rot bilong", diff --git a/src/MeWeb.App/Strings/tr.json b/src/MeWeb.App/Strings/tr.json index b32075b..38a9eba 100644 --- a/src/MeWeb.App/Strings/tr.json +++ b/src/MeWeb.App/Strings/tr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinci STUN sunucusu", "FactStunSecond": "İkinci STUN sunucusu", "FactSystem": "Sistem", + "FactThisLine": "Bu hatta", "FactUpload": "Yükleme", "FactUpnp": "UPnP", "FactUpstreams": "İnternete şu ağlar üzerinden bağlı", diff --git a/src/MeWeb.App/Strings/tvl.json b/src/MeWeb.App/Strings/tvl.json index d9145a9..bbc7ba4 100644 --- a/src/MeWeb.App/Strings/tvl.json +++ b/src/MeWeb.App/Strings/tvl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN muamua", "FactStunSecond": "Server STUN te lua", "FactSystem": "System", + "FactThisLine": "I te laina tenei", "FactUpload": "Tuku atu", "FactUpnp": "UPnP", "FactUpstreams": "E fesokotaki ki te initaneti i", diff --git a/src/MeWeb.App/Strings/tzm.json b/src/MeWeb.App/Strings/tzm.json index 5f121a8..199a13b 100644 --- a/src/MeWeb.App/Strings/tzm.json +++ b/src/MeWeb.App/Strings/tzm.json @@ -135,6 +135,7 @@ "FactStunFirst": "Aqeddac STUN amezwaru", "FactStunSecond": "Aqeddac STUN wiss sin", "FactSystem": "Anagraw", + "FactThisLine": "G tuqqna ad", "FactUpload": "Asali", "FactUpnp": "UPnP", "FactUpstreams": "Iqqen s unternit zeg", diff --git a/src/MeWeb.App/Strings/uk.json b/src/MeWeb.App/Strings/uk.json index 691575a..50b760e 100644 --- a/src/MeWeb.App/Strings/uk.json +++ b/src/MeWeb.App/Strings/uk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Перший сервер STUN", "FactStunSecond": "Другий сервер STUN", "FactSystem": "Система", + "FactThisLine": "На цій лінії", "FactUpload": "Вивантаження", "FactUpnp": "UPnP", "FactUpstreams": "Підключено до інтернету через", diff --git a/src/MeWeb.App/Strings/ur.json b/src/MeWeb.App/Strings/ur.json index 76fdd75..1d4085f 100644 --- a/src/MeWeb.App/Strings/ur.json +++ b/src/MeWeb.App/Strings/ur.json @@ -135,6 +135,7 @@ "FactStunFirst": "پہلا STUN سرور", "FactStunSecond": "دوسرا STUN سرور", "FactSystem": "سسٹم", + "FactThisLine": "اس لائن پر", "FactUpload": "اپ لوڈ", "FactUpnp": "UPnP", "FactUpstreams": "انٹرنیٹ سے جوڑنے والے نیٹ ورک", diff --git a/src/MeWeb.App/Strings/uz-Cyrl.json b/src/MeWeb.App/Strings/uz-Cyrl.json index 1ceaf05..126a812 100644 --- a/src/MeWeb.App/Strings/uz-Cyrl.json +++ b/src/MeWeb.App/Strings/uz-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринчи STUN сервери", "FactStunSecond": "Иккинчи STUN сервери", "FactSystem": "Тизим", + "FactThisLine": "Бу линияда", "FactUpload": "Юбориш", "FactUpnp": "UPnP", "FactUpstreams": "Интернетга шулар орқали уланади", diff --git a/src/MeWeb.App/Strings/uz.json b/src/MeWeb.App/Strings/uz.json index 84b9c95..6347a72 100644 --- a/src/MeWeb.App/Strings/uz.json +++ b/src/MeWeb.App/Strings/uz.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinchi STUN serveri", "FactStunSecond": "Ikkinchi STUN serveri", "FactSystem": "Tizim", + "FactThisLine": "Bu liniyada", "FactUpload": "Yuborish", "FactUpnp": "UPnP", "FactUpstreams": "Internetga shu tarmoqlar orqali ulangan", diff --git a/src/MeWeb.App/Strings/vi.json b/src/MeWeb.App/Strings/vi.json index 28c42c5..0faf7a1 100644 --- a/src/MeWeb.App/Strings/vi.json +++ b/src/MeWeb.App/Strings/vi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Máy chủ STUN thứ nhất", "FactStunSecond": "Máy chủ STUN thứ hai", "FactSystem": "Hệ thống", + "FactThisLine": "Trên đường truyền này", "FactUpload": "Tải lên", "FactUpnp": "UPnP", "FactUpstreams": "Kết nối internet qua", diff --git a/src/MeWeb.App/Strings/wni.json b/src/MeWeb.App/Strings/wni.json index bc60ff6..1b38f1b 100644 --- a/src/MeWeb.App/Strings/wni.json +++ b/src/MeWeb.App/Strings/wni.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur STUN ya mwandzo", "FactStunSecond": "Serveur STUN ya pvili", "FactSystem": "Système", + "FactThisLine": "Ha ligne iyi", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connexion ya internet ndzia ya", diff --git a/src/MeWeb.App/Strings/wo.json b/src/MeWeb.App/Strings/wo.json index dbb53d8..73625bc 100644 --- a/src/MeWeb.App/Strings/wo.json +++ b/src/MeWeb.App/Strings/wo.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serwëer STUN bu njëkk", "FactStunSecond": "Serwëer STUN bu ñaareel", "FactSystem": "Sistem", + "FactThisLine": "Ci rëdd bii", "FactUpload": "Yéege", "FactUpnp": "UPnP", "FactUpstreams": "Jokkoo ak internet jaarale ci", diff --git a/src/MeWeb.App/Strings/yo.json b/src/MeWeb.App/Strings/yo.json index 0519e0e..bf054a7 100644 --- a/src/MeWeb.App/Strings/yo.json +++ b/src/MeWeb.App/Strings/yo.json @@ -135,6 +135,7 @@ "FactStunFirst": "Sáfà STUN àkọ́kọ́", "FactStunSecond": "Sáfà STUN kejì", "FactSystem": "Sístẹ́mù", + "FactThisLine": "Lórí ìlà yìí", "FactUpload": "Ìgbéṣókè", "FactUpnp": "UPnP", "FactUpstreams": "Ó so mọ́ íntánẹ́ẹ̀tì nípasẹ̀", diff --git a/src/MeWeb.App/Strings/zdj.json b/src/MeWeb.App/Strings/zdj.json index cb20bbb..97962e0 100644 --- a/src/MeWeb.App/Strings/zdj.json +++ b/src/MeWeb.App/Strings/zdj.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur STUN ya mwandzo", "FactStunSecond": "Serveur STUN ya pvili", "FactSystem": "Système", + "FactThisLine": "Ha ligne iyi", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connecté ha internet ha ndjia ya", diff --git a/src/MeWeb.App/Strings/zh.json b/src/MeWeb.App/Strings/zh.json index 739544f..ff17c5a 100644 --- a/src/MeWeb.App/Strings/zh.json +++ b/src/MeWeb.App/Strings/zh.json @@ -135,6 +135,7 @@ "FactStunFirst": "第一个 STUN 服务器", "FactStunSecond": "第二个 STUN 服务器", "FactSystem": "系统", + "FactThisLine": "此线路上", "FactUpload": "上传", "FactUpnp": "UPnP", "FactUpstreams": "通过以下网络接入互联网", diff --git a/src/MeWeb.Core/Checks/CheckRunner.cs b/src/MeWeb.Core/Checks/CheckRunner.cs index 989109e..9f21af9 100644 --- a/src/MeWeb.Core/Checks/CheckRunner.cs +++ b/src/MeWeb.Core/Checks/CheckRunner.cs @@ -25,6 +25,7 @@ public class RunReport public DnsReport Dns { get; set; } public DeviceReport DeviceReport { get; set; } public CellularReport Cellular { get; set; } + public bool OwnNetwork { get; set; } public SpeedReport Speed { get; set; } public List Uses { get; set; } = []; public HistorySummary History { get; set; } @@ -84,12 +85,20 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(Verdicts.Online(run.Online, run.Local)); }); + var router = Step(CheckId.Router, async () => + { + await connection; + run.Router = run.Local?.Active?.Kind == LinkKind.Mobile ? new RouterReport() : await Gateway.Inspect(platform, run.Local?.GatewayV4, ct); + Settle(Verdicts.Router(run.Router, run.Local)); + }); + var addresses = Step(CheckId.Addresses, async () => { run.PublicV4 = await v4; run.PublicV6 = await v6; - await connection; - Settle(Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local)); + 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)); }); var provider = Step(CheckId.Provider, async () => @@ -102,13 +111,6 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile)); }); - var router = Step(CheckId.Router, async () => - { - await connection; - run.Router = run.Local?.Active?.Kind == LinkKind.Mobile ? new RouterReport() : await Gateway.Inspect(platform, run.Local?.GatewayV4, ct); - Settle(Verdicts.Router(run.Router, run.Local)); - }); - var nat = Step(CheckId.Nat, async () => { await Task.WhenAll(router, addresses); @@ -122,15 +124,20 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k { await connection; run.Stun = await Stun.Compare((Shared.Endpoints.SecondStunHost, Shared.Endpoints.SecondStunPort), (Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), run.Local, ct); - run.Stun.Ports = await Stun.Ports((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), 16, ct); + await addresses; + if (!run.OwnNetwork) run.Stun.Ports = await Stun.Ports((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), 16, ct); await nat; - var (low, high) = history.PortRange(run.PublicV4); - Stun.Classify(run.Stun.Ports, low, high); - Settle(Verdicts.Behaviour(run.Stun, run.Nat)); + if (run.Stun.Ports is not null) + { + var (low, high) = history.PortRange(run.PublicV4); + Stun.Classify(run.Stun.Ports, low, high); + } + Settle(Verdicts.Behaviour(run.Stun, run.Nat, run.OwnNetwork)); + if (run.Stun.Ports is null) return; _ = Task.Run(async () => { await Stun.Lifetime((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), run.Stun.Ports, [30, 120], ct); - Settle(Verdicts.Behaviour(run.Stun, run.Nat)); + Settle(Verdicts.Behaviour(run.Stun, run.Nat, run.OwnNetwork)); }, ct); }); @@ -163,6 +170,11 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(new Finding { Id = CheckId.Speed, Outcome = Outcome.Unknown, Summary = "SpeedOffline" }); return; } + if (run.OwnNetwork) + { + Settle(new Finding { Id = CheckId.Speed, Outcome = Outcome.Unknown, Summary = "ReachOwnNetwork" }); + return; + } run.Speed = await SpeedCheck.Run(https, run.Local?.Active?.Kind ?? LinkKind.Unknown, ct); Settle(Verdicts.Speed(run.Speed)); }); @@ -183,6 +195,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.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 a63d0b7..bfa63d6 100644 --- a/src/MeWeb.Core/Checks/ServerProbe.cs +++ b/src/MeWeb.Core/Checks/ServerProbe.cs @@ -127,6 +127,18 @@ public class ServerProbe(HttpClient https, HttpClient plain) } } + public static async Task ServerAddresses(CancellationToken ct) + { + try + { + return await Dns.GetHostAddressesAsync(Endpoints.Host, ct); + } + catch (Exception) when (!ct.IsCancellationRequested) + { + return []; + } + } + static async Task Resolves(string host, CancellationToken ct) { try diff --git a/src/MeWeb.Core/Checks/Verdicts.cs b/src/MeWeb.Core/Checks/Verdicts.cs index f84444e..6e51090 100644 --- a/src/MeWeb.Core/Checks/Verdicts.cs +++ b/src/MeWeb.Core/Checks/Verdicts.cs @@ -73,7 +73,7 @@ public static class Verdicts return finding; } - public static Finding Addresses(string v4, string v6, LocalSnapshot local) + public static Finding Addresses(string v4, string v6, LocalSnapshot local, RouterReport router) { var finding = new Finding { Id = CheckId.Addresses }; (finding.Outcome, finding.Summary) = (v4, v6) switch @@ -86,9 +86,7 @@ public static class Verdicts if (v4 is not null) { finding.With("FactPublicV4", v4); - var own = local.Active?.Addresses.Any(a => Net.Addresses.SameAddress(a, v4)) == true; - var shared = local.Active?.Kind == LinkKind.Mobile || Net.Addresses.Parse(local.LocalV4) is { } address && Net.Addresses.Classify(address) == AddressKind.Shared; - finding.WithKey("FactWhoHasIt", own ? "ValueOnThisDevice" : shared ? "ValueSharedProvider" : "ValueSharedAtHome"); + finding.WithKey("FactWhoHasIt", Holder(NatOf(local, router, v4))); } if (v6 is not null) { @@ -99,7 +97,7 @@ public static class Verdicts return finding; } - public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, bool anyAddress, bool mobile) + public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, bool anyAddress, bool mobile, RunReport run = null) { var finding = new Finding { Id = CheckId.Provider }; if (!anyAddress) @@ -131,9 +129,19 @@ public static class Verdicts if (upstreams.Count > 0) finding.With("FactUpstreams", string.Join("\n", upstreams.Select(u => $"{knowledge.NameOf(u) ?? "AS" + u} (AS{u})"))); if (profile is null) return finding; AddFact(finding, "FactProviderIpv4", "ProviderIpv4", profile.Ipv4); + var usual = profile.Ipv4?.Value is null ? null : Pascal(profile.Ipv4.Value); + var sharedHere = run?.Nat is NatKind.Shared or NatKind.Translated; + var ownHere = run?.Nat is NatKind.HomeRouter or NatKind.Direct or NatKind.DoubleNat; + if ((usual is "Shared" or "SharedPorts" && ownHere) || (usual is "PublicDynamic" && sharedHere)) + finding.WithKey("FactThisLine", Holder(run.Nat)); AddFact(finding, "FactProviderPublic", "ProviderPublic", profile.PublicAddress); AddFact(finding, "FactProviderIpv6", "ProviderIpv6", profile.Ipv6); AddFact(finding, "FactProviderPort25", "ProviderPort25", profile.Port25); + var port25 = profile.Port25?.Value is null ? null : Pascal(profile.Port25.Value); + if (run?.Mail?.Port25 == Core.Mail.PortState.Open && port25 is "Blocked" or "BlockedOnRequest" or "Closed") + finding.WithKey("FactThisLine", "ValuePort25Open", run.Mail.Banner ?? ""); + else if (run?.Mail?.Port25 == Core.Mail.PortState.Blocked && port25 is "Open") + finding.WithKey("FactThisLine", "ValuePort25Blocked"); if (profile.Sheet is not null) finding.Facts.Add(new Fact { Label = "FactProviderSheet", Key = "ValueOpenSheet", Link = profile.Sheet }); return finding; } @@ -192,6 +200,13 @@ public static class Verdicts return (finding, kind); } + static string Holder(NatKind nat) => nat switch + { + NatKind.Direct => "ValueOnThisDevice", + NatKind.Shared or NatKind.Translated => "ValueSharedProvider", + _ => "ValueSharedAtHome", + }; + public static NatKind NatOf(LocalSnapshot local, RouterReport router, string v4) { if (v4 is null) return NatKind.NoIpv4; @@ -212,11 +227,12 @@ public static class Verdicts }; } - public static Finding Behaviour(StunReport stun, NatKind nat) + public static Finding Behaviour(StunReport stun, NatKind nat, bool ownNetwork) { var finding = new Finding { Id = CheckId.Behaviour }; (finding.Outcome, finding.Summary) = stun.Behaviour switch { + _ when ownNetwork => (Outcome.Unknown, "ReachOwnNetwork"), NatBehaviour.None => (Outcome.Good, "BehaviourNone"), NatBehaviour.Easy => (Outcome.Good, "BehaviourEasy"), NatBehaviour.Hard => (Outcome.Caution, "BehaviourHard"), diff --git a/src/MeWeb.Core/Net/Addresses.cs b/src/MeWeb.Core/Net/Addresses.cs index a405caf..41bf945 100644 --- a/src/MeWeb.Core/Net/Addresses.cs +++ b/src/MeWeb.Core/Net/Addresses.cs @@ -36,6 +36,17 @@ public static class Addresses public static IPAddress Parse(string text) => IPAddress.TryParse(text, out var address) ? address : null; + public static bool SameNetwork(IEnumerable server, string v4, string v6) + { + foreach (var address in server) + { + if (address.AddressFamily == AddressFamily.InterNetwork && SameAddress(address.ToString(), v4)) return true; + if (address.AddressFamily != AddressFamily.InterNetworkV6 || Parse(v6) is not { } mine) continue; + if (address.GetAddressBytes().AsSpan(0, 6).SequenceEqual(mine.GetAddressBytes().AsSpan(0, 6))) return true; + } + return false; + } + public static bool SameAddress(string left, string right) { var a = Parse(left);