リレーター

私の仕事の過程で、(「額」を解決するとき)多くの時間がかかる小さなタスクに遭遇します。 これらの問題を迅速に解決する手段を見つけることが判明する場合もありますが、そうでない場合もあります。 2番目のケースでは、多くの場合、問題の解決を可能な限り簡素化することを可能にする独自の小さなプログラムをすばやく作成します。



最近、そのようなタスクの1つに直面しました。 ますます、いくつかのテキストを翻訳する必要が生じ始めました。 ヘブライ語の段落を翻訳する必要があり、それから中国のサイトで議論を読む必要がありました、または外国の同僚に手紙を書くとき、「トリッキーな」文を翻訳することはできませんでした-オンライン翻訳サービスに頼らなければなりません(彼らが言うことを「のぞき見」)。 PROMTとGoogleのサービスを使用しました。 このアプローチは私を悩ませ始め、数晩、企業の3つのサービス(Google(Google Translator)、Microsoft(Bing Translator)、PROMT(モバイルバージョン))を一度に使用するコンテキストトランスレーターを作成しました。



画像



私の経験が誰かに役立つと確信しています。



このミニ記事を2つの部分に分けます。 1つ目は、プログラムをインストールして使用したい人専用です。 そして2つ目は、Mac OS XとiPhoneの開発をマスターする最初のステップを踏むだけです(Appleのリーダーシップのために最初の「Converter」プログラムを作成しましたが、すでに商用ソフトウェアを書きたいという欲求があります)。





Relatorは、Mac OS X向けのシンプルだが非常に便利なコンテキストトランスレーターです。バグ、クラッシュが発生する可能性があります-詳細にテストしたことはありません(必要はありませんでした)が、数日間は問題なく動作します。



Mac OS X 10.6(Snow Leopard)のAppleは、ついにサービス(サービス)の機能に注目し、それを非常に「組み合わせ」ました。 リレーターはこの機能に基づいています。



インストール



1)。 Translation.serviceをServicesフォルダーにコピーします。



[HOME FOLDER] / Libraries / Services-あなただけがサービスを必要とする場合。

/ライブラリ/サービス-システム内のすべてのユーザーがサービスを必要とする場合。



Servicesフォルダーが適切な場所にない場合は、作成します。



画像



2)。 サービスをダブルクリック(開始)するか、ログアウトしてログインします。



3)。 [システム環境設定]> [キーボード]> [サービス]を開きます。 「翻訳」の前にチェックマークを付けて、便利なキーボードショートカットを設定します。



画像



4)。 それだけです コンテキストトランスレータは完全に作業の準備ができています。



使用する



サービスをサポートするプログラム(Safari、Mail、Skype、iChat、TextEdit、Pagesなど)で、テキストを選択し、右クリックしてコンテキストメニューを開き、「翻訳」を選択します。カーソルの下にウィンドウが開きます。転送によって。 または、テキストを強調表示して、指定したキーボードショートカットを押します。



画像

画像



重要なお知らせ...一部のプログラム(特にクロスプラットフォーム)は、サービスの機能をサポートしていません。



各翻訳のリレーターは独自のウィンドウを使用します。 つまり 新しいテキストを翻訳するときに、前の翻訳のある前のウィンドウは閉じません。



トランスレーターウィンドウのサイズは、自分の都合に合わせて構成できます。 ウィンドウを必要なサイズに調整するだけで十分であり、以降のウィンドウはすべて同じサイズになります。



翻訳サービスプロバイダーは自動的に保存されます。 たとえば、最後のウィンドウでMicrosoftを選択した場合、次の翻訳ではMicrosoftからの翻訳が自動的に表示されます。



画像



プログラム設定では、翻訳のフォントサイズとデフォルトの翻訳のいくつかの言語を設定できます。



画像



言語がプロバイダーによってサポートされていない場合、対応するメッセージが表示されます。



リンクからプログラムをダウンロードできます: http : //www.yuriev.info/translator/translator.zip

システム要件: Mac OS X 10.6以降



制限事項



このプログラムでは、非常に長いテキストの翻訳は許可されていません(技術的な意味で、リクエストの長さは2000文字を超えてはなりません)。 プログラムは、POSTではなくGETメソッドを使用します。



プログラムは、PROMT(m.translate.ru)のモバイルバージョンを使用します。これは、小さな段落でのみ翻訳できます。



