Skip to content

yummyhawaiianpizzakim/MeloPlace

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MeloPlace

MeloPlaceThumnail2

๐ŸŽง ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋‚ด๊ฐ€ ๊ฐ”๋˜ ๊ณต๊ฐ„์— ์Œ์•…์„ ์ถ”์–ต์— ๋‹ด์•„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•˜๋Š” ์†Œ์…œ๋ฏธ๋””์–ด ์•ฑ

1. ์Œ์•…, ์‚ฌ์ง„, ๊ธ€์„ ์ถ”์–ต์— ๋‹ด์•„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

2. ๋‚˜์˜ ์ถ”์–ต์„ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๊ฐ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

3. ์ง€๋„๋ฅผ ๋ณด๋ฉฐ ๋‚˜์˜ ์ถ”์–ต์ด๋‚˜ ํŒ”๋กœ์ž‰ ํ•œ ์‚ฌ๋žŒ์˜ ์ถ”์–ต์„ ๊ฐ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

4. ํ”ผ๋“œ ํ˜•์‹์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ถ”์–ต์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

5. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ถ”์–ต์— ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


โš™๏ธ ํ™œ์šฉ ๊ธฐ์ˆ 

Purpose Library
ํ™”๋ฉด ๊ตฌํ˜„ UIKit
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Firebase
์˜์กด์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ CocoaPads
๋””์ž์ธ ํŒจํ„ด Clean Architecture With MVVM-C
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ RxSwift
ํ†ต์‹  ๋„คํŠธ์›Œํฌ Alamofire
์˜์กด์„ฑ์ฃผ์ž… Swinject
์ด๋ฏธ์ง€ ์บ์‹ฑ Kingfisher
๊ธฐํƒ€ SnapKit, MapKit, CoreLocation, SpotifySDK, FloatingPanel

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

๐ŸŽง Spotify ๊ณ„์ • ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…

๐ŸŽง ๋‚ด ๊ฒŒ์‹œ๋ฌผ์˜ ์Œ์•…์„ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ๋“ค์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ

๐Ÿ—บ๏ธ ๋‚˜์™€ ํŒ”๋กœ์ž‰ํ•œ ์œ ์ €์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ง€๋„์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๋„ ์žฅ์†Œ ๊ฒ€์ƒ‰ ํ˜„์žฌ ์œ„์น˜ ๊ฒ€์ƒ‰

โœ๏ธ ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถ”์–ต์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์‹œ๋ฌผ ์ถ”๊ฐ€ ์Œ์•… ๊ฒ€์ƒ‰ ๋‚ ์งœ ์„ ํƒ

๐Ÿ‘€ ๋‹ค๋ฅธ ์œ ์ €์˜ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๋‘˜๋Ÿฌ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์œ ์ € ๊ฒ€์ƒ‰

๐Ÿ‘จโ€โš•๏ธ ๋‚˜์˜ ์ •๋ณด, ๋‚ด ๊ฒŒ์‹œ๋ฌผ, ํƒœ๊ทธ ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ €ํ”„๋กœํŒŒ์ผ ํŒ”๋กœ์šฐ ๋ฆฌ์ŠคํŠธ

๐Ÿ”Ž ๊ฒŒ์‹œ๋ฌผ์˜ ์ƒ์„ธํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ธ ๋‚ด์šฉ

๐Ÿ’ฌ ๋Œ“๊ธ€๋กœ ๋‹ค๋ฅธ ์œ ์ €์™€ ์†Œํ†ต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€

๐Ÿ”จ ๊ธฐ์ˆ  ์†Œ๊ฐœ

โžก๏ธ Clean Architecture

MeloPlaceArchitecture

๋„์ž… ์ด์œ 

  • MVVM ๊ตฌ์กฐ์—์„œ ViewModel์ด ๋ชจ๋“  ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Clean Architecture๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๊ฐ๊ฐ์˜ ๋ ˆ์ด์–ด๋ฅผ ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ๋กœ ๊ฐ ๋ ˆ์ด์–ด์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์ˆ˜์ •์— ๋‹ซํ˜€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • ํ”„๋กœํ† ์ฝœ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ํ˜•ํƒœ๋ฅผ ๋ช…์‹œํ•ด์„œ, ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ MVVM

MVVM

๋„์ž… ์ด์œ 

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ ๋ทฐ์˜ ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค์— ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
  • View์˜ Event๋กœ ๋ถ€ํ„ฐ UI์ž‘์—…๊นŒ์ง€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • Input, Output์œผ๋กœ ๋‚˜๋ˆ„์–ด ViewModel์— ์ „๋‹ฌ๋ฐ›์„ ๊ฐ’๊ณผ, ์ „๋‹ฌํ•  ๊ฐ’์„ ์ง๊ด€์ ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ViewController๊ฐ€ ViewModel์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ Coordinator

