5 Commits

Author SHA1 Message Date
a8f46113d4 build: Update project version 2025-06-06 19:33:15 +08:00
99736f114d style: Code cleanup 2025-06-06 19:32:42 +08:00
4d1a008106 feat: Add logs 2025-06-06 19:32:31 +08:00
9318cbca4e feat: Add new event sources 2025-06-06 19:31:27 +08:00
a162f345c4 ci: Update plugins 2025-06-06 19:30:21 +08:00
91 changed files with 913 additions and 51 deletions

View File

@@ -1,19 +1,60 @@
using Cryville.Common.Font;
using Cryville.Common.Logging;
using Cryville.Common.Unity.UI;
using Cryville.Culture;
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using UnityEngine;
using Logger = Cryville.Common.Logging.Logger;
namespace Cryville.EEW.Unity {
class App {
public static string AppDataPath { get; private set; }
public static Logger MainLogger { get; private set; }
static FileStream _logFileStream;
static StreamLoggerListener _logWriter;
static bool _init;
public static void Init() {
if (_init) return;
_init = true;
AppDataPath = Application.persistentDataPath;
var logPath = Directory.CreateDirectory(Path.Combine(AppDataPath, "logs"));
_logFileStream = new FileStream(
Path.Combine(
logPath.FullName,
string.Format(
CultureInfo.InvariantCulture,
"{0}.log",
DateTimeOffset.UtcNow.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture)
)
),
FileMode.Create, FileAccess.Write, FileShare.Read
);
_logWriter = new StreamLoggerListener(_logFileStream) { AutoFlush = true };
MainLogger = new Logger();
var listener = new InstantLoggerListener();
listener.Log += MainLogger.Log;
MainLogger.AddListener(_logWriter);
Application.logMessageReceivedThreaded += OnInternalLog;
MainLogger.Log(1, "App", null, "App Version: {0}", Application.version);
MainLogger.Log(1, "App", null, "Unity Version: {0}", Application.unityVersion);
MainLogger.Log(1, "App", null, "Operating System: {0}, Unity = {1}, Family = {2}", Environment.OSVersion, SystemInfo.operatingSystem, SystemInfo.operatingSystemFamily);
MainLogger.Log(1, "App", null, "Platform: Build = {0}, Unity = {1}", PlatformConfig.Name, Application.platform);
MainLogger.Log(1, "App", null, "Culture: {0}, UI = {1}, Unity = {2}", SharedCultures.CurrentCulture, SharedCultures.CurrentUICulture, Application.systemLanguage);
MainLogger.Log(1, "App", null, "Device: Model = {0}, Type = {1}", SystemInfo.deviceModel, SystemInfo.deviceType);
MainLogger.Log(1, "App", null, "Graphics: Name = {0}, Type = {1}, Vendor = {2}, Version = {3}", SystemInfo.graphicsDeviceName, SystemInfo.graphicsDeviceType, SystemInfo.graphicsDeviceVendor, SystemInfo.graphicsDeviceVersion);
MainLogger.Log(1, "App", null, "Processor: Count = {0}, Frequency = {1}MHz, Type = {2}", SystemInfo.processorCount, SystemInfo.processorFrequency, SystemInfo.processorType);
MainLogger.Log(1, "App", null, "Initializing font manager");
foreach (var res in Resources.LoadAll<TextAsset>("cldr/common/validity")) {
IdValidity.Load(LoadXmlDocument(res));
}
@@ -25,7 +66,10 @@ namespace Cryville.EEW.Unity {
};
TMPLocalizedText.DefaultShader = Resources.Load<Shader>(PlatformConfig.TextShader);
MainLogger.Log(1, "App", null, "Loading config");
SharedSettings.Instance.Init();
MainLogger.Log(1, "App", null, "Initialized");
}
static readonly Encoding _encoding = new UTF8Encoding(false, true);
@@ -40,5 +84,16 @@ namespace Cryville.EEW.Unity {
using var reader = XmlReader.Create(stream, _xmlSettings);
return XDocument.Load(reader);
}
static void OnInternalLog(string condition, string stackTrace, LogType type) {
var l = type switch {
LogType.Log => 1,
LogType.Assert => 2,
LogType.Warning => 3,
LogType.Error or LogType.Exception => 4,
_ => 1,
};
MainLogger.Log(l, "Internal", null, "{0}\n{1}", condition, stackTrace);
}
}
}

View File

@@ -1,3 +1,3 @@
using System.Reflection;
[assembly: AssemblyVersion("0.0.6")]
[assembly: AssemblyVersion("0.0.7")]

View File

