feat: add ?lang=en support to API with default ru

Language Support:
- Create GetLanguage() helper function
- Support both 'lang' and 'language' query parameters
- Convert short codes (en/ru) to TMDB format (en-US/ru-RU)
- Default language: ru-RU

Changes:
- pkg/handlers/lang_helper.go: new helper for language detection
- pkg/handlers/movie.go: use GetLanguage() in all endpoints
- pkg/handlers/tv.go: use GetLanguage() in all endpoints

How to use:
- ?lang=en → returns English content
- ?lang=ru → returns Russian content (default)
- No param → defaults to Russian

All movie/TV endpoints now support multilingual content:
GET /api/v1/movies/{id}?lang=en
GET /api/v1/movies/popular?lang=en
GET /api/v1/tv/{id}?lang=en
etc.
This commit is contained in:
Cursor Agent
2025-10-05 14:24:19 +00:00
parent aa38c5a2f9
commit 92ff74ab50
5 changed files with 51 additions and 16 deletions

BIN
bin/neomovies-api Executable file

Binary file not shown.

BIN
main Executable file

Binary file not shown.

View File

@@ -0,0 +1,35 @@
package handlers
import (
"net/http"
)
// GetLanguage extracts the lang parameter from request and returns it with default "ru"
// Supports both "lang" and "language" query parameters
// Valid values: "ru", "en"
// Default: "ru"
func GetLanguage(r *http.Request) string {
// Check "lang" parameter first (our new standard)
lang := r.URL.Query().Get("lang")
// Fall back to "language" for backward compatibility
if lang == "" {
lang = r.URL.Query().Get("language")
}
// Default to "ru" if not specified
if lang == "" {
return "ru-RU"
}
// Convert short codes to TMDB format
switch lang {
case "en":
return "en-US"
case "ru":
return "ru-RU"
default:
// Return as-is if already in correct format
return lang
}
}

View File

@@ -29,7 +29,7 @@ func (h *MovieHandler) Search(w http.ResponseWriter, r *http.Request) {
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
region := r.URL.Query().Get("region")
year := getIntQuery(r, "year", 0)
@@ -54,7 +54,7 @@ func (h *MovieHandler) GetByID(w http.ResponseWriter, r *http.Request) {
return
}
language := r.URL.Query().Get("language")
language := GetLanguage(r)
movie, err := h.movieService.GetByID(id, language)
if err != nil {
@@ -71,7 +71,7 @@ func (h *MovieHandler) GetByID(w http.ResponseWriter, r *http.Request) {
func (h *MovieHandler) Popular(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
region := r.URL.Query().Get("region")
movies, err := h.movieService.GetPopular(page, language, region)
@@ -89,7 +89,7 @@ func (h *MovieHandler) Popular(w http.ResponseWriter, r *http.Request) {
func (h *MovieHandler) TopRated(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
region := r.URL.Query().Get("region")
movies, err := h.movieService.GetTopRated(page, language, region)
@@ -107,7 +107,7 @@ func (h *MovieHandler) TopRated(w http.ResponseWriter, r *http.Request) {
func (h *MovieHandler) Upcoming(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
region := r.URL.Query().Get("region")
movies, err := h.movieService.GetUpcoming(page, language, region)
@@ -125,7 +125,7 @@ func (h *MovieHandler) Upcoming(w http.ResponseWriter, r *http.Request) {
func (h *MovieHandler) NowPlaying(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
region := r.URL.Query().Get("region")
movies, err := h.movieService.GetNowPlaying(page, language, region)
@@ -150,7 +150,7 @@ func (h *MovieHandler) GetRecommendations(w http.ResponseWriter, r *http.Request
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
movies, err := h.movieService.GetRecommendations(id, page, language)
if err != nil {
@@ -174,7 +174,7 @@ func (h *MovieHandler) GetSimilar(w http.ResponseWriter, r *http.Request) {
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
movies, err := h.movieService.GetSimilar(id, page, language)
if err != nil {

View File

@@ -29,7 +29,7 @@ func (h *TVHandler) Search(w http.ResponseWriter, r *http.Request) {
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
year := getIntQuery(r, "first_air_date_year", 0)
tvShows, err := h.tvService.Search(query, page, language, year)
@@ -53,7 +53,7 @@ func (h *TVHandler) GetByID(w http.ResponseWriter, r *http.Request) {
return
}
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShow, err := h.tvService.GetByID(id, language)
if err != nil {
@@ -70,7 +70,7 @@ func (h *TVHandler) GetByID(w http.ResponseWriter, r *http.Request) {
func (h *TVHandler) Popular(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetPopular(page, language)
if err != nil {
@@ -87,7 +87,7 @@ func (h *TVHandler) Popular(w http.ResponseWriter, r *http.Request) {
func (h *TVHandler) TopRated(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetTopRated(page, language)
if err != nil {
@@ -104,7 +104,7 @@ func (h *TVHandler) TopRated(w http.ResponseWriter, r *http.Request) {
func (h *TVHandler) OnTheAir(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetOnTheAir(page, language)
if err != nil {
@@ -121,7 +121,7 @@ func (h *TVHandler) OnTheAir(w http.ResponseWriter, r *http.Request) {
func (h *TVHandler) AiringToday(w http.ResponseWriter, r *http.Request) {
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetAiringToday(page, language)
if err != nil {
@@ -145,7 +145,7 @@ func (h *TVHandler) GetRecommendations(w http.ResponseWriter, r *http.Request) {
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetRecommendations(id, page, language)
if err != nil {
@@ -169,7 +169,7 @@ func (h *TVHandler) GetSimilar(w http.ResponseWriter, r *http.Request) {
}
page := getIntQuery(r, "page", 1)
language := r.URL.Query().Get("language")
language := GetLanguage(r)
tvShows, err := h.tvService.GetSimilar(id, page, language)
if err != nil {