MeloPlaceFlowChart

๋„์ž… ์ด์œ 

  • ์ฝ”๋“œ ๋ฒ ์ด์Šค๋กœ UI๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ๋˜๋ฉด StoryBoard๋กœ UI๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ณด๋‹ค View๋“ค์˜ ๊ณ„์ธต๊ณผ Flow๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ViewController์˜ ํ™”๋ฉด ์ „ํ™˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • View์˜ ๊ณ„์ธต๊ณผ Flow์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ DI Container๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์˜์กด์„ฑ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โžก๏ธ FireBase

MeloPlaceData drawio (1)

๋„์ž… ์ด์œ 

  • ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ •๋ณด ์ €์žฅ ๋“ฑ์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋ณ„๋„์˜ ์„œ๋ฒ„ ๊ตฌํ˜„์—†์ด ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅํ•œ FireBase๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • Firebase Authentication์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜์œผ๋กœ Spotify์˜ UID์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ์ฐพ์•„ ์ž๋™ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • Firebase Firestore๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด, ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด, ๋Œ“๊ธ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โžก๏ธ Swinject(DIContainer)

๋„์ž… ์ด์œ 

  • ํ™”๋ฉด ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” Coordinator์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ RxSwift

๋„์ž… ์ด์œ 

  • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์„œ๋น„์Šค์—ฌ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋™์ž‘์ด ๋น„๋™๊ธฐ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Thread ๊ด€๋ฆฌ์— ์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์ฒฉ๋œ ๋„คํŠธ์›Œํฌ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์— ์ฝœ๋ฐฑ์ด ์ค‘์ฒฉ๋˜์–ด ๊ฐ€๋…์„ฑ ์ €ํ•ด ๋ฐ ํœด๋จผ ์—๋Ÿฌ๋กœ ์ธํ•œ ๋””๋ฒ„๊ทธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • escaping closure๊ฐ€ ์•„๋‹Œ RxSwift์˜ Operator๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์–‘์ด ๊ฐ์†Œํ•˜์—ฌ ๊น”๋”ํ•ด์ง€๊ณ  ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฝ”๋“œ(DispatchQueue, OperationQueue)๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ Alamofire

๋„์ž… ์ด์œ 

  • SpotifySDK์—์„œ ์ง€์› ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ(์Œ์•… ๊ฒ€์ƒ‰, spotify ์œ ์ € ํ”„๋กœํŒŒ์ผ ๋“ฑ)์ด ์žˆ์–ด SpotifyAPI๋ฅผ ์ด์šฉํ•ด Fetchํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์˜ฌ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • URLSession์— ๋น„ํ•ด ๊ตฌํ˜„์˜ ๊ฐ„ํŽธํ•จ๊ณผ ๋ณด๋‹ค ์ข‹์€ ๊ฐ€๋…์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ Kingfisher

๋„์ž… ์ด์œ 

  • ๋งŽ์€ View์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.
  • CollectionView ๋˜๋Š” TableView์—์„œ ์Šคํฌ๋กค์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • ์บ์‹ฑ์„ ๋„์ž…ํ•ด์„œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋น„์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Downsampling ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€ ๋ฒ„ํผ์— ๋“ค์–ด ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ ํ”ฝ์…€์„ ์‚ญ์ œํ•˜์—ฌ, Decode ๋ฐ Rendering ๊ณผ์ •์—์„œ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ SpotifySDK

๋„์ž… ์ด์œ 

  • ์•ฑ์—์„œ Spotify์˜ ์Œ์•… ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์•ฑ์„ ๋– ๋‚˜์ง€ ์•Š๊ณ ๋„ Spotify์˜ ์Œ์•…์„ ๋“ค์„ ์ˆ˜ ์žˆ๊ฒŒ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Webkit์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  Spotify ์•ฑ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•œ ํ† ํฐ์„ ํš๋“ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์ž… ๊ฒฐ๊ณผ

  • ์‚ฌ์šฉ์ž๋Š” ์•ฑ์„ ๋– ๋‚˜์ง€ ์•Š๊ณ ๋„ Spotify์˜ ์Œ์•…์„ ๋“ฃ๊ฒŒ ๋˜์–ด ์ด๋กœ์จ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Spotify์˜ ์Œ์•… ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ์•ฑ์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ, ์•ฑ์˜ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜๋ฉฐ, ๋”์šฑ ํ’๋ถ€ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฅ ์‹œ์—ฐ ์˜์ƒ

https://drive.google.com/file/d/1Mb8IjErDrRb41u6DSfQXOIS0eYJtkfC0/view?usp=sharing

์ถ”๊ฐ€ ์ž๋ฃŒ

๋…ธ์…˜
MeloPlace: RxSwift ์ ์šฉ๊ณผ ๋Š๊ผˆ๋˜ ์žฅ์ 

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages