ما هي أفضل طريقة لتنسيق سلسلة مترجمة في AppleScript؟

StackOverflow https://stackoverflow.com/questions/64146

  •  09-06-2019
  •  | 
  •  

سؤال

عندما يتم حفظ البرنامج النصي كحزمة، فإنه يمكن استخدام localized string الأمر للعثور على السلسلة المناسبة، على سبيل المثال.في Contents/Resources/English.lproj/Localizable.strings.إذا كانت هذه سلسلة تنسيق، فما هي أفضل طريقة لملء العناصر النائبة؟وبعبارة أخرى، ما هو ما يعادل AppleScript +[NSString stringWithFormat:]?

إحدى الأفكار التي كانت لدي هي استخدامها do shell script مع printf(1).هل هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

منذ OS X 10.10, ، كان من الممكن لأي برنامج نصي لـ AppleScript أن يستخدم Objective-C.هناك عدة طرق لاستدعاء أساليب Objective-C من داخل AppleScript، كما هو مفصل في دليل الترجمة هذا.قد ينجذب أحد مطوري لغة Objective-C مثلي نحو هذه الصيغة، التي تدمج معلمات الطريقة مع قيمها:

use framework "Foundation"

tell the current application's NSWorkspace's sharedWorkspace to openFile:"/Users/me/Desktop/filter.png" withApplication:"Preview"

نتيجة:

true

+[NSString stringWithFormat:] هي حالة صعبة.يستغرق الأمر قائمة vararg كمعلمة أولى، لذلك تحتاج إلى طريقة ما لفرض كل من سلسلة التنسيق ووسائطها في نفس معلمة الطريقة.يؤدي ما يلي إلى حدوث خطأ، لأن AppleScript ينتهي بتمرير NSArray واحد إلى المعلمة التي تتوقع، من الناحية النظرية، مصفوفة C من NSStrings:

use framework "Foundation"

the current application's NSString's stringWithFormat:{"%lu documents", 8}

نتيجة:

error "-[__NSArrayM length]: unrecognized selector sent to instance 0x7fd8d59f3bf0" number -10000

بدلاً من ذلك، يجب عليك استخدام بناء جملة بديل يشبه استدعاء معالج AppleScript أكثر من رسالة Objective-C.تحتاج أيضًا إلى إجبار القيمة المرجعة (كائن NSString) على ملف text:

use framework "Foundation"

the current application's NSString's stringWithFormat_("%lu documents", 8) as text

نتيجة:

"2087 documents"

يشير بناء الجملة "مع المعلمات" الذي ذكره @nlanza إلى حقيقة أن AppleScript يستخدم شيئًا مشابهًا لـ NSInvocation تحت الغطاء.في Objective-C، يسمح لك NSInvocation بإرسال رسالة إلى كائن، مع مجموعة من قيم المعلمات، دون بالضرورة مطابقة كل قيمة لمعلمة معينة.(يرى هذا المقال للحصول على بعض الأمثلة على استخدام NSInvocation مباشرة.)

نصائح أخرى

بقدر ما هو قبيح، يدعو إلى printf(1) هو الحل المشترك.

الحل الأنظف، على الرغم من أنه أكثر تعقيدًا إلى حد ما، هو استخدام AppleScript Studio، والذي يسمح لك باستدعاء كائنات/فئات Objective-C من كود AppleScript الخاص بك باستخدام الأمر call method بناء الجملة موثق هنا.

وبهذا، ستكون قادرًا على استخدام شيء مثل هذا:

call method "stringWithFormat:" of class "NSString" with parameters {formatString, arguments}

الجانب السلبي لهذا، بالطبع، هو أنك تحتاج إلى كتابة تطبيق AppleScript Studio بدلاً من مجرد كتابة برنامج نصي بسيط.ومع ذلك، فإنك تحصل على قدر أكبر من المرونة بشكل عام مع تطبيقات الاستوديو، لذا فهي ليست طريقًا سيئًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top