Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

翻訳テスト

Posted on 3月 25 by Takaaki Naganoya

翻訳対象の文と、翻訳先の言語コード(2文字コード)を指定すると、macOS内のサービスを呼び出して翻訳して返します。

翻訳を司るTranslation.frameworkはAppleScriptObjCから呼び出せないため、Swiftを介して呼び出してみました。

実際に、AppleScriptObjCから呼び出すことも試みてみたのですが、結局できず……逆に、この手の処理はAppleScriptから呼び出せると有用性が高いもののはずなので、呼び出せないことに納得が行かず、いろんな方法を試行。

実行処理を考えると、AppleScriptバンドル書類内にSwiftからビルドした実行バイナリを入れて呼び出す方が速くてよいのですが、実行環境の多さを考慮してテキスト形式のSwiftを組み込むようにしてみました。

AppleScript名:翻訳テスト_v5.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/25
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set targetLang to "ja"
set textList to {"Stay hungry, stay foolish.", "Innovation distinguishes between a leader and a follower."}
set sRes to translateList(targetLang, textList) of me
–>
(*
"飢え続け、愚かであり続けてください。
イノベーションはリーダーとフォロワーを区別します。"
*)

on translateList(targetLang, textList)
  — 引数の組み立て
  
set argString to targetLang
  
repeat with aText in textList
    set argString to argString & " " & (quoted form of aText)
  end repeat
  
  
— Swiftソースコード
  
— 実行速度と安定性を考慮し、RunLoopを使用して非同期完了を待機します
  
set shellCmd to "swift – " & argString & " <<’EOF’
import Foundation
import Translation
import NaturalLanguage

let args = CommandLine.arguments
guard args.count >= 3 else { exit(1) }

let targetLanguage = args[1]
let textsToTranslate = Array(args.dropFirst(2))

let recognizer = NLLanguageRecognizer()
recognizer.processString(textsToTranslate.joined(separator: \" \"))
guard let identifiedLanguage = recognizer.dominantLanguage?.rawValue else { exit(1) }

let source = Locale.Language(identifier: identifiedLanguage)
let target = Locale.Language(identifier: targetLanguage)

// 翻訳実行フラグ
var isFinished = false

Task {
let session = TranslationSession(installedSource: source, target: target)
do {
let requests = textsToTranslate.map { TranslationSession.Request(sourceText: $0) }
let response = try await session.translations(from: requests)
for result in response {
print(result.targetText)
}
} catch {
fputs(\"Error: \\(error.localizedDescription)\\n\", stderr)
}
isFinished = true
}

// 非同期処理が完了するまでRunLoopを回して待機する
while !isFinished {
RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.1))
}
EOF"

  
  
try
    — do shell script は標準出力が返るまで待機します
    
set translatedResults to do shell script shellCmd
    
return translatedResults
  on error errMsg
    error "翻訳エラー" & return & errMsg
  end try
end translateList

★Click Here to Open This Script 

AppleScript名:翻訳言語コードを取得.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/25
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set langList to returnLangCodes() of me
–> {"ar", "de", "en", "es", "fr", "hi", "id", "it", "ja", "ko", "nl", "pl", "pt", "ru", "th", "tr", "uk", "vi", "zh"}

on returnLangCodes()
  set shellCmd to "swift – <<’EOF’
import Foundation
import Translation

Task {
let availability = LanguageAvailability()
let supportedLanguages = await availability.supportedLanguages

// languageCode(ja, enなど)のみを抽出し、重複を除いてソート
let codes = Set(supportedLanguages.compactMap { $0.languageCode?.identifier }).sorted()

for code in codes {
print(code)
}
exit(0)
}

RunLoop.main.run(until: Date(timeIntervalSinceNow: 5))
EOF"

  
  
try
    — 言語コードを改行区切りで取得
    
set supportedCodes to do shell script shellCmd
    
    
— リスト形式に変換
    
set oldDelims to AppleScript’s text item delimiters
    
set AppleScript’s text item delimiters to string id 13
    
set codeList to text items of supportedCodes
    
set AppleScript’s text item delimiters to oldDelims
    
    
— 結果を表示
    
if (count of codeList) > 0 then
      return codeList
    else
      error "言語コードが見つかりませんでした。"
    end if
    
    
set the clipboard to (codeList as string)
  on error errMsg
    error "取得エラー" & return & errMsg
  end try
end returnLangCodes

★Click Here to Open This Script 

(Visited 4 times, 4 visits today)
Posted in Natural Language Processing Swift Text | Tagged 15.0savvy 26.0savvy | Leave a comment

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • macOS 26, Tahoe
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • Xcode上のAppleScriptObjCのプログラムから、Xcodeのログ欄へのメッセージ出力を実行
  • Script Debuggerがフリーダウンロードで提供されることに
  • AppleScript Dropletのバグっぽい動作が「復活」(macOS 15.5β)
  • macOS 26, 15.5でShortcuts.app「AppleScriptを実行」アクションのバグが修正される
  • Numbersで選択範囲のdateの年を+1する
  • Appleに買収されたPixelmator ProがAppleとしての初アップデート
  • Dock Menu
  • Applicationのactivateを記録する v2
  • シンプルな文字置換
  • macOS 15.5beta5(24F74)でaliasのキャスティングバグが修正された???
  • Claris FileMaker Pro 2025(v22)がリリースされた
  • Apple Creator Studioに含まれるKeynote/Pages/Numbersは新バージョン?
  • macOS 15.7.2 スクリプトメニューから実行できなくなった地図系ライブラリ?
  • 画像をAppleScriptでアスキーアート化
  • NaturalLanguage.frameworkを用いて日本語テキストの形態素解析を行う
  • macOS(Mac OS X/OS X)上のAppleScriptの歴史
  • Adobe InDesignのAppleScript実行エンジンがCarbonからCocoaベースに書き換えられる
  • 開始時刻から終了時刻までhh:mm形式の文字列を15分単位でリスト出力

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (439) 11.0savvy (283) 12.0savvy (212) 13.0savvy (204) 14.0savvy (159) 15.0savvy (171) 26.0savvy (46) CotEditor (68) Finder (53) Keynote (122) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (80) Pages (58) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • date
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Newt On Project
  • NFC
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • process
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • Scripting Additions
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • Swift
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2026年3月
  • 2026年2月
  • 2026年1月
  • 2025年12月
  • 2025年11月
  • 2025年10月
  • 2025年9月
  • 2025年8月
  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC