diff --git a/src/N_m3u8DL-RE.Common/Resource/ResString.cs b/src/N_m3u8DL-RE.Common/Resource/ResString.cs
index 5d51837..d98e17a 100644
--- a/src/N_m3u8DL-RE.Common/Resource/ResString.cs
+++ b/src/N_m3u8DL-RE.Common/Resource/ResString.cs
@@ -105,6 +105,9 @@ public static class ResString
     public static string fetch => GetText("fetch");
     public static string ffmpegMerge => GetText("ffmpegMerge");
     public static string ffmpegNotFound => GetText("ffmpegNotFound");
+    public static string mkvmergeNotFound => GetText("mkvmergeNotFound");
+    public static string mp4decryptNotFound => GetText("mp4decryptNotFound");
+    public static string shakaPackagerNotFound => GetText("shakaPackagerNotFound");
     public static string fixingTTML => GetText("fixingTTML");
     public static string fixingTTMLmp4 => GetText("fixingTTMLmp4");
     public static string fixingVTT => GetText("fixingVTT");
diff --git a/src/N_m3u8DL-RE.Common/Resource/StaticText.cs b/src/N_m3u8DL-RE.Common/Resource/StaticText.cs
index bc69d05..f184d25 100644
--- a/src/N_m3u8DL-RE.Common/Resource/StaticText.cs
+++ b/src/N_m3u8DL-RE.Common/Resource/StaticText.cs
@@ -784,6 +784,24 @@ internal class StaticText
             zhTW: "找不到ffmpeg,請自行下載:https://ffmpeg.org/download.html",
             enUS: "ffmpeg not found, please download at: https://ffmpeg.org/download.html"
         ),
+        ["mkvmergeNotFound"] = new TextContainer
+        (
+            zhCN: "找不到mkvmerge,请自行下载:https://mkvtoolnix.download/downloads.html",
+            zhTW: "找不到mkvmerge,請自行下載:https://mkvtoolnix.download/downloads.html",
+            enUS: "mkvmerge not found, please download at: https://mkvtoolnix.download/downloads.html"
+        ),
+        ["shakaPackagerNotFound"] = new TextContainer
+        (
+            zhCN: "找不到shaka-packager,请自行下载:https://github.com/shaka-project/shaka-packager/releases",
+            zhTW: "找不到shaka-packager,請自行下載:https://github.com/shaka-project/shaka-packager/releases",
+            enUS: "shaka-packager not found, please download at: https://github.com/shaka-project/shaka-packager/releases"
+        ),
+        ["mp4decryptNotFound"] = new TextContainer
+        (
+            zhCN: "找不到mp4decrypt,请自行下载:https://www.bento4.com/downloads/",
+            zhTW: "找不到mp4decrypt,請自行下載:https://www.bento4.com/downloads/",
+            enUS: "mp4decrypt not found, please download at: https://www.bento4.com/downloads/"
+        ),
         ["fixingTTML"] = new TextContainer
         (
             zhCN: "正在提取TTML(raw)字幕...",
diff --git a/src/N_m3u8DL-RE/Program.cs b/src/N_m3u8DL-RE/Program.cs
index 5b2e046..40e6223 100644
--- a/src/N_m3u8DL-RE/Program.cs
+++ b/src/N_m3u8DL-RE/Program.cs
@@ -139,7 +139,7 @@ internal class Program
             option.MkvmergeBinaryPath ??= GlobalUtil.FindExecutable("mkvmerge");
             if (string.IsNullOrEmpty(option.MkvmergeBinaryPath) || !File.Exists(option.MkvmergeBinaryPath))
             {
-                throw new FileNotFoundException("mkvmerge not found");
+                throw new FileNotFoundException(ResString.mkvmergeNotFound);
             }
             Logger.Extra($"mkvmerge => {option.MkvmergeBinaryPath}");
         }
@@ -155,14 +155,14 @@ internal class Program
                     var file2 = GlobalUtil.FindExecutable("packager-linux-x64");
                     var file3 = GlobalUtil.FindExecutable("packager-osx-x64");
                     var file4 = GlobalUtil.FindExecutable("packager-win-x64");
-                    if (file == null && file2 == null && file3 == null && file4 == null) throw new FileNotFoundException("shaka-packager not found!");
+                    if (file == null && file2 == null && file3 == null && file4 == null) throw new FileNotFoundException(ResString.shakaPackagerNotFound);
                     option.DecryptionBinaryPath = file ?? file2 ?? file3 ?? file4;
                     Logger.Extra($"shaka-packager => {option.DecryptionBinaryPath}");
                 }
                 else if (option.DecryptionEngine is DecryptEngine.MP4DECRYPT)
                 {
                     var file = GlobalUtil.FindExecutable("mp4decrypt");
-                    if (file == null) throw new FileNotFoundException("mp4decrypt not found!");
+                    if (file == null) throw new FileNotFoundException(ResString.mp4decryptNotFound);
                     option.DecryptionBinaryPath = file;
                     Logger.Extra($"mp4decrypt => {option.DecryptionBinaryPath}");
                 }