@@ -55,6 +55,7 @@ namespace Cryville.EEW.Unity {
[JsonDerivedType(typeof(BMKGOpenDataEventSourceConfig), "BMKGOpenData")]
[JsonDerivedType(typeof(CWAOpenDataEventSourceConfig), "CWAOpenData")]
[JsonDerivedType(typeof(EMSCRealTimeEventSourceConfig), "EMSCRealTime")]
[JsonDerivedType(typeof(GeoNetEventSourceConfig), "GeoNet")]
[JsonDerivedType(typeof(GlobalQuakeServerEventSourceConfig), "GlobalQuakeServer")]
[JsonDerivedType(typeof(GlobalQuakeServer15EventSourceConfig), "GlobalQuakeServer15")]
[JsonDerivedType(typeof(JMAAtomEventSourceConfig), "JMAAtom")]
@@ -66,6 +67,7 @@ namespace Cryville.EEW.Unity {
record BMKGOpenDataEventSourceConfig([property: JsonRequired] string[] Subtypes) : EventSourceConfig;
record CWAOpenDataEventSourceConfig([property: JsonRequired] string Subtype, [property: JsonRequired] string Token) : EventSourceConfig;
record EMSCRealTimeEventSourceConfig() : EventSourceConfig;
record GeoNetEventSourceConfig(int MinimumMMI = 3, bool DoGetFullHistory = false, bool DoGetStrongMotionInfo = true) : EventSourceConfig;
record GlobalQuakeServerEventSourceConfig([property: JsonRequired] string Host, int Port = 38000) : EventSourceConfig;
record GlobalQuakeServer15EventSourceConfig(string Host, int Port = 38000) : GlobalQuakeServerEventSourceConfig(Host, Port);
record JMAAtomEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false) : EventSourceConfig;

View File

@@ -2,6 +2,7 @@ using Cryville.EEW.BMKGOpenData.Map;
using Cryville.EEW.Core;
using Cryville.EEW.CWAOpenData.Map;
using Cryville.EEW.EMSC.Map;
using Cryville.EEW.GeoNet.Map;
using Cryville.EEW.GlobalQuake.Map;
using Cryville.EEW.JMAAtom.Map;
using Cryville.EEW.Map;
@@ -135,6 +136,9 @@ namespace Cryville.EEW.Unity.Map {
new CWATsunamiMapGenerator(),
new EMSCRealTimeEventMapGenerator(),
new FujianEEWMapGenerator(),
new GeoNetQuakeHistoryMapGenerator(),
new GeoNetQuakeMapGenerator(),
new GeoNetStrongMapGenerator(),
new GlobalQuakeMapViewGenerator(),
new JMAAtomMapGenerator(),
new JMAEEWMapGenerator(),

View File

@@ -40,7 +40,7 @@ namespace Cryville.EEW.Unity.Map {
_req.SendWebRequest();
}
catch (Exception ex) {
Debug.LogException(ex);
App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, ex);
}
_isReady = false;
}
@@ -51,7 +51,7 @@ namespace Cryville.EEW.Unity.Map {
_sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height, 0, SpriteMeshType.FullRect, Vector4.zero, false);
}
else {
Debug.LogError(_texHandler.error);
App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, _texHandler.error);
_localFile.Delete();
}
_req.Dispose();

View File

@@ -13,6 +13,7 @@ namespace Cryville.EEW.Unity {
};
protected override Stream Open(string path) {
App.MainLogger.Log(0, "Audio", null, "Opening audio file {0}", path);
path = Path.Combine(Application.streamingAssetsPath, "Sounds", path + ".ogg");
if (!File.Exists(path)) return null;
return new FileStream(path, FileMode.Open, FileAccess.Read);

View File

@@ -9,6 +9,7 @@ namespace Cryville.EEW.Unity {
readonly ISpVoice _voice;
public TTSWorker() : base(CreateSoundPlayer()) {
App.MainLogger.Log(1, "Audio", null, "Initializing TTS worker");
try {
_voice = new SpVoiceClass();
}
@@ -16,10 +17,12 @@ namespace Cryville.EEW.Unity {
}
static SoundPlayer CreateSoundPlayer() {
App.MainLogger.Log(1, "Audio", null, "Creating sound player");
try {
return new SoundPlayer();
}
catch (InvalidOperationException) {
catch (InvalidOperationException ex) {
App.MainLogger.Log(3, "Audio", null, "An error occurred when creating sound player: {0}", ex);
return null;
}
}
@@ -37,11 +40,13 @@ namespace Cryville.EEW.Unity {
(uint)(SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak),
out _
);
App.MainLogger.Log(0, "Audio", null, "TTS ({0}): {1}", culture, content);
return Task.CompletedTask;
}
protected override void StopCurrent() {
if (_voice == null) return;
App.MainLogger.Log(0, "Audio", null, "TTS stopping current");
_voice.Skip("SENTENCE", int.MaxValue, out _);
}
}

View File

@@ -5,6 +5,8 @@ using Cryville.EEW.CWAOpenData;
using Cryville.EEW.CWAOpenData.Model;
using Cryville.EEW.CWAOpenData.TTS;
using Cryville.EEW.EMSC;
using Cryville.EEW.GeoNet;
using Cryville.EEW.GeoNet.TTS;
using Cryville.EEW.GlobalQuake;
using Cryville.EEW.JMAAtom;
using Cryville.EEW.JMAAtom.TTS;
@@ -58,6 +60,7 @@ namespace Cryville.EEW.Unity {
}
void Start() {
App.MainLogger.Log(1, "App", null, "Initializing localized resources manager");
LocalizedResources.Init(new LocalizedResourcesManager());
RegisterViewModelGenerators(_worker);
RegisterTTSMessageGenerators(_worker);
@@ -71,6 +74,7 @@ namespace Cryville.EEW.Unity {
_worker.Reported += OnReported;
_grouper.GroupUpdated += OnGroupUpdated;
_grouper.GroupRemoved += OnGroupRemoved;
App.MainLogger.Log(1, "App", null, "Worker ready");
Task.Run(() => GatewayVerify(_cancellationTokenSource.Token)).ContinueWith(task => {
if (task.IsFaulted) {
OnReported(this, new() { Title = task.Exception.Message });
@@ -100,6 +104,9 @@ namespace Cryville.EEW.Unity {
worker.RegisterViewModelGenerator(new CWATsunamiRVMGenerator());
worker.RegisterViewModelGenerator(new EMSCRealTimeEventRVMGenerator());
worker.RegisterViewModelGenerator(new FujianEEWRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetQuakeHistoryRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetQuakeRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetStrongRVMGenerator());
worker.RegisterViewModelGenerator(new GlobalQuakeRVMGenerator());
worker.RegisterViewModelGenerator(new JMAAtomRVMGenerator());
worker.RegisterViewModelGenerator(new JMAEEWRVMGenerator());
@@ -117,6 +124,9 @@ namespace Cryville.EEW.Unity {
worker.RegisterTTSMessageGenerator(new CWAEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new CWATsunamiTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new FujianEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetQuakeHistoryTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetQuakeTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetStrongTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new JMAAtomTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new JMAEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new NOAATTSMessageGenerator());
@@ -125,6 +135,7 @@ namespace Cryville.EEW.Unity {
bool _verified;
void BuildWorkers() {
App.MainLogger.Log(1, "App", null, "Building workers");
#if UNITY_EDITOR
_worker.AddWorker(new WolfxWorker(new Uri("ws://localhost:9995/wolfx")));
_worker.AddWorker(new JMAAtomWorker(new Uri("http://localhost:9095/eqvol.xml")));
@@ -139,25 +150,26 @@ namespace Cryville.EEW.Unity {
#else
foreach (var source in SharedSettings.Instance.EventSources) {
_worker.AddWorker(source switch {
BMKGOpenDataEventSourceConfig bmkgOpenData => BuildBMKGOpenDataWorkerUris(new BMKGOpenDataWorker(new("https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json")), bmkgOpenData),
BMKGOpenDataEventSourceConfig bmkgOpenData => BuildBMKGOpenDataWorkerUris(new(new("https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json")), bmkgOpenData),
CWAOpenDataEventSourceConfig cwaOpenData => cwaOpenData.Subtype switch {
"E-A0014-001" => new CWAReportWorker<Tsunami>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0014-001"), cwaOpenData.Token, 1440, 17280),
"E-A0015-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001"), cwaOpenData.Token),
"E-A0016-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001"), cwaOpenData.Token),
"E-A0014-001" => new CWAReportWorker<Tsunami>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0014-001"), cwaOpenData.Token, 1440, 17280),
"E-A0015-001" => new CWAReportWorker<Earthquake>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001"), cwaOpenData.Token),
"E-A0016-001" => new CWAReportWorker<Earthquake>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001"), cwaOpenData.Token),
_ => throw new InvalidOperationException("Unknown CWA open data sub-type."),
},
EMSCRealTimeEventSourceConfig => new EMSCRealTimeWorker(new("wss://www.seismicportal.eu/standing_order/websocket")),
GeoNetEventSourceConfig geoNet => BuildGeoNetWorker(new(new("https://api.geonet.org.nz/quake"), new("https://api.geonet.org.nz/quake/history/index"), new("https://api.geonet.org.nz/intensity/strong/processed/index")), geoNet),
GlobalQuakeServer15EventSourceConfig gq => new GlobalQuakeWorker15(gq.Host, gq.Port),
GlobalQuakeServerEventSourceConfig gq => new GlobalQuakeWorker(gq.Host, gq.Port),
JMAAtomEventSourceConfig jmaAtom => BuildJMAAtomWorkerFilter(new JMAAtomWorker(new("https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml")), jmaAtom),
JMAAtomEventSourceConfig jmaAtom => BuildJMAAtomWorkerFilter(new(new("https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml")), jmaAtom),
NOAAEventSourceConfig noaaAtom => noaaAtom.Subtype switch {
"PAAQ" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PAAQAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PAAQ"),
"PHEB" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PHEBAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PHEB"),
_ => throw new InvalidOperationException("Unknown NOAA sub-type."),
},
UpdateCheckerEventSourceConfig => new UpdateCheckerWorker(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"),
USGSQuakeMLEventSourceConfig usgsQuakeML => BuildUSGSQuakeMLWorkerUri(new USGSQuakeMLWorker(new Uri("https://earthquake.usgs.gov/earthquakes/feed/v1.0/quakeml.php")), usgsQuakeML),
WolfxEventSourceConfig wolfx => BuildWolfxWorkerFilter(new WolfxWorker(new Uri("wss://ws-api.wolfx.jp/all_eew")), wolfx),
USGSQuakeMLEventSourceConfig usgsQuakeML => BuildUSGSQuakeMLWorkerUri(new USGSQuakeMLWorker(new("https://earthquake.usgs.gov/earthquakes/feed/v1.0/quakeml.php")), usgsQuakeML),
WolfxEventSourceConfig wolfx => BuildWolfxWorkerFilter(new WolfxWorker(new("wss://ws-api.wolfx.jp/all_eew")), wolfx),
_ => throw new InvalidOperationException("Unknown event source type."),
});
}
@@ -190,6 +202,12 @@ namespace Cryville.EEW.Unity {
worker.SetDataUris(config.Subtypes.Select(i => new Uri(string.Format(CultureInfo.InvariantCulture, "https://data.bmkg.go.id/DataMKG/TEWS/{0}.json", i))));
return worker;
}
static GeoNetWorker BuildGeoNetWorker(GeoNetWorker worker, GeoNetEventSourceConfig pref) {
worker.MinimumMMI = pref.MinimumMMI;
worker.DoGetFullHistory = pref.DoGetFullHistory;
worker.DoGetStrongMotionInfo = pref.DoGetStrongMotionInfo;
return worker;
}
static USGSQuakeMLWorker BuildUSGSQuakeMLWorkerUri(USGSQuakeMLWorker worker, USGSQuakeMLEventSourceConfig config) {
worker.SetFeedRelativeUri(new(string.Format(CultureInfo.InvariantCulture, "/earthquakes/feed/v1.0/summary/{0}.quakeml", config.Subtype), UriKind.Relative));
return worker;
@@ -200,7 +218,7 @@ namespace Cryville.EEW.Unity {
ReportViewModel _latestHistoryReport;
void OnReported(object sender, ReportViewModel e) {
if (e.Model is Exception && e.Model is not SourceWorkerNetworkException)
Debug.LogError(e);
App.MainLogger.Log(4, "Map", null, "Received an error from {0}: {1}", sender.GetType(), e.Model);
_grouper.Report(e);
_ongoingReportManager.Report(e);
_uiActionQueue.Enqueue(() => {

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 7aa0c56ccfdaf9443b58f26bf40eed01
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,185 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Cryville.Common.Logging</name>
</assembly>
<members>
<member name="T:Cryville.Common.Logging.Logger">
<summary>
A logger.
</summary>
</member>
<member name="M:Cryville.Common.Logging.Logger.AddListener(Cryville.Common.Logging.LoggerListener)">
<summary>
Attaches a listener to the logger.
</summary>
<param name="listener">The logger listener.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.RemoveListener(Cryville.Common.Logging.LoggerListener)">
<summary>
Detaches a listener from the logger.
</summary>
<param name="listener">The logger listener.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.String,System.Object[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="format">The format string.</param>
<param name="args">The arguments for formatting.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.IFormatProvider,System.String,System.Object[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="provider">The format provider.</param>
<param name="format">The format string.</param>
<param name="args">The arguments for formatting.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.String)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char[],System.Int32,System.Int32)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
<param name="index">A zero-based index of the first character of the message within <paramref name="message" />.</param>
<param name="length">The length of the message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char*,System.Int32)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">A pointer to the first character of the message.</param>
<param name="length">The length of the message.</param>
</member>
<member name="T:Cryville.Common.Logging.LoggerListener">
<summary>
A logger listener.
</summary>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.Dispose(System.Boolean)">
<summary>
Closes the logger listener and cleans up all the resources.
</summary>
<param name="disposing">Whether to clean up managed resources.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.Dispose">
<summary>
Closes the logger listener.
</summary>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.String)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.Char[],System.Int32,System.Int32)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
<param name="index">A zero-based index of the first character of the message within <paramref name="message" />.</param>
<param name="length">The length of the message.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.Char*,System.Int32)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">A pointer to the first character of the message.</param>
<param name="length">The length of the message.</param>
</member>
<member name="T:Cryville.Common.Logging.InstantLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that calls a callback function on log.
</summary>
</member>
<member name="E:Cryville.Common.Logging.InstantLoggerListener.Log">
<summary>
Occurs when a log is logged to the logger.
</summary>
</member>
<member name="M:Cryville.Common.Logging.InstantLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="T:Cryville.Common.Logging.BufferedLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that buffers the logs for enumeration.
</summary>
</member>
<member name="M:Cryville.Common.Logging.BufferedLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="M:Cryville.Common.Logging.BufferedLoggerListener.Enumerate(Cryville.Common.Logging.LogHandler)">
<summary>
Enumerates the buffered logs.
</summary>
<param name="callback">The callback function to receive the logs.</param>
</member>
<member name="T:Cryville.Common.Logging.StreamLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that writes logs into a stream.
</summary>
<param name="stream">The stream.</param>
<param name="encoding">The encoding.</param>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.#ctor(System.IO.Stream,System.Text.Encoding)">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that writes logs into a stream.
</summary>
<param name="stream">The stream.</param>
<param name="encoding">The encoding.</param>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.#ctor(System.IO.Stream)">
<summary>
Creates an instance of the <see cref="T:Cryville.Common.Logging.StreamLoggerListener" /> class.
</summary>
<param name="stream">The stream.</param>
</member>
<member name="P:Cryville.Common.Logging.StreamLoggerListener.AutoFlush">
<summary>
Whether to flush the stream every time a log is written.
</summary>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="T:Cryville.Common.Logging.LogHandler">
<summary>
Represents the method that will handle a log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
</members>
</doc>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 72ded0675457e0348809193a9c1092b5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 9add703a85e306e41a5f1f424b9e5980
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 1fa7d6d104052f447b49fc53f65d55cd
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 590f9955e3e1e36458e2f7b807a05188
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -76,6 +76,20 @@
The shared instance of the <see cref="T:Cryville.EEW.Heartbeat" /> class.
</summary>
</member>
<member name="T:Cryville.EEW.HttpExtensions">
<summary>
Provides a set of <see langword="static" /> methods related to HTTP.
</summary>
</member>
<member name="M:Cryville.EEW.HttpExtensions.EnsureNonErrorStatusCode(System.Net.Http.HttpResponseMessage)">
<summary>
Throws an exception if the HTTP response has a client error status code (400~499) or a server error status code (500~599).
</summary>
<param name="response">The response message.</param>
<returns>The response message if there is no error.</returns>
<exception cref="T:System.InvalidOperationException">The response has a client error status code (400~499).</exception>
<exception cref="T:System.Net.Http.HttpRequestException">The response has a server error status code (500~599).</exception>
</member>
<member name="T:Cryville.EEW.HttpPullWorker">
<summary>
A source worker that pulls events with HTTP GET requests.
@@ -117,6 +131,34 @@
<returns>The task.</returns>
<exception cref="T:System.InvalidOperationException">The server responses with an unhandled status code.</exception>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.HandleRawResponse(System.Net.Http.HttpResponseMessage,System.Threading.CancellationToken)">
<summary>
Handles a raw response message.
</summary>
<param name="response">The response message.</param>
<param name="cancellationToken">A cancellation token.</param>
<returns>A task.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.TryGetAsync(System.Uri,System.Threading.CancellationToken,System.Boolean,System.Int32)">
<summary>
Try to send a GET request to the specified URI.
</summary>
<param name="uri">The URI.</param>
<param name="cancellationToken">The cancellation token.</param>
<param name="retryOnErrorStatusCode">Whether to retry if the server responses with an error status code.</param>
<param name="retries">Times to retry before the request fails.</param>
<returns>The response message, or <see langword="null" /> if the request fails.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.TrySendAsync(System.Func{System.Net.Http.HttpRequestMessage},System.Threading.CancellationToken,System.Boolean,System.Int32)">
<summary>
Try to send a request to the specified URI.
</summary>
<param name="msgFactory">A function that creates the request message.</param>
<param name="cancellationToken">The cancellation token.</param>
<param name="retryOnErrorStatusCode">Whether to retry if the server responses with an error status code.</param>
<param name="retries">Times to retry before the request fails.</param>
<returns>The response message, or <see langword="null" /> if the request fails.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.GetUri">
<summary>
Gets the URI of the next request, usually based on <see cref="P:Cryville.EEW.HttpPullWorker.BaseUri" />.
@@ -128,7 +170,7 @@
</member>
<member name="M:Cryville.EEW.HttpPullWorker.AfterHandled(System.Threading.CancellationToken)">
<summary>
Called when a response is handled successfully, or when the server reponses with No Content (204) or Not Modified (304).
Called when a response is handled successfully, or when the server responses with a non-error status code (100~399).
</summary>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.Handle(System.IO.Stream,System.Net.Http.Headers.HttpResponseHeaders,System.Threading.CancellationToken)">
@@ -549,6 +591,61 @@
<member name="P:Cryville.EEW.Models.GeoJSON.Feature.Properties">
<summary>The properties of the feature.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.Feature`1">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
<param name="Id">A JSON string or number representing the commonly used identifier of the feature.</param>
<param name="Geometry">The geometry of the feature.</param>
<param name="Properties">The properties of the feature.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.Feature`1.#ctor(System.Text.Json.JsonElement,Cryville.EEW.Models.GeoJSON.Geometry,`0,System.Double[])">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
<param name="Id">A JSON string or number representing the commonly used identifier of the feature.</param>
<param name="Geometry">The geometry of the feature.</param>
<param name="Properties">The properties of the feature.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Id">
<summary>A JSON string or number representing the commonly used identifier of the feature.</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Geometry">
<summary>The geometry of the feature.</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Properties">
<summary>The properties of the feature.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.IFeature`1">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Id">
<summary>
A JSON string or number representing the commonly used identifier of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Geometry">
<summary>
The geometry of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Properties">
<summary>
The properties of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.BoundingBox">
<summary>
The bounding box.
</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.FeatureCollection">
<summary>
Represents a feature collection.
@@ -566,6 +663,25 @@
<member name="P:Cryville.EEW.Models.GeoJSON.FeatureCollection.Features">
<summary>The features.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.FeatureCollection`1">
<summary>
Represents a feature collection.
</summary>
<typeparam name="T">The type of the properties of the features.</typeparam>
<param name="Features">The features.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.FeatureCollection`1.#ctor(Cryville.EEW.Models.GeoJSON.Feature{`0}[],System.Double[])">
<summary>
Represents a feature collection.
</summary>
<typeparam name="T">The type of the properties of the features.</typeparam>
<param name="Features">The features.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.FeatureCollection`1.Features">
<summary>The features.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.GeoJSONObject">
<summary>
A Geometry, Feature, or collection of Features.
@@ -983,6 +1099,37 @@
<member name="M:Cryville.EEW.NonstandardDateTimeJsonConverter.Write(System.Text.Json.Utf8JsonWriter,System.DateTime,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Cryville.EEW.ProgressiveDelay">
<summary>
A helper class that produces progressive delay.
</summary>
</member>
<member name="P:Cryville.EEW.ProgressiveDelay.CurrentDelay">
<summary>
The delay to next tick.
</summary>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.#ctor(System.Double,System.Double,System.Double)">
<summary>
Creates an instance of the <see cref="T:Cryville.EEW.ProgressiveDelay" /> class.
</summary>
<param name="baseDelay">The minimum delay.</param>
<param name="maxDelay">The maximum delay.</param>
<param name="delayMultiplier">The multiplier between adjacent delay values.</param>
<exception cref="T:System.ArgumentOutOfRangeException"><paramref name="baseDelay" /> is negative or zero. -or- <paramref name="maxDelay" /> is negative or zero. -or- <paramref name="delayMultiplier" /> is less than or equal to 1.</exception>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.Step(System.Double)">
<summary>
Decrements the current delay and ticks if the delay has run over.
</summary>
<param name="amount">The amount of delay to decrement.</param>
<returns>Whether to tick.</returns>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.Reset">
<summary>
Resets to the base delay.
</summary>
</member>
<member name="T:Cryville.EEW.Report.EmptyRVMGeneratorContext">
<summary>
An empty <see cref="T:Cryville.EEW.Report.IRVMGeneratorContext" />.
@@ -1018,7 +1165,7 @@
</summary>
<param name="Latitude">The latitude of the hypocenter.</param>
<param name="Longitude">The longitude of the hypocenter.</param>
<param name="DateTime">The origin date time.</param>
<param name="DateTime">The origin date time in UTC.</param>
<param name="Magnitude">The magnitude.</param>
</member>
<member name="M:Cryville.EEW.Report.HypocenterGroupKey.#ctor(System.Double,System.Double,System.DateTime,System.Double)">
@@ -1027,7 +1174,7 @@
</summary>
<param name="Latitude">The latitude of the hypocenter.</param>
<param name="Longitude">The longitude of the hypocenter.</param>
<param name="DateTime">The origin date time.</param>
<param name="DateTime">The origin date time in UTC.</param>
<param name="Magnitude">The magnitude.</param>
</member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.Latitude">
@@ -1037,7 +1184,7 @@
<summary>The longitude of the hypocenter.</summary>
</member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.DateTime">
<summary>The origin date time.</summary>
<summary>The origin date time in UTC.</summary>
</member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.Magnitude">
<summary>The magnitude.</summary>
@@ -1317,11 +1464,6 @@
<see cref="P:Cryville.EEW.Report.ReportViewModel.InvalidatedTime" /> converted to UTC.
</summary>
</member>
<member name="P:Cryville.EEW.Report.ReportViewModel.IssueTime">
<summary>
The time when the report is issued, in the time zone indicated by <see cref="P:Cryville.EEW.Report.ReportViewModel.TimeZone" />.
</summary>
</member>
<member name="P:Cryville.EEW.Report.ReportViewModel.UtcIssueTime">
<summary>
The time when the report is issued, in UTC.
@@ -1445,14 +1587,6 @@
The parent type.
</summary>
</member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.#ctor(System.String,Cryville.EEW.Report.ReportViewModelPropertyType)">
<summary>
Creates an instance of the <see cref="T:Cryville.EEW.Report.ReportViewModelPropertyType" /> class.
</summary>
<param name="name">The name of the type.</param>
<param name="parent">The parent type.</param>
<exception cref="T:System.ArgumentException"><paramref name="name" /> contains the sub-type delimiter <c>:</c>.</exception>
</member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.OfSubtype(System.String)">
<summary>
Creates a sub-type from this type.
@@ -1463,6 +1597,14 @@
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.ToString">
<inheritdoc/>
</member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.Of(System.String,Cryville.EEW.Report.ReportViewModelPropertyType)">
<summary>
Gets an instance of the <see cref="T:Cryville.EEW.Report.ReportViewModelPropertyType" /> class.
</summary>
<param name="name">The name of the type.</param>
<param name="parent">The parent type.</param>
<exception cref="T:System.ArgumentException"><paramref name="name" /> contains the sub-type delimiter <c>:</c>.</exception>
</member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.FromString(System.String)">
<summary>
Creates a report view model property type from a string.

View File

@@ -2,6 +2,7 @@
"Culture": "en-US",
"Strings": {
"AuthorityName": "CWA",
"ErrorUnauthorized": "Authorization token is invalid.",
"PropertyDepth": "Depth",
"PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "Max intensity",

View File

@@ -2,6 +2,7 @@
"Culture": "zh-TW",
"Strings": {
"AuthorityName": "CWA",
"ErrorUnauthorized": "授權碼無效。",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度",

View File

@@ -2,6 +2,7 @@
"Culture": "yue-HK",
"Strings": {
"AuthorityName": "CWA",
"ErrorUnauthorized": "授權碼無效。",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度",

View File

@@ -2,6 +2,7 @@
"Culture": "zh-CN",
"Strings": {
"AuthorityName": "CWA",
"ErrorUnauthorized": "授权码无效。",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度",

View File

@@ -1,5 +1,5 @@
{
"Culture": "en-US",
"Culture": "en-GB",
"Strings": {
"AuthorityName": "EMSC",
"AuthorityNameForwarded": "EMSC | {0}",

View File

@@ -642,7 +642,7 @@
"674": "聖勞倫斯島",
"675": "波弗特海",
"676": "阿拉斯加北部",
"677": "加拿大育空地區北部",
"677": "育空地區北部",
"678": "伊利沙伯女皇群島",
"679": "西北地區—努拿烏特地區",
"68": "恰帕斯近海",

View File

@@ -642,7 +642,7 @@
"674": "聖勞倫斯島",
"675": "波弗特海",
"676": "阿拉斯加北部",
"677": "加拿大育空地區北部",
"677": "育空地區北部",
"678": "伊莉莎白女王群島",
"679": "西北地區—努納福特地區",
"68": "恰帕斯近海",

View File

@@ -642,7 +642,7 @@
"674": "圣劳伦斯岛",
"675": "波弗特海",
"676": "阿拉斯加北部",
"677": "加拿大育空地区北部",
"677": "育空地区北部",
"678": "伊丽莎白女王群岛",
"679": "西北地区—努纳武特地区",
"68": "恰帕斯近海",

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a68851283bf763f498b6efc1e7fd7d3e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "en-NZ",
"Strings": {
"BodyQuake": "Quake information. At {0}, a magnitude {1} earthquake occurred in {2}. Hypocenter depth {3} kilometers.",
"BodyQuakeDeleted": "A previously reported quake has been deleted.",
"BodyStrong": "Strong motion information. A magnitude {0} earthquake occurred in {1}. Hypocenter depth {2} kilometers. Max measured intensity {3}.",
"MaxIntensity": " Max intensity {0}.",
"TitleQuake": "Quake information",
"TitleStrong": "Strong motion information"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7dda4437bc429f946a3606eb5182c26a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "yue-HK",
"Strings": {
"BodyQuake": "地震資訊。{0}{2}發生震級{1}級地震。震源深度{3}公里。",
"BodyQuakeDeleted": "頭先發佈嘅一條地震資訊已被刪除。",
"BodyStrong": "強震動資訊。{1}發生震級{0}級地震。震源深度{2}公里。最大儀器烈度{3}。",
"MaxIntensity": "最大烈度{0}。",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 22fbb2e4ace53904689d749d9121f63f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "zh-TW",
"Strings": {
"BodyQuake": "地震資訊。{0}{2}發生規模{1}級地震。震源深度{3}公里。",
"BodyQuakeDeleted": "先前發佈的一條地震資訊已被刪除。",
"BodyStrong": "強震動資訊。{1}發生規模{0}級地震。震源深度{2}公里。最大計測震度{3}。",
"MaxIntensity": "最大震度{0}。",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bc25877491739c64f9796c1c10f00291
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "zh-CN",
"Strings": {
"BodyQuake": "地震信息。{0}{2}发生震级{1}级地震。震源深度{3}千米。",
"BodyQuakeDeleted": "先前发布的一条地震信息已被删除。",
"BodyStrong": "强震动信息。{1}发生震级{0}级地震。震源深度{2}千米。最大仪器烈度{3}。",
"MaxIntensity": "最大烈度{0}。",
"TitleQuake": "地震信息",
"TitleStrong": "强震动信息"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 15d5046e9e6258d4eb6f6290681de662
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5d5f90e1fe276574da03cf1e5722e915
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "en-NZ",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "Depth",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "Max intensity",
"SourceName": "GeoNet",
"TitleQuake": "Quake information",
"TitleStrong": "Strong motion information"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "Unknown",
"best": "Best",
"preliminary": "Preliminary",
"automatic": "Automatic",
"deleted": "Deleted"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ca2c1d5bc70b5ed49948d18a239b95b5
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "yue-HK",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大烈度",
"SourceName": "GeoNet",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精確",
"preliminary": "速報",
"automatic": "自動",
"deleted": "刪除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3cabe2d850c5b2c4c987036edefbdf1d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "zh-TW",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大震度",
"SourceName": "GeoNet",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精確",
"preliminary": "速報",
"automatic": "自動",
"deleted": "刪除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 99ceee37962c37646bd9eb43fd445f01
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "zh-CN",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大烈度",
"SourceName": "GeoNet",
"TitleQuake": "地震信息",
"TitleStrong": "强震动信息"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精确",
"preliminary": "速报",
"automatic": "自动",
"deleted": "删除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 75acceaa142e0b34ea805d36298102df
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "The high tide time and estimated initial tsunami arrival time per area is as follows.",
"HeadlineTsunamiInformationObservation": "Currently, tsunami observed is as follows.",
"HeadlineTsunamiWarning": "{0} has been issued.",
"HeadlineTsunamiWarningDowngraded": "{0} has been lifted and switched to {1}.",
"HeadlineTsunamiWarningLifted": "{0} has been lifted.",
"HeadlineTsunamiWarningUpdate": "The current {0} in effect has been updated.",
"Intensity": "seismic intensity",
@@ -34,8 +35,9 @@
"LongIntensity": "long-period ground motion intensity",
"LongIntensityObservationMax": "This earthquake resulted in {0} of the maximum long-period ground motion intensity recorded.",
"Maximum": "the maximum {0}",
"MinorItemSeparator": "; ",
"MediumItemSeparator": "; ",
"PlumeDirectionValue": "{0} direction",
"ShortItemSeparator": ", ",
"TsunamiForecast": "{0} has been issued for the following coastal regions of Japan.",
"TsunamiForecastArea": "{0}. {1}.",
"TsunamiForecastFirstHeightArrivalTime": "Estimated arrival time {0:t}",
@@ -169,7 +171,7 @@
"北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice",
"南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake",
"噴火に関する火山観測報": "Volcano observation information about eruption",
"噴火警報・予報": "Vocanic warning and forecast",
"噴火警報・予報": "Volcanic warning and forecast",
"噴火速報": "Volcanic eruption notice",
"地震の活動状況等に関する情報": "Earthquake activity information",
"地震回数情報": "Earthquake count information",
@@ -196,6 +198,13 @@
"73": "Tsunami Forecast (slight sea-level changes)"
}
},
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "Tsunami Forecast",
"72": "Tsunami Forecast",
"73": "Tsunami Forecast"
}
},
"TsunamiForecastFirstHeightCondition": {
"Strings": {
"ただちに津波来襲と予測": "Imminent tsunami arrival expected",

View File

@@ -21,8 +21,9 @@
"LongIntensity": "長周期地震動階級",
"LongIntensityObservationMax": "この地震で、最大長周期地震動階級{0}を観測しました。",
"Maximum": "最大{0}",
"MinorItemSeparator": "、",
"MediumItemSeparator": "、",
"PlumeDirectionValue": "{0}方向",
"ShortItemSeparator": "、",
"TsunamiForecast": "{0}が、次の地域に発表されています。",
"TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "到達予想時刻{0:t}",
@@ -75,6 +76,13 @@
"73": "津波予報(若干の海面変動)"
}
},
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "津波予報",
"72": "津波予報",
"73": "津波予報"
}
},
"VolcanoObservationPlumeHeightAboveCraterValue": {
"Strings": {
"": "{0}メートル",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地嘅滿潮時刻同海嘯到達預測時刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海嘯嘅觀測值如下。",
"HeadlineTsunamiWarning": "{0}已被發佈。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切換為{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "而家發佈緊嘅{0}已被更新。",
"Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "長週期地震動階級",
"LongIntensityObservationMax": "呢次地震,觀測到嘅最大長週期地震動階級為{0}。",
"Maximum": "最大{0}",
"MinorItemSeparator": "",
"MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下嘅區域正在發佈{0}。",
"ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在向以下嘅區域發佈。",
"TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}",
"TsunamiForecastMaxHeight": "預測海嘯高度為{0}。",
@@ -196,6 +198,13 @@
"73": "海嘯預報(若干嘅海面變動)"
}
},
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
},
"TsunamiForecastFirstHeightCondition": {
"Strings": {
"ただちに津波来襲と予測": "預測海嘯即將到達",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地的滿潮時刻和海嘯到達預測時刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海嘯的觀測值如下。",
"HeadlineTsunamiWarning": "{0}已被發佈。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切換為{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "當前發佈中的{0}已被更新。",
"Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "長周期地震動階級",
"LongIntensityObservationMax": "本次地震,觀測到的最大長周期地震動階級為{0}。",
"Maximum": "最大{0}",
"MinorItemSeparator": "",
"MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下的區域正在發布{0}。",
"ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在對以下的區域發布。",
"TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}",
"TsunamiForecastMaxHeight": "預測海嘯高度為{0}。",
@@ -119,7 +121,7 @@
"EarthquakeMagnitudeUnknown": {
"Strings": {
"": "地震的規模不明。",
"M8を超える巨大地震": "推定本次地震為規模大於8的巨大地震"
"M8を超える巨大地震": "推定本次地震為規模大於8的巨大地震"
}
},
"HeadlineVolcanoWarning": {
@@ -196,6 +198,13 @@
"73": "海嘯預報(若干的海面變動)"
}
},
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
},
"TsunamiForecastFirstHeightCondition": {
"Strings": {
"ただちに津波来襲と予測": "預測海嘯即將來襲",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地的满潮时刻和海啸到达预测时刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海啸的观测值如下。",
"HeadlineTsunamiWarning": "{0}已被发布。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切换为{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "当前发布中的{0}已被更新。",
"Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "长周期地震动阶级",
"LongIntensityObservationMax": "本次地震,观测到的最大长周期地震动阶级为{0}。",
"Maximum": "最大{0}",
"MinorItemSeparator": "",
"MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下的区域正在发布{0}。",
"ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在对以下的区域发布。",
"TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "预测到达时刻{0:t}",
"TsunamiForecastMaxHeight": "预测海啸高度为{0}。",
@@ -119,7 +121,7 @@
"EarthquakeMagnitudeUnknown": {
"Strings": {
"": "地震的震级不明。",
"M8を超える巨大地震": "推定本次地震为震级大于8的巨大地震"
"M8を超える巨大地震": "推定本次地震为震级大于8的巨大地震"
}
},
"HeadlineVolcanoWarning": {
@@ -196,6 +198,13 @@
"73": "海啸预报(若干的海面变动)"
}
},
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海啸预报",
"72": "海啸预报",
"73": "海啸预报"
}
},
"TsunamiForecastFirstHeightCondition": {
"Strings": {
"ただちに津波来襲と予測": "预测海啸即将来袭",

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "No plume",
"PropertyPlumeHeightAboveCraterValueUnknown": "Unknown",
"ShortItemSeparator": ", ",
"SourceName": "JMA Atom"
},
"StringSets": {
@@ -27,7 +28,7 @@
"北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice",
"南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake",
"噴火に関する火山観測報": "Volcano observation information about eruption",
"噴火警報・予報": "Vocanic warning and forecast",
"噴火警報・予報": "Volcanic warning and forecast",
"噴火速報": "Volcanic eruption notice",
"地震の活動状況等に関する情報": "Earthquake activity information",
"地震回数情報": "Earthquake count information",
@@ -87,7 +88,7 @@
"": "Lifted"
}
},
"PropertyVocanicWarningValue": {
"PropertyVolcanicWarningValue": {
"Strings": {
"11": "Level 1",
"12": "Level 2",
@@ -112,6 +113,17 @@
"訓練": "{0} (Drilling)",
"試験": "{0} (Testing)"
}
},
"TsunamiForecastCategory": {
"Strings": {
"51": "Tsunami Warning",
"52": "Major Tsunami Warning",
"53": "Major Tsunami Warning",
"62": "Tsunami Advisory",
"71": "Tsunami Forecast",
"72": "Tsunami Forecast",
"73": "Tsunami Forecast"
}
}
}
}

View File

@@ -43,7 +43,7 @@
"": "解\u2060除"
}
},
"PropertyVocanicWarningValue": {
"PropertyVolcanicWarningValue": {
"Strings": {
"11": "レ\u2060ベ\u2060ル",
"12": "レ\u2060ベ\u2060ル",

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "冇噴\u2060煙",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom"
},
"StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除"
}
},
"PropertyVocanicWarningValue": {
"PropertyVolcanicWarningValue": {
"Strings": {
"11": "等\u2060級1",
"12": "等\u2060級2",
@@ -112,6 +113,17 @@
"訓練": "{0}(訓練)",
"試験": "{0}(測試)"
}
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海嘯警報",
"52": "大海嘯警報",
"53": "大海嘯警報",
"62": "海嘯注意報",
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
}
}
}

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "無噴\u2060煙",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom"
},
"StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除"
}
},
"PropertyVocanicWarningValue": {
"PropertyVolcanicWarningValue": {
"Strings": {
"11": "等\u2060級1",
"12": "等\u2060級2",
@@ -112,6 +113,17 @@
"訓練": "{0}(訓練)",
"試験": "{0}(測試)"
}
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海嘯警報",
"52": "大海嘯警報",
"53": "大海嘯警報",
"62": "海嘯注意報",
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
}
}
}

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "无喷\u2060烟",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom"
},
"StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除"
}
},
"PropertyVocanicWarningValue": {
"PropertyVolcanicWarningValue": {
"Strings": {
"11": "等\u2060级1",
"12": "等\u2060级2",
@@ -112,6 +113,17 @@
"訓練": "{0}(训练)",
"試験": "{0}(测试)"
}
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海啸警报",
"52": "大海啸警报",
"53": "大海啸警报",
"62": "海啸注意报",
"71": "海啸预报",
"72": "海啸预报",
"73": "海啸预报"
}
}
}
}

View File

@@ -7,9 +7,12 @@ The following files are licensed under [CC-BY-4.0](https://creativecommons.org/l
- Cryville.EEW.CWA/*
- Cryville.EEW.CWAOpenData/*
- Cryville.EEW.CWAOpenData.TTS/*
- Cryville.EEW.EMSC/*
- Cryville.EEW.FERegion/yue.json
- Cryville.EEW.FERegion/zh.json
- Cryville.EEW.FERegion/zh-Hant.json
- Cryville.EEW.GeoNet/*
- Cryville.EEW.GeoNet.TTS/*
- Cryville.EEW.GlobalQuake/*
- Cryville.EEW.JMA/*
- Cryville.EEW.JMA/PointTsunami/en.json

View File

@@ -134,7 +134,7 @@ PlayerSettings:
16:10: 1
16:9: 1
Others: 1
bundleVersion: 0.0.6
bundleVersion: 0.0.7
preloadedAssets: []
metroInputSource: 0
wsaTransparentSwapchain: 0