開発者向け



ここでは、あまり質問ではない(リレーターに関連する)いくつかのありふれた質問を集めて、それらに回答しました。



HUDインターフェイスを作成する方法は?



開発者向けのAppleはHUDパネルにすぎません。 ユーザーは、すべての要素を個別に作成するか、既製のライブラリを使用する必要があります。 BGHUDAppKitを使用しました。



特定のプログラム設定を保存およびロードする方法は?



NSUserDefaultsクラスを使用します。



NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString *source = [defaults objectForKey: @"SourceLanguage" ];

...

[defaults setObject:language forKey: @"SourceLanguage" ];



* This source code was highlighted with Source Code Highlighter .








NSPopUpButtonの内容を設定する方法は?



たとえば、次のように:



[sourceLanguagesButton removeAllItems];



[sourceLanguagesButton addItemWithTitle:NSLocalizedString( @"auto" , @"" )];

[[sourceLanguagesButton menu] addItem:[NSMenuItem separatorItem]];



for ( int i = 0; i < 10; i++)

{

[sourceLanguagesButton addItemWithTitle:[NSString stringWithFormat: @"%i" , i]];

}



* This source code was highlighted with Source Code Highlighter .








ボタンのテキストの色を設定する方法は?



[contactButton setTitle:NSLocalizedString( @"Contact" , @"" )];

NSMutableAttributedString *colorTitle = [[NSMutableAttributedString alloc] initWithAttributedString:[contactButton attributedTitle]];

[colorTitle addAttribute:NSForegroundColorAttributeName value :[NSColor whiteColor] range:NSMakeRange(0, [colorTitle length])];

[contactButton setAttributedTitle:colorTitle];

[colorTitle addAttribute:NSForegroundColorAttributeName value :[NSColor blackColor] range:NSMakeRange(0, [colorTitle length])];

[contactButton setAttributedAlternateTitle:colorTitle];

[colorTitle release];



* This source code was highlighted with Source Code Highlighter .








CoreImage効果をウィンドウに適用する方法(たとえば、Windowsのようなぼかしを作成する)



プライベートAPIの使用は不可欠です。



宣言:



typedef void *CGSWindowFilterRef;

typedef int CGSConnectionID;

typedef int CGSWindowID;

extern CGSConnectionID _CGSDefaultConnection( void );

extern CGError CGSNewCIFilterByName(CGSConnectionID cid, CFStringRef filterName, CGSWindowFilterRef *outFilter);

extern CGError CGSAddWindowFilter(CGSConnectionID cid, CGSWindowID wid, CGSWindowFilterRef filter, int flags);

extern CGError CGSRemoveWindowFilter(CGSConnectionID cid, CGSWindowID wid, CGSWindowFilterRef filter);

extern CGError CGSReleaseCIFilter(CGSConnectionID cid, CGSWindowFilterRef filter);

extern CGError CGSSetCIFilterValuesFromDictionary(CGSConnectionID cid, CGSWindowFilterRef filter, CFDictionaryRef filterValues);



* This source code was highlighted with Source Code Highlighter .








フィルターを設定します。



CGSWindowID wid;

CGSWindowFilterRef fid;



* This source code was highlighted with Source Code Highlighter .








...



int compositingType = 1;

wid = [[self window] windowNumber];

CGSNewCIFilterByName(_CGSDefaultConnection(), (CFStringRef) @"CIGaussianBlur" , &fid);

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:3.0] forKey: @"inputRadius" ];

CGSSetCIFilterValuesFromDictionary(_CGSDefaultConnection(), fid, (CFDictionaryRef)options);

CGSAddWindowFilter(_CGSDefaultConnection(), wid, fid, compositingType);



* This source code was highlighted with Source Code Highlighter .








フィルターを削除します。



if (fid)

{

CGSRemoveWindowFilter(_CGSDefaultConnection(), wid, fid);

CGSReleaseCIFilter(_CGSDefaultConnection(), fid);

}



* This source code was highlighted with Source Code Highlighter .








NSViewウィンドウのタイトルオブジェクトにアクセスする方法(たとえば、Safariのようにロックなどの追加要素を配置する)



NSView *titlebar = [[self.window standardWindowButton:NSWindowCloseButton] superview];



* This source code was highlighted with Source Code Highlighter .








