diff --git a/Dangerfile.swift b/Dangerfile.swift index 354b10ce..4a854c12 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -3,19 +3,26 @@ import Danger let danger = Danger() let github = danger.github - // Make it more obvious that a PR is a work in progress and shouldn't be merged yet +// Make it more obvious that a PR is a work in progress and shouldn't be merged yet if danger.github.pullRequest.title.contains("WIP") { warn("PR is classed as Work in Progress") } // Warn, asking to update all README files if only English README are updated -let enReameModified = danger.git.modifiedFiles.contains { $0.contains("README.md") } -let zhReameModified = danger.git.modifiedFiles.contains { $0.contains("README_zh.md") } -let koReameModified = danger.git.modifiedFiles.contains { $0.contains("README_ko.md") } -let ptBrReameModified = danger.git.modifiedFiles.contains { $0.contains("README_pt-br.md") } -let otherLanguagesReadmeHaveBeenModified = zhReameModified && koReameModified && ptBrReameModified +let enReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README.md") } +let zhReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_zh.md") } +let koReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_ko.md") } +let ptBrReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_pt-br.md") } +let trReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_tr.md") } +let frReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_fr.md") } +let deReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_de.md") } +let esReadmeModified = danger.git.modifiedFiles.contains { $0.contains("README_es.md") } -if (enReameModified && !otherLanguagesReadmeHaveBeenModified) { +let otherLanguagesReadmeHaveBeenModified = + zhReadmeModified && koReadmeModified && ptBrReadmeModified && trReadmeModified + && frReadmeModified && deReadmeModified && esReadmeModified + +if enReameModified && !otherLanguagesReadmeHaveBeenModified { warn("Consider **also** updating the README for other languages.") } @@ -26,8 +33,12 @@ if (danger.github.pullRequest.additions ?? 0) > 500 { // Added (or removed) library files need to be added (or removed) from the // Xcode project to avoid breaking things. -let addedSwiftLibraryFiles = danger.git.createdFiles.contains { $0.fileType == .swift && $0.hasPrefix("Sources") } -let deletedSwiftLibraryFiles = danger.git.deletedFiles.contains { $0.fileType == .swift && $0.hasPrefix("Sources") } +let addedSwiftLibraryFiles = danger.git.createdFiles.contains { + $0.fileType == .swift && $0.hasPrefix("Sources") +} +let deletedSwiftLibraryFiles = danger.git.deletedFiles.contains { + $0.fileType == .swift && $0.hasPrefix("Sources") +} let modifiedXcodeProject = danger.git.modifiedFiles.contains { $0.contains(".xcodeproj") } if (addedSwiftLibraryFiles || deletedSwiftLibraryFiles) && !modifiedXcodeProject { fail("Added or removed files require the Xcode project to be updated.") diff --git a/README.md b/README.md index 8594d4cf..f61737be 100755 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ • Contributing
-**🌎 README is available in other languages: [🇪🇸](Translations/README_es.md) . [🇨🇳](Translations/README_zh.md) . [🇧🇷](Translations/README_pt-br.md) . [🇰🇷](Translations/README_ko.md) . [🇫🇷](Translations/README_fr.md) . [🇩🇪](Translations/README_de.md)** +**🌎 README is available in other languages: [🇪🇸](Translations/README_es.md) . [🇨🇳](Translations/README_zh.md) . [🇧🇷](Translations/README_pt-br.md) . [🇰🇷](Translations/README_ko.md) . [🇫🇷](Translations/README_fr.md) . [🇩🇪](Translations/README_de.md) . [🇹🇷](Translations/README_tr.md)** Today almost all apps have async processes, such as API requests, long running processes, etc. While the processes are working, usually developers place a loading view to show users that something is going on. diff --git a/Translations/README_de.md b/Translations/README_de.md index 19b1cbd4..402e2415 100644 --- a/Translations/README_de.md +++ b/Translations/README_de.md @@ -21,7 +21,7 @@ • Beitragen -**🌎 README ist auch in anderen Sprachen verfügbar: [🇬🇧](../README.md) . [🇪🇸](README_es.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md)** +**🌎 README ist auch in anderen Sprachen verfügbar: [🇬🇧](../README.md) . [🇪🇸](README_es.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇹🇷](README_tr.md)** Heutzutage haben fast alle Anwendungen async-Prozesse, z.B. API-Anfragen, lang laufende Prozesse, usw. Während die Prozesse arbeiten, platzieren die Entwickler in der Regel eine Ladeansicht, um den Benutzern zu zeigen, dass im Hintergrund etwas vor sich geht. diff --git a/Translations/README_es.md b/Translations/README_es.md index 9b5e4461..002288b1 100644 --- a/Translations/README_es.md +++ b/Translations/README_es.md @@ -18,7 +18,7 @@ • Contribuir -**🌎 README está disponible en estos idiomas: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)** +**🌎 README está disponible en estos idiomas: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md) . [🇹🇷](README_tr.md)** Hoy en día, La mayoría de las apps tiene procesos asíncronos, como peticiones a una API, procesos que tardan mucho tiempo, etc. Mientras estos procesos se están ejecutando, se suele mostrar un aburrido spinner indicando que algo está pasando. diff --git a/Translations/README_fr.md b/Translations/README_fr.md index 2fe96beb..73aeab4d 100644 --- a/Translations/README_fr.md +++ b/Translations/README_fr.md @@ -24,7 +24,7 @@ -**🌎 Traductions: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)** +**🌎 Traductions: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md) . [🇹🇷](README_tr.md)** Aujourd'hui, presque toutes les applications ont des processus asynchrones, tels que les requêtes Api, les processus de longue durée, etc. Et pendant que les processus fonctionnent, les développeurs affichent généralement une vue de chargement pour montrer aux utilisateurs que quelque chose se passe. diff --git a/Translations/README_ko.md b/Translations/README_ko.md index c63a30ff..df53f203 100644 --- a/Translations/README_ko.md +++ b/Translations/README_ko.md @@ -23,7 +23,7 @@ -**🌎 번역에 도움을 주신분들: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)** +**🌎 번역에 도움을 주신분들: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md) . [🇹🇷](README_tr.md)** 오늘날 거의 대부분의 앱들은 비동기 방식의 API 호출을 사용하는 프로세스를 가지고 있습니다. 프로세스가 작동하는동안 개발자들은 작업이 실행되고 있다는것을 사용자들에게 보여주기 위해서 로딩 뷰를 배치합니다. diff --git a/Translations/README_pt-br.md b/Translations/README_pt-br.md index 4b8a1b21..dc934dbe 100755 --- a/Translations/README_pt-br.md +++ b/Translations/README_pt-br.md @@ -23,7 +23,7 @@ -**🌎 Traduções: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)** +**🌎 Traduções: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md) . [🇹🇷](README_tr.md)** Hoje, quase todos os apps têm processos assíncronos, como requisições de API, processos longos, etc. E enquanto os processos estão ocorrendo, normalmente os desenvolvedores usam uma view que mostra os usuarios que algo está ocorrendo. diff --git a/Translations/README_tr.md b/Translations/README_tr.md new file mode 100644 index 00000000..ff84d2b3 --- /dev/null +++ b/Translations/README_tr.md @@ -0,0 +1,574 @@ + + +
+
+
+
+
+
+
+
+
+
+
+ Özellikler + • Rehberler + • Kurulum + • Kullanım + • Diğer Konular + • Katkıda Bulun +
+ +**🌎 README diğer dillerde de mevcuttur: [🇬🇧](../README.md) . [🇪🇸](README_es.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)** + +Günümüzde neredeyse tüm uygulamalar, API istekleri, uzun süren işlemler vb. gibi asenkron süreçlere sahiptir. Bu işlemler çalışırken, geliştiriciler genellikle kullanıcılara bir şeylerin devam ettiğini göstermek için bir yükleme görünümü yerleştirir. + +**SkeletonView**, kullanıcılara bir şeylerin gerçekleştiğini şık bir şekilde göstermek ve onları hangi içeriğin yükleneceğine hazırlamak için bu ihtiyacı karşılamak amacıyla tasarlanmıştır. + +Keyifli kullanımlar! 🙂 + + +## +- [🌟 Özellikler](#-özellikler) +- [🎬 Rehberler](#-rehberler) +- [📲 Kurulum](#-kurulum) +- [🐒 Kullanım](#-kullanım) + - [🌿 Koleksiyonlar](#-koleksiyonlar) + - [🔠 Metinler](#-metinler) + - [🦋 Görünüm](#-görünüm) + - [🎨 Özel renkler](#-özel-renkler) + - [🏃♀️ Animasyonlar](#️-animasyonlar) + - [🏄 Geçişler](#-geçişler) +- [✨ Diğer Konular](#-diğer-konular) +- [❤️ Katkıda Bulun](#️-katkıda-bulun) +- [📢 Bahsedenler](#-bahsedenler) +- [🏆 Sponsorlar](#-sponsorlar) +- [👨🏻💻 Yazar](#-yazar) +- [👮🏻 Lisans](#-lisans) + + + +## 🌟 Özellikler + +* Kullanımı kolay +* Tüm UIView'lar iskeletlenebilir +* Tamamen özelleştirilebilir +* Evrensel (iPhone ve iPad) +* Interface Builder dostu +* Basit Swift sözdizimi +* Hafif, okunabilir kod tabanı + + + + +> 📣 **ÖNEMLİ!** +> +> `SkeletonView` özyinelemeli (recursive) olduğundan, tüm iskeletlenebilir (skeletonable) görünümlerde iskeleti göstermek isterseniz, sadece ana kapsayıcı görünümünde gösterme yöntemini çağırmanız yeterlidir. Örneğin, `UIViewControllers` ile. + + + + +### 🌿 Koleksiyonlar + +```SkeletonView```, ```UITableView``` ve ```UICollectionView``` ile uyumludur. + + +**UITableView** + +Bir ```UITableView```'da iskeleti göstermek istiyorsanız, ```SkeletonTableViewDataSource``` protokolüne uymanız gerekir. + +``` swift +public protocol SkeletonTableViewDataSource: UITableViewDataSource { + func numSections(in collectionSkeletonView: UITableView) -> Int // Varsayılan: 1 + func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int + func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier + func collectionSkeletonView(_ skeletonView: UITableView, skeletonCellForRowAt indexPath: IndexPath) -> UITableViewCell? // Varsayılan: nil + func collectionSkeletonView(_ skeletonView: UITableView, prepareCellForSkeleton cell: UITableViewCell, at indexPath: IndexPath) +} +``` +Gördüğünüz gibi, bu protokol ```UITableViewDataSource```'dan miras alır, bu nedenle bu protokolü iskelet protokolü ile değiştirebilirsiniz. + +Bu protokolün bazı yöntemler için varsayılan bir uygulaması vardır. Örneğin, her bölüm için satır sayısı çalışma zamanında hesaplanır: + +``` swift +func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int +// Varsayılan: +// Tüm tableview'ı doldurmak için kaç hücreye ihtiyaç olduğunu hesaplar +``` + +> 📣 **ÖNEMLİ!** +> +> Yukarıdaki yöntemde `UITableView.automaticNumberOfSkeletonRows` döndürürseniz, varsayılan davranış gibi çalışır (yani, tüm tableview'ı doldurmak için kaç hücre gerektiğini hesaplar). + +Skeleton'a hücre tanımlayıcısını bildirmek için uygulamanız gereken sadece bir yöntem vardır. Bu yöntemin varsayılan bir uygulaması yoktur: + ``` swift + func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier { + return "CellIdentifier" +} + ``` + +Varsayılan olarak, kütüphane her indexPath'ten hücreleri kuyruğa alır, ancak iskelet görünmeden önce bazı değişiklikler yapmak isterseniz bunu da yapabilirsiniz: + ``` swift + func collectionSkeletonView(_ skeletonView: UITableView, skeletonCellForRowAt indexPath: IndexPath) -> UITableViewCell? { + let cell = skeletonView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as? Cell + cell?.textField.isHidden = indexPath.row == 0 + return cell + } + ``` + +Kuyruğa alma kısmını kütüphaneye bırakmayı tercih ederseniz, bu yöntemi kullanarak hücreyi yapılandırabilirsiniz: + ``` swift + func collectionSkeletonView(_ skeletonView: UITableView, prepareCellForSkeleton cell: UITableViewCell, at indexPath: IndexPath) { + let cell = cell as? Cell + cell?.textField.isHidden = indexPath.row == 0 + } + ``` + + +Ayrıca, hem başlıkları hem de altbilgileri iskeletlendirebilirsiniz. Bunun için `SkeletonTableViewDelegate` protokolüne uymanız gerekir. + +```swift +public protocol SkeletonTableViewDelegate: UITableViewDelegate { + func collectionSkeletonView(_ skeletonView: UITableView, identifierForHeaderInSection section: Int) -> ReusableHeaderFooterIdentifier? // Varsayılan: nil + func collectionSkeletonView(_ skeletonView: UITableView, identifierForFooterInSection section: Int) -> ReusableHeaderFooterIdentifier? // Varsayılan: nil +} +``` + +> 📣 **ÖNEMLİ!** +> +> 1️⃣ Eğer yeniden boyutlandırılabilir hücreler kullanıyorsanız (**`tableView.rowHeight = UITableViewAutomaticDimension`**), **`estimatedRowHeight`** tanımlamanız zorunludur. +> +> 2️⃣ Bir **`UITableViewCell`**'e öğeler eklediğinizde, bunları doğrudan hücreye değil, **`contentView`**'a eklemelisiniz. +> ```swift +> self.contentView.addSubview(titleLabel) ✅ +> self.addSubview(titleLabel) ❌ +> ``` + + + +**UICollectionView** + +`UICollectionView` için, `SkeletonCollectionViewDataSource` protokolüne uymanız gerekir. + +``` swift +public protocol SkeletonCollectionViewDataSource: UICollectionViewDataSource { + func numSections(in collectionSkeletonView: UICollectionView) -> Int // Varsayılan: 1 + func collectionSkeletonView(_ skeletonView: UICollectionView, numberOfItemsInSection section: Int) -> Int + func collectionSkeletonView(_ skeletonView: UICollectionView, cellIdentifierForItemAt indexPath: IndexPath) -> ReusableCellIdentifier + func collectionSkeletonView(_ skeletonView: UICollectionView, supplementaryViewIdentifierOfKind: String, at indexPath: IndexPath) -> ReusableCellIdentifier? // Varsayılan: nil + func collectionSkeletonView(_ skeletonView: UICollectionView, skeletonCellForItemAt indexPath: IndexPath) -> UICollectionViewCell? // Varsayılan: nil + func collectionSkeletonView(_ skeletonView: UICollectionView, prepareCellForSkeleton cell: UICollectionViewCell, at indexPath: IndexPath) + func collectionSkeletonView(_ skeletonView: UICollectionView, prepareViewForSkeleton view: UICollectionReusableView, at indexPath: IndexPath) +} +``` + +Sürecin geri kalanı ```UITableView``` ile aynıdır + + +### 🔠 Metinler + + + +Metin içeren öğeler kullanırken, ```SkeletonView``` metni simüle etmek için çizgiler çizer. + +Çok satırlı öğeler için bazı özellikler ayarlayabilirsiniz. + +| Özellik | Tür | Varsayılan | Önizleme +| ------- | ------- |------- | ------- +| **lastLineFillPercent** | `CGFloat` | `70`|  +| **linesCornerRadius** | `Int` | `0` |  +| **skeletonLineSpacing** | `CGFloat` | `10` |  +| **skeletonPaddingInsets** | `UIEdgeInsets` | `.zero` |  +| **skeletonTextLineHeight** | `SkeletonTextLineHeight` | `.fixed(15)` |  +| **skeletonTextNumberOfLines** | `SkeletonTextNumberOfLines` | `.inherited` |  + +|
+ |
+
+ |
+
+
+ |
+
+
+ |
+
|
|
+|
|
|
+|
|
|
+|
|
|
+|
|
|
+|
|
|
+
+
+
+**İskelet görünümlerin düzeni**
+
+Bazen iskelet düzeni, üst görünüm sınırları değiştiği için düzeninize uymayabilir. ~Örneğin, cihazı döndürme.~
+
+İskelet görünümlerini şu şekilde yeniden düzenleyebilirsiniz:
+
+```swift
+override func viewDidLayoutSubviews() {
+ view.layoutSkeletonIfNeeded()
+}
+```
+
+> 📣 **ÖNEMLİ!**
+>
+> Bu yöntemi çağırmamalısınız. **Sürüm 1.8.1**'den itibaren bu yöntemi çağırmanıza gerek yok, kütüphane otomatik olarak yapıyor. Bu nedenle, bu yöntemi **SADECE** iskeletin düzenini manuel olarak güncellemeniz gereken durumlarda kullanabilirsiniz.
+
+
+
+
+**İskeleti güncelleme**
+
+Aşağıdaki yöntemlerle iskelet yapılandırmasını, rengi, animasyonu vb. gibi herhangi bir zamanda değiştirebilirsiniz:
+
+```swift
+(1) view.updateSkeleton() // Düz
+(2) view.updateGradientSkeleton() // Gradyan
+(3) view.updateAnimatedSkeleton() // Düz animasyonlu
+(4) view.updateAnimatedGradientSkeleton() // Gradyan animasyonlu
+```
+
+**Animasyon başladığında görünümleri gizleme**
+
+Bazen animasyon başladığında bazı görünümleri gizlemek istersiniz, bu nedenle bunu gerçekleştirmek için kullanabileceğiniz hızlı bir özellik vardır:
+
+```swift
+view.isHiddenWhenSkeletonIsActive = true // Bu sadece isSkeletonable = true olduğunda çalışır
+```
+
+**İskelet aktif olduğunda kullanıcı etkileşimini değiştirmeyin**
+
+
+Varsayılan olarak, iskeletlenen öğeler için kullanıcı etkileşimi devre dışı bırakılır, ancak iskelet aktif olduğunda kullanıcı etkileşim göstergesini değiştirmek istemiyorsanız, `isUserInteractionDisabledWhenSkeletonIsActive` özelliğini kullanabilirsiniz:
+
+```swift
+view.isUserInteractionDisabledWhenSkeletonIsActive = false // İskelet aktif olduğunda görünüm aktif olacaktır.
+```
+
+**Etiketlerdeki iskelet çizgileri için yazı tipi satır yüksekliğini kullanmayın**
+
+Bir `UILabel` veya `UITextView` için iskeletin yazı tipi yüksekliğine otomatik olarak ayarlanmasını devre dışı bırakmak için false olarak ayarlayın. Varsayılan olarak, iskelet çizgileri yüksekliği, sınırlayıcı kutuyu kullanmak yerine etiket dikdörtgenindeki metni daha doğru bir şekilde yansıtmak için yazı tipi yüksekliğine otomatik olarak ayarlanır.
+
+```swift
+label.useFontLineHeight = false
+```
+
+**Gecikmeli iskelet gösterimi**
+
+Görünümler hızlı güncelleniyorsa iskeletin sunumunu geciktirebilirsiniz.
+
+```swift
+func showSkeleton(usingColor: UIColor,
+ animated: Bool,
+ delay: TimeInterval,
+ transition: SkeletonTransitionStyle)
+```
+
+```swift
+func showGradientSkeleton(usingGradient: SkeletonGradient,
+ animated: Bool,
+ delay: TimeInterval,
+ transition: SkeletonTransitionStyle)
+```
+
+**Debug**
+
+Bir şey düzgün çalışmadığında hata ayıklama görevlerini kolaylaştırmak için **`SkeletonView`** bazı yeni araçlara sahiptir.
+
+İlk olarak, `UIView` iskelet bilgisiyle kullanılabilen bir özelliğe sahiptir:
+```swift
+var sk.skeletonTreeDescription: String
+
+```
+
+Ayrıca, yeni **hata ayıklama modunu** etkinleştirebilirsiniz. Sadece `SKELETON_DEBUG` ortam değişkenini ekleyip etkinleştirmeniz yeterlidir.
+
+
+
+Daha sonra, iskelet göründüğünde, Xcode konsolunda görünüm hiyerarşisini görebilirsiniz.
+
+```
+{
+ "type" : "UIView", // UITableView, UILabel...
+ "isSkeletonable" : true,
+ "reference" : "0x000000014751ce30",
+ "children" : [
+ {
+ "type" : "UIView",
+ "isSkeletonable" : true,
+ "children" : [ ... ],
+ "reference" : "0x000000014751cfa0"
+ }
+ ]
+}
+```
+
+**Desteklenen İşletim Sistemleri ve SDK Sürümleri**
+
+* iOS 9.0+
+* tvOS 9.0+
+* Swift 5.3
+
+## ❤️ Katkıda Bulun
+Bu bir açık kaynak projesidir, bu yüzden katkıda bulunmaktan çekinmeyin. Nasıl mı?
+
+- Bir [sorun](https://github.com/Juanpe/SkeletonView/issues/new) açın.
+- [E-posta](mailto://juanpecatalan.com) aracılığıyla geri bildirim gönderin.
+- Kendi düzeltmelerinizi, önerilerinizi önerin ve değişikliklerle bir pull request açın.
+
+[Tüm katkıda bulunanları](https://github.com/Juanpe/SkeletonView/graphs/contributors) görün
+
+Daha fazla bilgi için lütfen [katkıda bulunma yönergelerini](https://github.com/Juanpe/SkeletonView/blob/main/CONTRIBUTING.md) okuyun.
+
+
+## 📢 Bahsedenler
+
+- [iOS Dev Weekly #327](https://iosdevweekly.com/issues/327#start)
+- [Hacking with Swift Articles](https://www.hackingwithswift.com/articles/40/skeletonview-makes-loading-content-beautiful)
+- [Top 10 Swift Articles November](https://medium.mybridge.co/swift-top-10-articles-for-the-past-month-v-nov-2017-dfed7861cd65)
+- [30 Amazing iOS Swift Libraries (v2018)](https://medium.mybridge.co/30-amazing-ios-swift-libraries-for-the-past-year-v-2018-7cf15027eee9)
+- [AppCoda Weekly #44](http://digest.appcoda.com/issues/appcoda-weekly-issue-44-81899)
+- [iOS Cookies Newsletter #103](https://us11.campaign-archive.com/?u=cd1f3ed33c6527331d82107ba&id=48131a516d)
+- [Swift Developments Newsletter #113](https://andybargh.com/swiftdevelopments-113/)
+- [iOS Goodies #204](http://ios-goodies.com/post/167557280951/week-204)
+- [Swift Weekly #96](http://digest.swiftweekly.com/issues/swift-weekly-issue-96-81759)
+- [CocoaControls](https://www.cocoacontrols.com/controls/skeletonview)
+- [Awesome iOS Newsletter #74](https://ios.libhunt.com/newsletter/74)
+- [Swift News #36](https://www.youtube.com/watch?v=mAGpsQiy6so)
+- [Best iOS articles, new tools & more](https://medium.com/flawless-app-stories/best-ios-articles-new-tools-more-fcbe673e10d)
+
+## 🏆 Sponsorlar
+
+Açık kaynak projeler sizin yardımınız olmadan uzun süre yaşayamaz. Eğer **SkeletonView**'u yararlı bulursanız, lütfen sponsor olarak bu projeyi desteklemeyi düşünün.
+
+[GitHub Sponsors](https://github.com/sponsors/Juanpe) aracılığıyla sponsor olun :heart:
+
+## 👨🏻💻 Yazar
+
+[Juanpe Catalán](http://www.twitter.com/JuanpeCatalan)
+
+
+
+
+## 👮🏻 Lisans
+
+```
+MIT License
+
+Copyright (c) 2017 Juanpe Catalán
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
diff --git a/Translations/README_zh.md b/Translations/README_zh.md
index 84c8dead..98bf2b9e 100755
--- a/Translations/README_zh.md
+++ b/Translations/README_zh.md
@@ -23,7 +23,7 @@
-**🌎 翻译: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md)**
+**🌎 翻译: [🇬🇧](../README.md) . [🇨🇳](README_zh.md) . [🇧🇷](README_pt-br.md) . [🇰🇷](README_ko.md) . [🇫🇷](README_fr.md) . [🇩🇪](README_de.md) . [🇹🇷](README_tr.md)**
今天,几乎所有的应用程序都有异步流程,例如:Api请求、长时间运行的流程等。虽然流程正在运行,但通常开发人员会设置一个加载视图来向用户显示正在发生的事情。