マウスカーソルの現在の座標を取得する方法は?



NSPoint point = [NSEvent mouseLocation];



* This source code was highlighted with Source Code Highlighter .








NSTextViewオブジェクトのコンテンツ全体のフォントを変更する方法は?



[textView setFont:[NSFont systemFontOfSize:20]];



* This source code was highlighted with Source Code Highlighter .








NSTextViewで開始位置をプログラムで設定する方法(最初にスクロールする)



NSPoint top;



if ([textView isFlipped])

{

top = NSMakePoint(0.0, 0.0);

}

else

{

top = NSMakePoint(0.0, NSMaxY([textView frame]) - NSHeight([textView bounds]));

}



[textView scrollPoint:top];



* This source code was highlighted with Source Code Highlighter .








NSViewクラスの一部のオブジェクト(ボタンなど)を非表示にする方法は?



[ object setHidden:YES];



* This source code was highlighted with Source Code Highlighter .








テキストオブジェクトのコンテキストメニューを変更するには?



デリゲートメソッドを設定する必要があります。 プログラムでの実装方法は次のとおりです。



- (NSMenu *)textView:(NSTextView *)view menu:(NSMenu *)menu forEvent:(NSEvent *) event atIndex:(NSUInteger)charIndex

{

NSMenuItem *spotlight = nil;

NSMenuItem *google = nil;

NSMenuItem *dictionary = nil;

NSMenuItem *copy = nil;

NSMenuItem *speech = nil;



int count = [menu numberOfItems];



for ( int i = 0; i < count; i++)

{

SEL action = [[menu itemAtIndex:i] action];



if (action == @selector(spotlight:))

{

spotlight = [[menu itemAtIndex:i] retain];

}

else if (action == @selector(_searchWithGoogleFromMenu:))

{

google = [[menu itemAtIndex:i] retain];

}

else if (action == @selector(_lookUpDefiniteRangeInDictionaryFromMenu:))

{

dictionary = [[menu itemAtIndex:i] retain];

}

else if (action == @selector(copy:))

{

copy = [[menu itemAtIndex:i] retain];

}

else if (action == @selector(submenuAction:))

{

NSMenu *submenu = [[menu itemAtIndex:i] submenu];



if (submenu)

{

if ([submenu numberOfItems] == 2)

{

if ([[submenu itemAtIndex:0] action] == @selector(startSpeaking:))

{

speech = [[menu itemAtIndex:i] retain];

}

}

}

}

}



if (!copy)

{

if (spotlight) [spotlight release];

if (google) [google release];

if (dictionary) [dictionary release];

if (speech) [speech release];



return menu;

}



[menu removeAllItems];

if (spotlight) [menu addItem:spotlight], [spotlight release];

if (google) [menu addItem:google], [google release];

if (dictionary) [menu addItem:dictionary], [dictionary release];



if ([menu numberOfItems] > 0) [menu addItem:[NSMenuItem separatorItem]];

[menu addItem:copy], [copy release];



if (speech)

{

[menu addItem:[NSMenuItem separatorItem]];

[menu addItem:speech], [speech release];

}



return menu;

}



* This source code was highlighted with Source Code Highlighter .








オンライン翻訳サービス(Google、Microsoftなど)にリクエストを送信(および回答を受信)する方法



標準のNSURLConnectionクラスを使用できます。 Google gdata-objectivec-clientプロジェクトのサードパーティクラスGDataHTTPFetcherを使用することを好みました。 このクラスのオブジェクトの操作は非常に簡単です。 プログラムからの要求コードは次のとおりです。



NSString *sourceText = [originalText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *langs = [[NSString stringWithFormat: @"%@|%@" , sourceLanguage, targetLanguage] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *requestURL = [NSString stringWithFormat: @"%@&q=%@&langpair=%@" , GoogleURL, sourceText, langs];

NSURL *url = [NSURL URLWithString:requestURL];

NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20.0];



fetcherG = [[GDataHTTPFetcher httpFetcherWithRequest:request] retain];

[fetcherG beginFetchWithDelegate:self

didFinishSelector:@selector(httpFetcher:finishedWithData:)

didFailSelector:@selector(httpFetcher:didFail:)];



* This source code was highlighted with Source Code Highlighter .








GoogleURLはajax.googleapis.com/ajax/services/language/translate?v=1.0です



All Articles