Migrate from Vite to Next.js 15 with SSR
- Replace Vite + React Router with Next.js 15 App Router - Implement i18n with next-intl (URL-based: /de, /en, /sr) - Add SSR/SSG for all pages (48 static pages generated) - Setup Supabase SSR client for auth - Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms - Add Docker support with standalone output - Replace i18next with next-intl JSON translations - Use next/image for optimized images Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
// src/i18n/locales/sr/blog/index.ts
|
||||
export const blog = {
|
||||
meta: {
|
||||
title: 'Blog - JTL Integracija i Digitalna Rešenja',
|
||||
description: 'Uvidi i najbolje prakse o JTL-WaWi, e-trgovini i digitalnoj transformaciji',
|
||||
header: {
|
||||
title: 'Uvidi i Najbolje Prakse',
|
||||
subtitle: 'Uvidi i najbolje prakse o JTL-WaWi, e-trgovini i digitalnoj transformaciji'
|
||||
}
|
||||
},
|
||||
posts: {
|
||||
'erp-integration-breuninger': {
|
||||
title: 'ApparelMagic i TradeByte: Analiza složenih integracija',
|
||||
date: '2024-02-09',
|
||||
excerpt: 'Detaljna analiza e-trgovinske integracije između Apparel Magic i Breuninger preko TradeByte',
|
||||
category: 'Sistemska integracija',
|
||||
tags: ['ERP', 'Apparel Magic', 'TradeByte', 'API Integration', 'Python', 'MariaDB'],
|
||||
coverImage: '/images/posts/erp-integration-breuninger/cover.jpg',
|
||||
content: {
|
||||
intro: {
|
||||
title: 'Apparel Magic susreće Breuninger: Tehnička analiza TradeByte integracije',
|
||||
description: 'Integracija e-trgovinskih sistema sa uspostavljenim tržištima predstavlja poseban izazov za kompanije. U ovom članku delim svoje iskustvo iz složenog integracionog projekta između Apparel Magic kao ERP sistema i Breuninger platforme preko TradeByte.'
|
||||
},
|
||||
background: {
|
||||
title: 'Pozadina projekta',
|
||||
systems: {
|
||||
erp: 'Apparel Magic kao ERP sistem za podatke o proizvodima i upravljanje zalihama',
|
||||
middleware: 'TradeByte kao middleware za Breuninger platformu'
|
||||
},
|
||||
challenges: {
|
||||
sync: 'Dvosmerna sinhronizacija porudžbina',
|
||||
customers: 'Automatsko kreiranje kupaca',
|
||||
delivery: 'Upravljanje otpremnicama',
|
||||
inventory: 'Upravljanje zalihama u realnom vremenu'
|
||||
}
|
||||
},
|
||||
tech: {
|
||||
title: 'Tehnička arhitektura',
|
||||
components: {
|
||||
title: 'Centralne komponente'
|
||||
},
|
||||
database: {
|
||||
title: 'Middleware baza podataka',
|
||||
description: 'MariaDB baza podataka služi kao centralno skladište podataka za integraciju:'
|
||||
}
|
||||
},
|
||||
api: {
|
||||
title: 'API integracije',
|
||||
apparel_magic: {
|
||||
title: 'Apparel Magic API',
|
||||
description: 'REST API kompanije Apparel Magic se koristi za kreiranje kupaca i upravljanje zalihama:'
|
||||
},
|
||||
tradebyte: {
|
||||
title: 'TradeByte integracija',
|
||||
description: 'TradeByte API koristi kombinaciju REST i XML:'
|
||||
}
|
||||
},
|
||||
order_process: {
|
||||
title: 'Proces porudžbine',
|
||||
steps: {
|
||||
fetch: 'Redovno preuzimanje novih porudžbina sa TradeByte',
|
||||
customers: 'Automatsko kreiranje kupaca u Apparel Magic',
|
||||
process: 'Obrada porudžbina i ažuriranje statusa',
|
||||
delivery: 'Generisanje i čuvanje otpremnica'
|
||||
},
|
||||
delivery_notes: {
|
||||
title: 'Upravljanje otpremnicama'
|
||||
}
|
||||
},
|
||||
challenges: {
|
||||
title: 'Izazovi i rešenja',
|
||||
status: {
|
||||
title: '1. Upravljanje statusom',
|
||||
description: 'Poseban izazov je bio upravljanje statusima porudžbina:'
|
||||
},
|
||||
error_handling: {
|
||||
title: '2. Rukovanje greškama i nadzor',
|
||||
description: 'Robusno rukovanje greškama bilo je ključno za rad u produkciji:'
|
||||
}
|
||||
},
|
||||
best_practices: {
|
||||
title: 'Najbolje prakse',
|
||||
api: {
|
||||
title: '1. API komunikacija',
|
||||
items: {
|
||||
retry: 'Implementacija mehanizama ponovnog pokušaja',
|
||||
errors: 'Pažljivo rukovanje greškama',
|
||||
logging: 'Detaljno logovanje svih komunikacija'
|
||||
}
|
||||
},
|
||||
data: {
|
||||
title: '2. Upravljanje podacima',
|
||||
items: {
|
||||
storage: 'Centralno čuvanje podataka u MariaDB',
|
||||
transactions: 'Sigurnost transakcija pri kritičnim operacijama',
|
||||
validation: 'Redovna validacija podataka'
|
||||
}
|
||||
},
|
||||
automation: {
|
||||
title: '3. Automatizacija procesa',
|
||||
items: {
|
||||
customers: 'Automatsko kreiranje kupaca',
|
||||
status: 'Automatsko ažuriranje statusa',
|
||||
delivery: 'Sistematsko upravljanje otpremnicama'
|
||||
}
|
||||
}
|
||||
},
|
||||
lessons: {
|
||||
title: 'Naučene lekcije',
|
||||
api: {
|
||||
title: '1. Dizajn API-ja',
|
||||
items: {
|
||||
docs: 'Temeljna API dokumentacija je neophodna',
|
||||
auth: 'Razumevanje različitih metoda autentifikacije',
|
||||
limits: 'Uzimanje u obzir ograničenja brzine'
|
||||
}
|
||||
},
|
||||
validation: {
|
||||
title: '2. Validacija podataka',
|
||||
items: {
|
||||
rules: 'Implementacija strogih pravila validacije',
|
||||
edge_cases: 'Pažljivo rukovanje specijalnim slučajevima',
|
||||
cleanup: 'Automatsko čišćenje podataka'
|
||||
}
|
||||
},
|
||||
optimization: {
|
||||
title: '3. Optimizacija procesa',
|
||||
items: {
|
||||
automation: 'Kontinuirano unapređenje automatizacije',
|
||||
performance: 'Redovni pregledi performansi',
|
||||
monitoring: 'Proaktivni nadzor'
|
||||
}
|
||||
}
|
||||
},
|
||||
conclusion: {
|
||||
title: 'Zaključak',
|
||||
requirements: {
|
||||
understanding: 'Duboko razumevanje oba sistema',
|
||||
implementation: 'Pažljiva implementacija API komunikacije',
|
||||
error_handling: 'Robusno rukovanje greškama',
|
||||
monitoring: 'Kontinuirani nadzor'
|
||||
},
|
||||
results: 'Razvijeno rešenje uspešno obrađuje porudžbine i omogućava besprekornu integraciju između sistema. Posebno se automatizovano kreiranje kupaca i upravljanje otpremnicama pokazali kao povećavači efikasnosti.'
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
ui: {
|
||||
readMore: 'Pročitaj više',
|
||||
loading: {
|
||||
posts: 'Učitavaju se blog postovi...',
|
||||
post: 'Učitava se blog post...'
|
||||
},
|
||||
errors: {
|
||||
posts: 'Greška pri učitavanju blog postova',
|
||||
post: 'Traženi blog post ne postoji ili je premješten.'
|
||||
},
|
||||
backToBlog: 'Nazad na blog',
|
||||
publishedOn: 'Objavljeno dana',
|
||||
category: 'Kategorija',
|
||||
tags: 'Oznake',
|
||||
notFound: {
|
||||
title: 'Post nije pronađen',
|
||||
message: 'Traženi blog post ne postoji ili je premješten.'
|
||||
}
|
||||
},
|
||||
categories: {
|
||||
'Integration': 'Integracija',
|
||||
'Entwicklung': 'Razvoj',
|
||||
'Automatisierung': 'Automatizacija'
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type BlogConfig = typeof blog;
|
||||
export type BlogPost = BlogConfig['posts'][keyof BlogConfig['posts']];
|
||||
@@ -0,0 +1,138 @@
|
||||
// src/i18n/locales/sr/blog/posts/erp-integration-breuninger.ts
|
||||
export const erpIntegrationBreuninger = {
|
||||
posts: {
|
||||
erp_integration: {
|
||||
title: 'ApparelMagic i TradeByte: Analiza kompleksnih integracija',
|
||||
date: '2024-02-09',
|
||||
excerpt: 'Detaljna analiza e-commerce integracije između Apparel Magic-a i Breuninger-a preko TradeByte-a',
|
||||
category: 'Sistemska integracija',
|
||||
tags: ['ERP', 'Apparel Magic', 'TradeByte', 'API integracija', 'Python', 'MariaDB'],
|
||||
coverImage: '/images/posts/erp-integration-breuninger/cover.jpg',
|
||||
intro: {
|
||||
title: 'Apparel Magic susreće Breuninger: Tehnička analiza TradeByte integracije',
|
||||
description: 'Integracija e-commerce sistema sa etabliranim marketplace-ima predstavlja poseban izazov za kompanije. U ovom članku delim svoja iskustva iz kompleksnog integracionog projekta između Apparel Magic-a kao ERP sistema i Breuninger platforme preko TradeByte-a.'
|
||||
},
|
||||
background: {
|
||||
title: 'Pozadina projekta',
|
||||
systems: {
|
||||
erp: 'Apparel Magic kao ERP sistem za podatke o proizvodima i upravljanje zalihama',
|
||||
middleware: 'TradeByte kao middleware za Breuninger platformu'
|
||||
},
|
||||
challenges: {
|
||||
sync: 'Bidirekciona sinhronizacija porudžbina',
|
||||
customers: 'Automatsko kreiranje kupaca',
|
||||
delivery: 'Upravljanje otpremnicama',
|
||||
inventory: 'Upravljanje zalihama u realnom vremenu'
|
||||
}
|
||||
},
|
||||
tech: {
|
||||
title: 'Tehnička arhitektura',
|
||||
components: {
|
||||
title: 'Centralne komponente'
|
||||
},
|
||||
database: {
|
||||
title: 'Middleware baza podataka',
|
||||
description: 'MariaDB baza podataka služi kao centralno skladište podataka za integraciju:'
|
||||
}
|
||||
},
|
||||
api: {
|
||||
title: 'API integracije',
|
||||
apparel_magic: {
|
||||
title: 'Apparel Magic API',
|
||||
description: 'REST API Apparel Magic-a se koristi za kreiranje kupaca i upravljanje zalihama:'
|
||||
},
|
||||
tradebyte: {
|
||||
title: 'TradeByte integracija',
|
||||
description: 'TradeByte API koristi kombinaciju REST-a i XML-a:'
|
||||
}
|
||||
},
|
||||
order_process: {
|
||||
title: 'Proces poručivanja',
|
||||
steps: {
|
||||
fetch: 'Redovno preuzimanje novih porudžbina sa TradeByte-a',
|
||||
customers: 'Automatsko kreiranje kupaca u Apparel Magic-u',
|
||||
process: 'Obrada porudžbina i ažuriranje statusa',
|
||||
delivery: 'Generisanje i čuvanje otpremnica'
|
||||
},
|
||||
delivery_notes: {
|
||||
title: 'Upravljanje otpremnicama'
|
||||
}
|
||||
},
|
||||
challenges: {
|
||||
title: 'Izazovi i rešenja',
|
||||
status: {
|
||||
title: '1. Upravljanje statusima',
|
||||
description: 'Poseban izazov je bilo upravljanje statusima porudžbina:'
|
||||
},
|
||||
error_handling: {
|
||||
title: '2. Obrada grešaka i monitoring',
|
||||
description: 'Robusna obrada grešaka je bila ključna za rad u produkciji:'
|
||||
}
|
||||
},
|
||||
best_practices: {
|
||||
title: 'Najbolje prakse',
|
||||
api: {
|
||||
title: '1. API komunikacija',
|
||||
items: {
|
||||
retry: 'Implementacija retry mehanizama',
|
||||
errors: 'Pažljivo rukovanje greškama',
|
||||
logging: 'Detaljno logovanje sve komunikacije'
|
||||
}
|
||||
},
|
||||
data: {
|
||||
title: '2. Upravljanje podacima',
|
||||
items: {
|
||||
storage: 'Centralno skladištenje podataka u MariaDB',
|
||||
transactions: 'Transakciona sigurnost kod kritičnih operacija',
|
||||
validation: 'Redovna validacija podataka'
|
||||
}
|
||||
},
|
||||
automation: {
|
||||
title: '3. Automatizacija procesa',
|
||||
items: {
|
||||
customers: 'Automatizovano kreiranje kupaca',
|
||||
status: 'Automatsko ažuriranje statusa',
|
||||
delivery: 'Sistematsko upravljanje otpremnicama'
|
||||
}
|
||||
}
|
||||
},
|
||||
lessons: {
|
||||
title: 'Naučene lekcije',
|
||||
api: {
|
||||
title: '1. API dizajn',
|
||||
items: {
|
||||
docs: 'Temeljna API dokumentacija je ključna',
|
||||
auth: 'Razumevanje različitih metoda autentifikacije',
|
||||
limits: 'Uzimanje u obzir rate limit-a'
|
||||
}
|
||||
},
|
||||
validation: {
|
||||
title: '2. Validacija podataka',
|
||||
items: {
|
||||
rules: 'Implementacija strogih pravila validacije',
|
||||
edge_cases: 'Pažljivo rukovanje posebnim slučajevima',
|
||||
cleanup: 'Automatsko čišćenje podataka'
|
||||
}
|
||||
},
|
||||
optimization: {
|
||||
title: '3. Optimizacija procesa',
|
||||
items: {
|
||||
automation: 'Kontinuirano poboljšanje automatizacije',
|
||||
performance: 'Redovne provere performansi',
|
||||
monitoring: 'Proaktivni monitoring'
|
||||
}
|
||||
}
|
||||
},
|
||||
conclusion: {
|
||||
title: 'Zaključak',
|
||||
requirements: {
|
||||
understanding: 'Duboko razumevanje oba sistema',
|
||||
implementation: 'Pažljiva implementacija API komunikacije',
|
||||
error_handling: 'Robusna obrada grešaka',
|
||||
monitoring: 'Kontinuirani monitoring'
|
||||
},
|
||||
results: 'Razvijeno rešenje uspešno obrađuje porudžbine i omogućava besprekornu integraciju između sistema. Posebno su se automatizovano kreiranje kupaca i upravljanje otpremnicama pokazali kao faktori koji povećavaju efikasnost.'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,253 @@
|
||||
// src/i18n/locales/sr/blog/posts/fullstack-development-timetracking.ts
|
||||
export const fullstackDevelopmentTimetracking = {
|
||||
meta: {
|
||||
title: 'Fullstack razvoj sa Python-om i React-om: Arhitektura našeg rešenja za evidenciju radnog vremena',
|
||||
date: '2024-02-09',
|
||||
excerpt: 'Tehnički dubinski uvid u implementaciju modernog rešenja za evidenciju radnog vremena',
|
||||
category: 'Sistemska arhitektura',
|
||||
coverImage: '/images/posts/fullstack-development-timetracking/cover.jpg',
|
||||
tags: ['Python', 'React', 'TypeScript', 'MSSQL', 'System Design']
|
||||
},
|
||||
content: {
|
||||
intro: {
|
||||
title: 'Fullstack razvoj sa Python-om i React-om: Arhitektura našeg rešenja za evidenciju radnog vremena',
|
||||
description: 'Razvoj robusnog rešenja za evidenciju radnog vremena zahteva ne samo tehničko znanje, već i duboko razumevanje kompleksnih poslovnih pravila i korisničkih zahteva. U ovom članku delim naša iskustva u implementaciji modernog fullstack rešenja za evidenciju radnog vremena sa Python-om i React-om.'
|
||||
},
|
||||
systemArchitecture: {
|
||||
title: 'Sistemska arhitektura',
|
||||
frontend: {
|
||||
title: 'Frontend (Next.js + TypeScript)',
|
||||
description: 'Frontend arhitektura je bazirana na Next.js-u sa TypeScript-om i prati komponentni pristup:',
|
||||
code: {
|
||||
types: `// types/TimeEntry.ts
|
||||
interface TimeEntry {
|
||||
id: number;
|
||||
date: string;
|
||||
checkIn: string;
|
||||
checkOut: string | null;
|
||||
userId: number;
|
||||
status: 'complete' | 'incomplete';
|
||||
}`,
|
||||
component: `// components/TimeEntryForm.tsx
|
||||
const TimeEntryForm: React.FC<TimeEntryFormProps> = ({ onSubmit }) => {
|
||||
const [entry, setEntry] = useState<TimeEntry>({
|
||||
date: new Date().toISOString().split('T')[0],
|
||||
checkIn: new Date().toLocaleTimeString(),
|
||||
checkOut: null,
|
||||
status: 'incomplete'
|
||||
});
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
if (!validateTimeEntry(entry)) return;
|
||||
try {
|
||||
await onSubmit(entry);
|
||||
} catch (error) {
|
||||
console.error('Error submitting time entry:', error);
|
||||
}
|
||||
};
|
||||
return (
|
||||
<form onSubmit={handleSubmit} className='space-y-4'>
|
||||
<DateInput
|
||||
value={entry.date}
|
||||
onChange={(date) => setEntry({ ...entry, date })}
|
||||
/>
|
||||
<TimeInput
|
||||
value={entry.checkIn}
|
||||
onChange={(time) => setEntry({ ...entry, checkIn: time })}
|
||||
/>
|
||||
{/* Additional form elements */}
|
||||
</form>
|
||||
);
|
||||
};`
|
||||
}
|
||||
},
|
||||
backend: {
|
||||
title: 'Backend (Flask + MSSQL)',
|
||||
description: 'Backend koristi Flask za API i MSSQL za perzistenciju podataka:',
|
||||
code: {
|
||||
models: `# models/time_entry.py
|
||||
class TimeEntry(db.Model):
|
||||
__tablename__ = 'Stundenzettel'
|
||||
id = db.Column('ID', db.Decimal, primary_key=True)
|
||||
personal_id = db.Column('Personal_ID', db.Decimal)
|
||||
datum = db.Column('Datum', db.Date)
|
||||
kommen = db.Column('Kommen', db.Time)
|
||||
gehen = db.Column('Gehen', db.Time)
|
||||
@validates('gehen')
|
||||
def validate_checkout(self, key, value):
|
||||
if value and value < self.kommen:
|
||||
raise ValueError('Checkout time cannot be before checkin time')
|
||||
return value`,
|
||||
routes: `# routes/time_entries.py
|
||||
@app.route('/api/time-entries', methods=['POST'])
|
||||
@jwt_required
|
||||
def create_time_entry():
|
||||
data = request.get_json()
|
||||
user_id = get_jwt_identity()
|
||||
try:
|
||||
validate_time_entry_creation(data, user_id)
|
||||
entry = TimeEntry(
|
||||
personal_id=user_id,
|
||||
datum=data['date'],
|
||||
kommen=data['checkIn'],
|
||||
gehen=data.get('checkOut')
|
||||
)
|
||||
db.session.add(entry)
|
||||
db.session.commit()
|
||||
return jsonify(entry.to_dict()), 201
|
||||
except ValidationError as e:
|
||||
return jsonify({'error': str(e)}), 400`
|
||||
}
|
||||
}
|
||||
},
|
||||
businessLogic: {
|
||||
title: 'Implementacija poslovne logike',
|
||||
validation: {
|
||||
title: 'Validacija vremenskih unosa',
|
||||
description: 'Logika validacije osigurava da su sva poslovna pravila ispoštovana:',
|
||||
code: `def validate_time_entry_creation(data: dict, user_id: int) -> None:
|
||||
'''Validates a new time entry according to business rules.'''
|
||||
# Check for existing incomplete entries
|
||||
incomplete_entry = TimeEntry.query.filter_by(
|
||||
personal_id=user_id,
|
||||
gehen=None,
|
||||
datum=data['date']
|
||||
).first()
|
||||
if incomplete_entry:
|
||||
raise ValidationError('Cannot create new entry while incomplete entry exists')
|
||||
# Check for time overlap with existing entries
|
||||
overlapping_entry = TimeEntry.query.filter(
|
||||
TimeEntry.personal_id == user_id,
|
||||
TimeEntry.datum == data['date'],
|
||||
TimeEntry.kommen <= data['checkIn'],
|
||||
TimeEntry.gehen >= data['checkIn']
|
||||
).first()
|
||||
if overlapping_entry:
|
||||
raise ValidationError('Time entry overlaps with existing entry')`
|
||||
}
|
||||
},
|
||||
databaseDesign: {
|
||||
title: 'Dizajn baze podataka',
|
||||
description: 'MSSQL šema baze podataka je dizajnirana za efikasnost i integritet:',
|
||||
code: `CREATE TABLE dbo.Stundenzettel (
|
||||
ID decimal NOT NULL PRIMARY KEY,
|
||||
Personal_ID decimal,
|
||||
Datum date,
|
||||
Kommen time,
|
||||
Gehen time,
|
||||
xStatus int,
|
||||
xBenutzer nvarchar(15),
|
||||
xDatum datetime,
|
||||
xVersion timestamp
|
||||
);
|
||||
CREATE INDEX idx_personal_datum
|
||||
ON dbo.Stundenzettel(Personal_ID, Datum);`
|
||||
},
|
||||
security: {
|
||||
title: 'Implementacija sigurnosti',
|
||||
authentication: {
|
||||
title: 'JWT autentifikacija',
|
||||
code: `# auth/jwt_handler.py
|
||||
from flask_jwt_extended import create_access_token
|
||||
def authenticate_user(username: str, password: str) -> str:
|
||||
user = Personal.query.filter_by(
|
||||
Benutzername=username,
|
||||
Passwort=password # In production, use proper password hashing
|
||||
).first()
|
||||
if not user:
|
||||
raise AuthenticationError('Invalid credentials')
|
||||
return create_access_token(identity=user.ID)`
|
||||
}
|
||||
},
|
||||
bestPractices: {
|
||||
title: 'Najbolje prakse i naučene lekcije',
|
||||
points: [
|
||||
{
|
||||
title: 'Validacija podataka na više nivoa',
|
||||
items: [
|
||||
'Frontend validacija za trenutni feedback',
|
||||
'Backend validacija za poslovna pravila',
|
||||
'Database constraints za integritet podataka'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Rukovanje greškama',
|
||||
items: [
|
||||
'Strukturirane poruke o greškama',
|
||||
'Korisnički prijateljske poruke o greškama na frontendu',
|
||||
'Detaljno logovanje na backendu'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Optimizacija performansi',
|
||||
items: [
|
||||
'Indeksiranje kritičnih polja u bazi',
|
||||
'Frontend keširanje vremenskih unosa',
|
||||
'Lazy loading za istorijske podatke'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
challenges: {
|
||||
title: 'Izazovi i rešenja',
|
||||
timezones: {
|
||||
title: '1. Rukovanje vremenskim zonama',
|
||||
description: 'Poseban izazov je bilo ispravno rukovanje vremenskim zonama:',
|
||||
code: `// utils/dateTime.ts
|
||||
export const formatTimeForDisplay = (time: string): string => {
|
||||
return new Date(\`1970-01-01T\${time}\`).toLocaleTimeString('de-DE', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
});
|
||||
};
|
||||
export const formatTimeForAPI = (time: string): string => {
|
||||
return new Date(\`1970-01-01T\${time}\`).toISOString().split('T')[1];
|
||||
};`
|
||||
},
|
||||
concurrency: {
|
||||
title: '2. Istovremena ažuriranja',
|
||||
description: 'Rukovanje istovremenim ažuriranjima je zahtevalo posebnu pažnju:',
|
||||
code: `from sqlalchemy import and_, or_
|
||||
def update_time_entry(entry_id: int, data: dict) -> TimeEntry:
|
||||
entry = TimeEntry.query.filter_by(id=entry_id).with_for_update().first()
|
||||
if not entry:
|
||||
raise NotFoundError('Time entry not found')
|
||||
# Optimistic locking using version field
|
||||
if entry.xVersion != data['version']:
|
||||
raise ConcurrencyError('Entry was modified by another user')
|
||||
entry.gehen = data.get('checkOut')
|
||||
db.session.commit()
|
||||
return entry`
|
||||
},
|
||||
offline: {
|
||||
title: '3. Offline funkcionalnost',
|
||||
description: 'Za offline funkcionalnost implementirali smo Service Worker strategiju:',
|
||||
code: `// service-worker.ts
|
||||
const CACHE_NAME = 'timetracking-v1';
|
||||
self.addEventListener('fetch', (event) => {
|
||||
event.respondWith(
|
||||
caches.match(event.request).then(response => {
|
||||
return response || fetch(event.request).then(response => {
|
||||
return caches.open(CACHE_NAME).then(cache => {
|
||||
cache.put(event.request, response.clone());
|
||||
return response;
|
||||
});
|
||||
});
|
||||
})
|
||||
);
|
||||
});`
|
||||
}
|
||||
},
|
||||
conclusion: {
|
||||
title: 'Zaključak',
|
||||
description: 'Razvoj rešenja za evidenciju radnog vremena zahteva pažljivo planiranje i razmatranje brojnih poslovnih pravila. Korišćenjem modernih tehnologija kao što su Next.js, TypeScript i Flask, uspeli smo da implementiramo robusno i korisnički prijateljsko rešenje.',
|
||||
keyPoints: [
|
||||
'Striktna tipizacija sa TypeScript-om',
|
||||
'Sveobuhvatna logika validacije',
|
||||
'Efikasan dizajn baze podataka',
|
||||
'Korisnički prijateljsko rukovanje greškama'
|
||||
],
|
||||
results: 'Rešenje je uspešno u upotrebi već nekoliko meseci i pouzdano obrađuje stotine vremenskih unosa dnevno.'
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,204 @@
|
||||
// src/i18n/locales/sr/blog/posts/rfid-automation.ts
|
||||
export const rfidAutomation = {
|
||||
meta: {
|
||||
title: 'RFID automatizacija etiketa: Od baze podataka do štampača',
|
||||
date: '2024-02-09',
|
||||
excerpt: 'Detaljna tehnička analiza implementacije automatizovanog sistema za štampanje RFID etiketa sa Python-om',
|
||||
category: 'Sistemska integracija',
|
||||
coverImage: '/images/posts/rfid-automation/cover.jpg',
|
||||
tags: ['RFID', 'Python', 'ZPL', 'Automatizacija', 'Zebra štampač', 'EPC']
|
||||
},
|
||||
content: {
|
||||
intro: {
|
||||
title: 'RFID automatizacija etiketa: Od baze podataka do štampača',
|
||||
description: 'U modernim logističkim i maloprodajnim okruženjima, efikasno i besprekorno označavanje proizvoda RFID tagovima je od ključnog značaja. U ovom članku delim svoja iskustva u implementaciji automatizovanog rešenja za generisanje i štampanje RFID etiketa sa kodiranjem čipa.'
|
||||
},
|
||||
requirements: {
|
||||
title: 'Pozadina projekta',
|
||||
points: [
|
||||
'Automatsko generisanje EPC kodova (Electronic Product Code)',
|
||||
'Kreiranje ZPL koda za Zebra štampače',
|
||||
'Direktna mrežna komunikacija sa štampačem',
|
||||
'Integracija sa postojećim podacima o proizvodima',
|
||||
'Rukovanje greškama i logovanje'
|
||||
]
|
||||
},
|
||||
implementation: {
|
||||
title: 'Tehnička implementacija',
|
||||
epcGeneration: {
|
||||
title: 'Generisanje EPC koda',
|
||||
description: 'EPC kodovi se generišu prema SGTIN standardu (Serialized Global Trade Item Number):',
|
||||
code: `def generate_encoded_epc(company_prefix, indicator, item_ref, serial):
|
||||
sgtin = SGTIN(company_prefix, indicator, item_ref, serial)
|
||||
return sgtin.encode()`
|
||||
},
|
||||
zplTemplates: {
|
||||
title: 'Upravljanje ZPL šablonima',
|
||||
description: 'Za različite tipove etiketa implementirani su ZPL šabloni:',
|
||||
code: `def generate_zpl_code(artikelnr, description, ean, price, material, water_resistance, glass_type, encoded_epc):
|
||||
formatted_price = f'{price:.2f}'
|
||||
return f'''
|
||||
CT~~CD,~CC^~CT~
|
||||
^XA
|
||||
~TA000
|
||||
~JSN
|
||||
^LT35
|
||||
^MNW
|
||||
^MTT
|
||||
^PON
|
||||
^PMN
|
||||
^LH0,0
|
||||
^JMA
|
||||
^PR2,2
|
||||
~SD23
|
||||
^JUS
|
||||
^LRN
|
||||
^CI27
|
||||
^PA0,1,1,0
|
||||
^RS8,,,3
|
||||
^XZ
|
||||
^XA
|
||||
^MMT
|
||||
^PW413
|
||||
^LL531
|
||||
^LS-24
|
||||
^FT150,57^A0N,33,33^FH\\^CI27^FD{artikelnr}^FS^CI27
|
||||
^FT44,86^A0N,21,20^FH\\^CI27^FD{description}^FS^CI27
|
||||
^FT130,141^A0N,50,51^FH\\^CI27^FD{formatted_price} €^FS^CI27
|
||||
^FT167,175^A0N,21,20^FH\\^CI27^FD{material}^FS^CI27
|
||||
^FT185,201^A0N,21,20^FH\\^CI27^FD{water_resistance}^FS^CI27
|
||||
^FT155,227^A0N,21,20^FH\\^CI27^FD{glass_type}^FS^CI27
|
||||
^BY3,2,113^FT73,420^BEN,,Y,N
|
||||
^FH\\^FD{ean}^FS
|
||||
^RFW,H,1,2,1^FD3000^FS
|
||||
^RFW,H,2,12,1^FD{encoded_epc}^FS
|
||||
^PQ1,0,1,Y
|
||||
^XZ'''`
|
||||
},
|
||||
printerCommunication: {
|
||||
title: 'Mrežna komunikacija sa štampačem',
|
||||
description: 'Komunikacija sa Zebra štampačem se odvija preko TCP/IP:',
|
||||
code: `def send_to_printer(data, printer_ip='192.168.68.50', printer_port=9100):
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
sock.connect((printer_ip, printer_port))
|
||||
sock.sendall(data.encode('utf-8'))
|
||||
logger.info('Podaci uspešno poslati štampaču')
|
||||
except Exception as e:
|
||||
logger.error(f'Greška pri slanju podataka štampaču: {e}')`
|
||||
},
|
||||
serialNumberManagement: {
|
||||
title: 'Obrada podataka i upravljanje serijskim brojevima',
|
||||
description: 'Upravljanje serijskim brojevima je kritično za jedinstvenost EPC kodova:',
|
||||
code: `def initialize_serial_number():
|
||||
global current_serial_number
|
||||
try:
|
||||
serial_log_content = SERIAL_NUMBER_LOG_PATH.read_text().strip()
|
||||
current_serial_number = int(serial_log_content)
|
||||
except (FileNotFoundError, ValueError):
|
||||
current_serial_number = START_SERIAL_NUMBER
|
||||
def get_next_serial_number():
|
||||
global current_serial_number
|
||||
current_serial_number += 1
|
||||
return current_serial_number
|
||||
def finalize_serial_number():
|
||||
SERIAL_NUMBER_LOG_PATH.write_text(str(current_serial_number))`
|
||||
}
|
||||
},
|
||||
features: {
|
||||
title: 'Implementirane funkcionalnosti',
|
||||
errorHandling: {
|
||||
title: '1. Robusno rukovanje greškama',
|
||||
points: [
|
||||
'Validacija ulaznih podataka',
|
||||
'Provera mrežne veze',
|
||||
'Perzistencija serijskih brojeva',
|
||||
'Detaljno logovanje svih operacija'
|
||||
]
|
||||
},
|
||||
configurability: {
|
||||
title: '2. Konfigurabilnost',
|
||||
points: [
|
||||
'Podesiva IP adresa i port štampača',
|
||||
'Prilagodljivi ZPL šabloni',
|
||||
'Fleksibilno generisanje EPC kodova',
|
||||
'Podesivi opsezi serijskih brojeva'
|
||||
]
|
||||
},
|
||||
scalability: {
|
||||
title: '3. Skalabilnost',
|
||||
points: [
|
||||
'Batch obrada podataka o proizvodima',
|
||||
'Mogući paralelni zadaci štampanja',
|
||||
'Efikasno upravljanje resursima',
|
||||
'Modularan kod za jednostavno proširivanje'
|
||||
]
|
||||
}
|
||||
},
|
||||
bestPractices: {
|
||||
title: 'Najbolje prakse',
|
||||
dataValidation: {
|
||||
title: '1. Validacija podataka',
|
||||
points: [
|
||||
'Striktna tipizacija za kritična polja podataka',
|
||||
'Provera obaveznih polja',
|
||||
'Provere formata i verodostojnosti'
|
||||
]
|
||||
},
|
||||
faultTolerance: {
|
||||
title: '2. Tolerancija na greške',
|
||||
points: [
|
||||
'Automatski pokušaji ponavljanja',
|
||||
'Graceful degradacija',
|
||||
'Detaljni zapisi o greškama'
|
||||
]
|
||||
},
|
||||
maintainability: {
|
||||
title: '3. Održivost',
|
||||
points: [
|
||||
'Modularna struktura koda',
|
||||
'Detaljna dokumentacija',
|
||||
'Jasno odvajanje konfiguracije i koda'
|
||||
]
|
||||
}
|
||||
},
|
||||
lessonsLearned: {
|
||||
title: 'Naučene lekcije',
|
||||
zplSpecifics: {
|
||||
title: '1. ZPL specifičnosti',
|
||||
points: [
|
||||
'Neophodno precizno poznavanje ZPL specifikacija',
|
||||
'Pažljiva validacija generisanih ZPL kodova',
|
||||
'Redovno testiranje sa različitim modelima štampača'
|
||||
]
|
||||
},
|
||||
rfidStandards: {
|
||||
title: '2. RFID standardi',
|
||||
points: [
|
||||
'Kritično poštovanje EPC standarda',
|
||||
'Pažljivo upravljanje serijskim brojevima',
|
||||
'Validacija generisanih EPC kodova'
|
||||
]
|
||||
},
|
||||
networkCommunication: {
|
||||
title: '3. Mrežna komunikacija',
|
||||
points: [
|
||||
'Robusno rukovanje mrežnim problemima',
|
||||
'Tajmauti i pokušaji ponavljanja',
|
||||
'Baferovanje zadataka štampanja'
|
||||
]
|
||||
}
|
||||
},
|
||||
conclusion: {
|
||||
title: 'Zaključak',
|
||||
description: 'Implementirano rešenje omogućava efikasnu i pouzdanu automatizaciju procesa RFID označavanja. Kombinacijom generisanja EPC kodova, upravljanja ZPL šablonima i direktne komunikacije sa štampačem, kreiran je robustan sistem koji se dokazao u praksi.',
|
||||
keyPoints: [
|
||||
'Temeljno planiranje sistemske arhitekture',
|
||||
'Sveobuhvatno rukovanje greškama',
|
||||
'Pažljiva dokumentacija',
|
||||
'Redovno testiranje i validacija'
|
||||
],
|
||||
results: 'Rešenje stabilno radi u produkciji već nekoliko meseci i svakodnevno obrađuje stotine etiketa.'
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,99 @@
|
||||
export const common = {
|
||||
// SEO & Meta
|
||||
siteTitle: 'Damjan Savić - Digitalna rešenja & JTL integracija',
|
||||
siteDescription: 'Programer individualnih rešenja za automatizaciju procesa',
|
||||
// Navigation
|
||||
nav: {
|
||||
home: 'Početna',
|
||||
about: 'O meni',
|
||||
services: 'Usluge',
|
||||
portfolio: 'Portfolio',
|
||||
blog: 'Blog',
|
||||
contact: 'Kontakt'
|
||||
},
|
||||
// Common Actions
|
||||
actions: {
|
||||
readMore: 'Pročitaj više',
|
||||
viewMore: 'Prikaži više',
|
||||
viewAll: 'Prikaži sve',
|
||||
back: 'Nazad',
|
||||
close: 'Zatvori',
|
||||
submit: 'Pošalji',
|
||||
loading: 'Učitavanje...'
|
||||
},
|
||||
// UI Components
|
||||
ui: {
|
||||
published: 'Objavljeno',
|
||||
lastUpdated: 'Poslednje ažuriranje',
|
||||
category: 'Kategorija',
|
||||
categories: 'Kategorije',
|
||||
tag: 'Oznaka',
|
||||
tags: 'Oznake',
|
||||
author: 'Autor',
|
||||
minuteRead: 'minuta čitanja',
|
||||
tableOfContents: 'Sadržaj'
|
||||
},
|
||||
// Error Messages
|
||||
errors: {
|
||||
generic: 'Došlo je do greške',
|
||||
notFound: 'Stranica nije pronađena',
|
||||
loading: 'Greška pri učitavanju',
|
||||
return: 'Povratak na početnu stranicu'
|
||||
},
|
||||
// Loading States
|
||||
loading: {
|
||||
content: 'Učitavanje sadržaja',
|
||||
page: 'Učitavanje stranice',
|
||||
processing: 'Obrada u toku'
|
||||
},
|
||||
// Dates
|
||||
dates: {
|
||||
months: {
|
||||
long: [
|
||||
'Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun',
|
||||
'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'
|
||||
],
|
||||
short: [
|
||||
'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
|
||||
'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'
|
||||
]
|
||||
},
|
||||
weekdays: {
|
||||
long: [
|
||||
'Nedelja', 'Ponedeljak', 'Utorak', 'Sreda',
|
||||
'Četvrtak', 'Petak', 'Subota'
|
||||
],
|
||||
short: ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub']
|
||||
}
|
||||
},
|
||||
// Social Media
|
||||
social: {
|
||||
followMe: 'Pratite me na',
|
||||
shareOn: 'Podeli na',
|
||||
linkedin: 'LinkedIn',
|
||||
github: 'GitHub',
|
||||
email: 'E-mail'
|
||||
},
|
||||
// Contact Form
|
||||
contact: {
|
||||
title: 'Kontakt',
|
||||
name: 'Ime',
|
||||
email: 'E-mail',
|
||||
message: 'Poruka',
|
||||
submit: 'Pošalji poruku',
|
||||
success: 'Vaša poruka je uspešno poslata',
|
||||
error: 'Došlo je do greške pri slanju vaše poruke'
|
||||
},
|
||||
// Accessibility
|
||||
a11y: {
|
||||
skipToContent: 'Preskoči na glavni sadržaj',
|
||||
menuOpen: 'Otvori meni',
|
||||
menuClose: 'Zatvori meni',
|
||||
darkMode: 'Promeni tamni režim',
|
||||
carousel: {
|
||||
next: 'Sledeća slika',
|
||||
previous: 'Prethodna slika'
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
export type CommonTranslations = typeof common;
|
||||
@@ -0,0 +1,14 @@
|
||||
const cookiebanner = {
|
||||
cookies: {
|
||||
message: "Ovaj sajt koristi kolačiće za bolje iskustvo pretraživanja. Podaci neće biti deljeni sa trećim licima.",
|
||||
accept: "Prihvati kolačiće",
|
||||
decline: "Odbij",
|
||||
necessary: "Neophodni kolačići",
|
||||
necessaryDesc: "Za osnovne funkcije sajta",
|
||||
analytics: "Analitički kolačići",
|
||||
analyticsDesc: "Za analizu korišćenja sajta",
|
||||
learnMore: "Saznajte više"
|
||||
}
|
||||
};
|
||||
|
||||
export default cookiebanner;
|
||||
@@ -0,0 +1,37 @@
|
||||
export const faq = {
|
||||
title: 'Često postavljana pitanja',
|
||||
moreQuestions: 'Imate još pitanja?',
|
||||
contactUs: 'Kontaktirajte nas',
|
||||
questions: [
|
||||
{
|
||||
question: "Kako mogu da koristim Python za automatizaciju procesa?",
|
||||
answer: "Python je odličan za automatizaciju procesa kroz biblioteke kao što su Selenium za web automatizaciju, Pandas za obradu podataka i Schedule za vremenski zakazane zadatke. Razvijam prilagođena rešenja za automatizaciju vaših poslovnih procesa.",
|
||||
category: "python"
|
||||
},
|
||||
{
|
||||
question: "Šta čini OLLAMA idealnim za lokalni razvoj veštačke inteligencije?",
|
||||
answer: "OLLAMA omogućava pokretanje velikih jezičkih modela lokalno, što garantuje privatnost podataka i smanjuje troškove API-ja. Specijalizovan sam za integraciju OLLAMA-e u aplikacije za prilagođena AI rešenja bez zavisnosti od oblaka.",
|
||||
category: "ai"
|
||||
},
|
||||
{
|
||||
question: "Koje su prednosti Electron desktop aplikacija?",
|
||||
answer: "Electron omogućava razvoj desktop aplikacija za više platformi koristeći web tehnologije. Dobijate nativnu aplikaciju za Windows, Mac i Linux iz jedne baze koda. Idealno za alate koji zahtevaju kompleksan UI i offline funkcionalnost.",
|
||||
category: "electron"
|
||||
},
|
||||
{
|
||||
question: "Koliko dugo traje razvoj web aplikacije?",
|
||||
answer: "Vreme razvoja zavisi od obima. MVP može biti razvijen za 4-8 nedelja, dok kompleksne enterprise aplikacije zahtevaju 3-6 meseci. Radim agilno i isporučujem upotrebljive rezultate u dvonedeljnim sprintovima.",
|
||||
category: "general"
|
||||
},
|
||||
{
|
||||
question: "Možete li konvertovati postojeće Python skripte u web aplikacije?",
|
||||
answer: "Da, mogu transformisati vaše Python skripte u moderne web aplikacije sa FastAPI ili Django backend-om i React frontend-om. Ovo omogućava multi-korisnički pristup, bolji UI/UX i centralizovano upravljanje podacima.",
|
||||
category: "python"
|
||||
},
|
||||
{
|
||||
question: "Kako integrisati veštačku inteligenciju u postojeće poslovne procese?",
|
||||
answer: "Analiziram vaše radne tokove i identifikujem potencijal za automatizaciju. Koristeći OLLAMA ili druge AI modele, razvijam rešenja za analizu teksta, obradu dokumenata, automatizaciju korisničke podrške ili ekstrakciju podataka - sve u skladu sa privatnošću podataka on-premise.",
|
||||
category: "ai"
|
||||
}
|
||||
]
|
||||
};
|
||||
@@ -0,0 +1,41 @@
|
||||
// src/i18n/locales/sr/footer.ts
|
||||
const footer = {
|
||||
sections: {
|
||||
contact: {
|
||||
title: "Kontakt",
|
||||
email: "info@damjan-savic.com",
|
||||
location: "Keln, Nemačka",
|
||||
aria: {
|
||||
emailLink: "Pošalji email",
|
||||
locationText: "Lokacija"
|
||||
}
|
||||
},
|
||||
navigation: {
|
||||
title: "Navigacija",
|
||||
links: {
|
||||
portfolio: "Portfolio",
|
||||
blog: "Blog",
|
||||
about: "O meni",
|
||||
contact: "Kontakt"
|
||||
}
|
||||
},
|
||||
social: {
|
||||
title: "Društvene mreže",
|
||||
aria: {
|
||||
linkedin: "Posetite moj LinkedIn profil",
|
||||
github: "Posetite moj GitHub profil"
|
||||
}
|
||||
}
|
||||
},
|
||||
legal: {
|
||||
copyright: "Sva prava zadržana",
|
||||
links: {
|
||||
privacy: "Zaštita podataka",
|
||||
imprint: "Impresum",
|
||||
terms: "Uslovi korišćenja"
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
|
||||
export default footer;
|
||||
export type FooterTranslations = typeof footer;
|
||||
@@ -0,0 +1,119 @@
|
||||
// src/i18n/locales/sr/index.ts
|
||||
|
||||
// Prevodi blog postova
|
||||
import { erpIntegrationBreuninger } from './blog/posts/erp-integration-breuninger';
|
||||
import { fullstackDevelopmentTimetracking } from './blog/posts/fullstack-development-timetracking';
|
||||
import { rfidAutomation as blogRfidAutomation } from './blog/posts/rfid-automation';
|
||||
import { blog } from './blog';
|
||||
|
||||
// Prevodi stranica
|
||||
import { about } from './pages/about/index';
|
||||
import { contact } from './pages/contact/index';
|
||||
import { dashboard } from './pages/dashboard';
|
||||
import { home } from './pages/home/index';
|
||||
import { login } from './pages/login';
|
||||
import { notfound } from './pages/notfound';
|
||||
import { portfolio as portfolioPage } from './pages/portfolio';
|
||||
import { privacy } from './pages/privacy';
|
||||
import { terms } from './pages/terms';
|
||||
|
||||
// Prevodi portfolio projekata
|
||||
import { aiDataReader } from './portfolio/projects/ai-data-reader';
|
||||
import { portfolio } from './portfolio';
|
||||
|
||||
// Zajednički prevodi i konfiguracije
|
||||
import { common } from './common';
|
||||
import { meta } from './meta';
|
||||
import { navigation } from './navigation';
|
||||
|
||||
// Footer prevodi
|
||||
import footer from './footer';
|
||||
|
||||
// FAQ prevodi
|
||||
import { faq } from './faq';
|
||||
|
||||
// Objedinjavanje svih prevoda
|
||||
const translations = {
|
||||
// Stranice
|
||||
pages: {
|
||||
about,
|
||||
contact,
|
||||
dashboard,
|
||||
home,
|
||||
login,
|
||||
notfound,
|
||||
portfolio: portfolioPage,
|
||||
privacy,
|
||||
terms,
|
||||
},
|
||||
// Blog
|
||||
blog: {
|
||||
...blog,
|
||||
posts: {
|
||||
erpIntegrationBreuninger,
|
||||
fullstackDevelopmentTimetracking,
|
||||
rfidAutomation: blogRfidAutomation,
|
||||
},
|
||||
},
|
||||
// Portfolio
|
||||
portfolio: {
|
||||
...portfolio,
|
||||
projects: {
|
||||
aiDataReader,
|
||||
},
|
||||
},
|
||||
// Footer
|
||||
footer,
|
||||
// Zajedničke konfiguracije
|
||||
common: {
|
||||
...common,
|
||||
cookies: {
|
||||
message: "Ovaj sajt koristi kolačiće kako bi poboljšao vaše iskustvo pretraživanja i pružio personalizovan sadržaj. Prikupljeni podaci neće biti deljeni sa trećim licima.",
|
||||
accept: "Prihvati kolačiće",
|
||||
decline: "Odbij",
|
||||
necessary: "Neophodni kolačići",
|
||||
necessaryDesc: "Za osnovne funkcije sajta",
|
||||
analytics: "Analitički kolačići",
|
||||
analyticsDesc: "Za analizu korišćenja sajta",
|
||||
learnMore: "Saznajte više"
|
||||
}
|
||||
},
|
||||
meta,
|
||||
navigation,
|
||||
faq,
|
||||
} as const;
|
||||
|
||||
// Default izvoz: kompletan objekat prevoda
|
||||
export default translations;
|
||||
|
||||
// Definicija tipa za prevode
|
||||
export type Translations = typeof translations;
|
||||
|
||||
// Re-izvoz za direktan pristup pojedinačnim modulima
|
||||
export {
|
||||
// Stranice
|
||||
about,
|
||||
contact,
|
||||
dashboard,
|
||||
home,
|
||||
login,
|
||||
notfound,
|
||||
portfolioPage as portfolioPageTranslations,
|
||||
privacy,
|
||||
terms,
|
||||
// Blog
|
||||
blog,
|
||||
erpIntegrationBreuninger,
|
||||
fullstackDevelopmentTimetracking,
|
||||
blogRfidAutomation as blogRfidAutomationPost,
|
||||
// Portfolio
|
||||
portfolio,
|
||||
aiDataReader,
|
||||
// Footer
|
||||
footer,
|
||||
// Zajedničko
|
||||
common,
|
||||
meta,
|
||||
navigation,
|
||||
faq,
|
||||
};
|
||||
@@ -0,0 +1,101 @@
|
||||
export const meta = {
|
||||
site: {
|
||||
name: 'Damjan Savić | Дамјан Савић',
|
||||
title: 'Damjan Savić | Fullstack, IoT и AI програмер',
|
||||
subtitle: 'Скалабилна софтверска решења са IoT и AI интеграцијом',
|
||||
description: 'Као fullstack програмер из Келна, Дамјан Савић се специјализује за развој скалабилних софтверских решења са IoT и AI интеграцијом.',
|
||||
keywords: [
|
||||
'Damjan Savić',
|
||||
'Дамјан Савић',
|
||||
'Старији програмер пуног стека',
|
||||
'Консултант за дигитална решења',
|
||||
'Софтвер за предузећа',
|
||||
'Облак архитектура',
|
||||
'Интеграција вештачке интелигенције',
|
||||
'JTL интеграција Немачка',
|
||||
'Е-трговина решења Европа',
|
||||
'Аутоматизација процеса',
|
||||
'ERP системи',
|
||||
'Python развој',
|
||||
'React програмирање',
|
||||
'Дигитална трансформација Келн',
|
||||
'Програмер Немачка',
|
||||
'IT консултант Европа'
|
||||
].join(', ')
|
||||
},
|
||||
company: {
|
||||
name: 'CoderConda',
|
||||
shortName: 'CoderConda',
|
||||
description: 'Vaš JTL-servisni partner za brza, pouzdana i ekonomična rešenja.',
|
||||
address: 'Rotdornallee',
|
||||
city: 'Köln',
|
||||
postalCode: '50999',
|
||||
country: 'Nemačka',
|
||||
phone: '+49 175 695 0979',
|
||||
email: 'info@damjan-savic.com',
|
||||
website: 'www.damjan-savic.com'
|
||||
},
|
||||
author: {
|
||||
name: 'Damjan Savić | Дамјан Савић',
|
||||
role: 'Старији програмер пуног стека | Консултант за дигитална решења',
|
||||
company: 'CoderCond',
|
||||
location: 'Oberhausen, Nemačka',
|
||||
email: 'info@damjan-savic.com',
|
||||
website: 'https://www.damjan-savic.com',
|
||||
languages: [
|
||||
{ code: 'en', level: 'C2', name: 'Engleski' },
|
||||
{ code: 'sr', level: 'C2', name: 'Srpski' },
|
||||
{ code: 'de', level: 'C2', name: 'Nemački' },
|
||||
{ code: 'fr', level: 'B2', name: 'Francuski' },
|
||||
{ code: 'es', level: 'B2', name: 'Španski' },
|
||||
{ code: 'ru', level: 'A1', name: 'Ruski' }
|
||||
]
|
||||
},
|
||||
social: {
|
||||
linkedin: 'https://www.linkedin.com/in/damjansavic/',
|
||||
github: 'https://github.com/damjansavic',
|
||||
email: 'info@damjan-savic.com'
|
||||
},
|
||||
expertise: {
|
||||
areas: [
|
||||
'JTL integracija i savetovanje',
|
||||
'Automatizacija procesa',
|
||||
'E-commerce razvoj',
|
||||
'Sistemska integracija',
|
||||
'ERP sistemi',
|
||||
'Digitalna transformacija'
|
||||
],
|
||||
technologies: [
|
||||
'Python',
|
||||
'React/Next.js',
|
||||
'MariaDB',
|
||||
'Docker',
|
||||
'JTL-WaWi',
|
||||
'Shopify',
|
||||
'Shopware'
|
||||
]
|
||||
},
|
||||
seo: {
|
||||
defaultLanguage: 'de',
|
||||
alternateLanguages: ['en', 'sr'],
|
||||
robots: 'index, follow',
|
||||
googleSiteVerification: '', // Po potrebi
|
||||
og: {
|
||||
type: 'website',
|
||||
locale: 'sr_RS',
|
||||
siteName: 'Damjan Savić - Старији програмер пуног стека | Консултант за дигитална решења',
|
||||
images: {
|
||||
url: '/images/og-image.jpg',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: 'Damjan Savić (Дамјан Савић) - Старији програмер пуног стека и консултант за дигитална решења у Немачкој'
|
||||
}
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
site: '@damjansavic',
|
||||
creator: '@damjansavic'
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
export type MetaConfig = typeof meta;
|
||||
@@ -0,0 +1,79 @@
|
||||
// C:\Development\Damjan Savic\Portfolio\src\i18n\locales\sr\navigation.ts
|
||||
export const navigation = {
|
||||
// Glavna navigacija
|
||||
main: {
|
||||
home: 'Početna',
|
||||
about: 'O meni',
|
||||
portfolio: 'Portfolio',
|
||||
blog: 'Blog',
|
||||
contact: 'Kontakt'
|
||||
},
|
||||
// Dashboard i Admin
|
||||
admin: {
|
||||
login: 'Prijava',
|
||||
dashboard: 'Dashboard',
|
||||
logout: 'Odjava'
|
||||
},
|
||||
// Footer navigacija
|
||||
footer: {
|
||||
legal: {
|
||||
privacy: 'Politika privatnosti',
|
||||
terms: 'Uslovi korišćenja',
|
||||
imprint: 'Impresum'
|
||||
},
|
||||
sections: {
|
||||
portfolio: 'Portfolio',
|
||||
blog: 'Blog',
|
||||
contact: 'Kontakt'
|
||||
}
|
||||
},
|
||||
// Sekcije stranice
|
||||
sections: {
|
||||
experience: 'Iskustvo',
|
||||
skills: 'Veštine',
|
||||
projects: 'Projekti',
|
||||
about: 'O meni'
|
||||
},
|
||||
// Breadcrumbs i navigacija za povratak
|
||||
navigation: {
|
||||
backTo: {
|
||||
home: 'Nazad na početnu',
|
||||
portfolio: 'Nazad na portfolio',
|
||||
blog: 'Nazad na blog'
|
||||
},
|
||||
breadcrumbs: {
|
||||
home: 'Početna',
|
||||
portfolio: 'Portfolio',
|
||||
blog: 'Blog',
|
||||
about: 'O meni',
|
||||
contact: 'Kontakt'
|
||||
}
|
||||
},
|
||||
// Mobile navigacija
|
||||
mobile: {
|
||||
menu: 'Meni',
|
||||
close: 'Zatvori',
|
||||
open: 'Otvori meni'
|
||||
},
|
||||
// URL-ovi (za dinamičko generisanje ruta)
|
||||
urls: {
|
||||
home: '/',
|
||||
about: '/about',
|
||||
portfolio: '/portfolio',
|
||||
blog: '/blog',
|
||||
contact: '/contact',
|
||||
login: '/login',
|
||||
dashboard: '/dashboard',
|
||||
privacy: '/privacy',
|
||||
terms: '/terms'
|
||||
},
|
||||
// Meta informacije za navigaciju
|
||||
meta: {
|
||||
main: 'Glavna navigacija',
|
||||
footer: 'Footer navigacija',
|
||||
social: 'Navigacija društvenih mreža',
|
||||
legal: 'Pravna navigacija'
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type NavigationConfig = typeof navigation;
|
||||
@@ -0,0 +1,33 @@
|
||||
export const hero = {
|
||||
// Navigation/Header
|
||||
aboutMe: 'O MENI',
|
||||
// Main Section
|
||||
title: 'Ekspert za digitalna rešenja',
|
||||
description: 'Sa iskustvom u razvoju softvera i ekspertizom u digitalnoj transformaciji, pomažem kompanijama da optimizuju i automatizuju svoje procese kroz inovativna rešenja.',
|
||||
// Expertise Areas
|
||||
expertise: {
|
||||
processAutomation: {
|
||||
title: 'Automatizacija procesa',
|
||||
description: 'Razvoj efikasnih automatizovanih tokova rada'
|
||||
},
|
||||
systemIntegration: {
|
||||
title: 'Integracija sistema',
|
||||
description: 'Povezivanje i optimizacija poslovnih sistema'
|
||||
},
|
||||
customDevelopment: {
|
||||
title: 'Individualni razvoj',
|
||||
description: 'Izrada prilagođenih softverskih rešenja'
|
||||
}
|
||||
},
|
||||
// Languages
|
||||
languages: {
|
||||
english: 'Engleski',
|
||||
serbian: 'Srpski',
|
||||
german: 'Nemački',
|
||||
french: 'Francuski',
|
||||
spanish: 'Španski',
|
||||
russian: 'Ruski'
|
||||
}
|
||||
} as const;
|
||||
// Type for type safety
|
||||
export type HeroTranslations = typeof hero;
|
||||
@@ -0,0 +1,28 @@
|
||||
import { hero } from './hero';
|
||||
import { journey } from './journey';
|
||||
import { schema } from './schema';
|
||||
import { skillbar } from './skillbar';
|
||||
import { skillgroup } from './skillgroup';
|
||||
import { skills } from './skills';
|
||||
import { workflow } from './workflow';
|
||||
export const about = {
|
||||
seo: {
|
||||
title: 'O Meni - Damjan Savić | Fullstack Programer & AI Specijalista',
|
||||
description: 'Saznajte više o Damjanu Saviću - AI & Automation Specialist sa fokusom na Voice AI, autonomne agente i automatizaciju procesa iz Kelna, Nemačka.'
|
||||
},
|
||||
hero,
|
||||
journey,
|
||||
schema,
|
||||
skillbar,
|
||||
skillgroup,
|
||||
skills,
|
||||
workflow
|
||||
} as const;
|
||||
// Typen exportieren
|
||||
export type { HeroTranslations } from './hero';
|
||||
export type { JourneyTranslations } from './journey';
|
||||
export type { SchemaTranslations } from './schema';
|
||||
export type { SkillBarTranslations } from './skillbar';
|
||||
export type { SkillGroupTranslations } from './skillgroup';
|
||||
export type { SkillsTranslations } from './skills';
|
||||
export type { WorkflowTranslations } from './workflow';
|
||||
@@ -0,0 +1,96 @@
|
||||
|
||||
export const journey = {
|
||||
// Header
|
||||
title: 'Profesionalni razvoj',
|
||||
subtitle: 'Od digitalnih medija do poslovnih rešenja',
|
||||
// Education Section
|
||||
education: {
|
||||
title: 'Obrazovanje',
|
||||
degrees: {
|
||||
masters: {
|
||||
degree: 'M.A. Razvoj softvera',
|
||||
university: 'Middlesex University, London',
|
||||
period: '2020 - 2022'
|
||||
},
|
||||
bachelors: {
|
||||
degree: 'B.A. Cross-Media produkcija',
|
||||
university: 'Middlesex University, London',
|
||||
period: '2018 - 2020'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Languages Section
|
||||
languages: {
|
||||
title: 'Jezici',
|
||||
items: {
|
||||
english: {
|
||||
name: 'Engleski',
|
||||
level: 'C2'
|
||||
},
|
||||
serbian: {
|
||||
name: 'Srpski',
|
||||
level: 'C2'
|
||||
},
|
||||
german: {
|
||||
name: 'Nemački',
|
||||
level: 'C2'
|
||||
},
|
||||
french: {
|
||||
name: 'Francuski',
|
||||
level: 'B2'
|
||||
},
|
||||
spanish: {
|
||||
name: 'Španski',
|
||||
level: 'B2'
|
||||
},
|
||||
russian: {
|
||||
name: 'Ruski',
|
||||
level: 'A1'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Work History
|
||||
work: {
|
||||
positions: [
|
||||
{
|
||||
period: '08/2023 - Danas',
|
||||
company: 'Ritter Digital GmbH',
|
||||
title: 'Digital Solutions Consultant',
|
||||
location: 'Oberhausen',
|
||||
highlights: [
|
||||
'ERP konsalting i implementacija (JTL WaWi)',
|
||||
'Automatizacija procesa i Full-Stack razvoj',
|
||||
'RFID tehnologija i automatizacija',
|
||||
'Generisanje i upravljanje Lead-ovima',
|
||||
'Content menadžment podržan AI tehnologijom'
|
||||
]
|
||||
},
|
||||
{
|
||||
period: '02/2023 - 08/2023',
|
||||
company: 'Joyce & Girls Co AG',
|
||||
title: 'ERP Integration Specialist',
|
||||
location: 'Köln',
|
||||
highlights: [
|
||||
'Kompleksna integracija sistema (Apparel Magic, TradeByte)',
|
||||
'Administracija servera i automatizacija',
|
||||
'Razvoj baza podataka i API-ja',
|
||||
'Digitalni marketing i analiza kampanja'
|
||||
]
|
||||
},
|
||||
{
|
||||
period: '08/2022 - 01/2023',
|
||||
company: 'Magnarius',
|
||||
title: 'RPA Developer & E-Commerce Manager',
|
||||
location: 'Bergisch Gladbach',
|
||||
highlights: [
|
||||
'Shopware 6 razvoj i JTL integracija',
|
||||
'Google Ads automatizacija',
|
||||
'CMS menadžment i optimizacija',
|
||||
'Implementacija SEO strategije'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
} as const;
|
||||
// Tip za tipsku sigurnost
|
||||
export type JourneyTranslations = typeof journey;
|
||||
@@ -0,0 +1,31 @@
|
||||
export const schema = {
|
||||
page: {
|
||||
name: 'O Damjanu Saviću',
|
||||
description: 'Saznajte više o Damjanu Saviću, sertifikovanom JTL ekspertu sa velikim iskustvom u e-trgovini i sistemima za upravljanje robom.'
|
||||
},
|
||||
person: {
|
||||
jobTitle: 'JTL integracioni ekspert',
|
||||
description: 'Sa bogatim iskustvom u integraciji i optimizaciji e-commerce sistema, pomažem kompanijama u digitalnoj transformaciji njihovih poslovnih procesa.',
|
||||
languages: {
|
||||
english: 'Engleski',
|
||||
serbian: 'Srpski',
|
||||
german: 'Nemački',
|
||||
french: 'Francuski',
|
||||
spanish: 'Španski',
|
||||
russian: 'Ruski'
|
||||
},
|
||||
skills: {
|
||||
python: 'Python',
|
||||
googleAds: 'Google Ads',
|
||||
metaAds: 'Meta Ads',
|
||||
shopware: 'Shopware',
|
||||
shopify: 'Shopify',
|
||||
wooCommerce: 'WooCommerce',
|
||||
jtlWawi: 'JTL WAWI',
|
||||
serverAdmin: 'Administracija servera',
|
||||
airflow: 'AirFlow'
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
// Tip za tipsku sigurnost
|
||||
export type SchemaTranslations = typeof schema;
|
||||
@@ -0,0 +1,13 @@
|
||||
export const skillbar = {
|
||||
// Accessibility labels
|
||||
ariaLabel: {
|
||||
skillLevel: 'Nivo veštine',
|
||||
progressBar: 'Indikator napretka'
|
||||
},
|
||||
// Screen reader text
|
||||
screenReader: {
|
||||
progress: '{{level}} procenata napretka za {{skill}}'
|
||||
}
|
||||
} as const;
|
||||
// Tip za tipsku sigurnost
|
||||
export type SkillBarTranslations = typeof skillbar;
|
||||
@@ -0,0 +1,63 @@
|
||||
export const skillgroup = {
|
||||
// Kategorije
|
||||
categories: {
|
||||
development: 'Razvoj',
|
||||
ecommerce: 'E-Commerce',
|
||||
marketing: 'Marketing',
|
||||
automation: 'Automatizacija',
|
||||
languages: 'Programski jezici',
|
||||
databases: 'Baze podataka'
|
||||
},
|
||||
// Veštine po kategorijama
|
||||
skills: {
|
||||
development: {
|
||||
frontend: 'Frontend razvoj',
|
||||
backend: 'Backend razvoj',
|
||||
fullstack: 'Full-Stack razvoj',
|
||||
api: 'API razvoj',
|
||||
testing: 'Testiranje softvera'
|
||||
},
|
||||
ecommerce: {
|
||||
jtl: 'JTL WaWi',
|
||||
shopware: 'Shopware',
|
||||
shopify: 'Shopify',
|
||||
woocommerce: 'WooCommerce',
|
||||
magento: 'Magento'
|
||||
},
|
||||
marketing: {
|
||||
seo: 'Optimizacija za pretraživače',
|
||||
sea: 'Marketing na pretraživačima',
|
||||
analytics: 'Web analitika',
|
||||
googleAds: 'Google Ads',
|
||||
metaAds: 'Meta Ads'
|
||||
},
|
||||
automation: {
|
||||
rpa: 'Robotska automatizacija procesa',
|
||||
workflow: 'Automatizacija radnih tokova',
|
||||
cicd: 'CI/CD',
|
||||
testing: 'Automatizacija testiranja',
|
||||
deployment: 'Automatizacija razvoja'
|
||||
},
|
||||
languages: {
|
||||
python: 'Python',
|
||||
javascript: 'JavaScript',
|
||||
typescript: 'TypeScript',
|
||||
php: 'PHP',
|
||||
sql: 'SQL'
|
||||
},
|
||||
databases: {
|
||||
mysql: 'MySQL',
|
||||
postgresql: 'PostgreSQL',
|
||||
mongodb: 'MongoDB',
|
||||
redis: 'Redis',
|
||||
elasticsearch: 'Elasticsearch'
|
||||
}
|
||||
},
|
||||
// Pristupačnost
|
||||
ariaLabels: {
|
||||
skillGroup: 'Grupa veština',
|
||||
skillList: 'Lista veština u ovoj kategoriji'
|
||||
}
|
||||
} as const;
|
||||
// Tip za tipsku sigurnost
|
||||
export type SkillGroupTranslations = typeof skillgroup;
|
||||
@@ -0,0 +1,46 @@
|
||||
// sr/pages/about/skills.ts
|
||||
export const skills = {
|
||||
title: 'Veštine',
|
||||
skillGroups: [
|
||||
{
|
||||
category: 'Razvoj',
|
||||
items: [
|
||||
{ name: 'Python', level: 90 },
|
||||
{ name: 'Google Ads', level: 85 },
|
||||
{ name: 'Meta Ads', level: 85 }
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'E-Commerce',
|
||||
items: [
|
||||
{ name: 'Shopware', level: 85 },
|
||||
{ name: 'Shopify', level: 85 },
|
||||
{ name: 'WooCommerce', level: 85 }
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'Administracija sistema',
|
||||
items: [
|
||||
{ name: 'JTL WAWI', level: 85 },
|
||||
{ name: 'Server', level: 75 },
|
||||
{ name: 'AirFlow', level: 60 }
|
||||
]
|
||||
}
|
||||
],
|
||||
ui: {
|
||||
percentage: 'procenat',
|
||||
levelLabel: 'nivo',
|
||||
skillLevel: '{{level}}% ovladanosti za {{skill}}'
|
||||
},
|
||||
aria: {
|
||||
skillGroup: 'Grupa veština za {{category}}',
|
||||
skillBar: 'Indikator napretka za {{skill}}',
|
||||
skillIcon: 'Ikona za {{category}}',
|
||||
selectSkill: 'Izaberi veštinu'
|
||||
},
|
||||
screenReader: {
|
||||
skillProgress: '{{skill}} sa nivoom od {{level}} procenata'
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type SkillsTranslations = typeof skills;
|
||||
@@ -0,0 +1,44 @@
|
||||
export const workflow = {
|
||||
// Naslov stranice
|
||||
title: 'MOJ WORKFLOW',
|
||||
description: 'Sistematski pristup razvoju softvera kroz definisane korake',
|
||||
// Workflow koraci
|
||||
steps: [
|
||||
{
|
||||
number: '01',
|
||||
title: 'ANALIZA ZAHTEVA'
|
||||
},
|
||||
{
|
||||
number: '02',
|
||||
title: 'PROVERA ROKOVA I OGRANIČENJA'
|
||||
},
|
||||
{
|
||||
number: '03',
|
||||
title: 'POSTAVLJANJE RAZVOJNOG OKRUŽENJA'
|
||||
},
|
||||
{
|
||||
number: '04',
|
||||
title: 'PROGRAMIRANJE'
|
||||
},
|
||||
{
|
||||
number: '05',
|
||||
title: 'TESTIRANJE REZULTATA'
|
||||
},
|
||||
{
|
||||
number: '06',
|
||||
title: 'PODRŠKA I SKALIRANJE KODA'
|
||||
}
|
||||
],
|
||||
// Aria oznake za pristupačnost
|
||||
aria: {
|
||||
workflowSection: 'Workflow proces',
|
||||
stepNumber: 'Korak {{number}}',
|
||||
stepDescription: 'Workflow korak: {{title}}'
|
||||
},
|
||||
// Tekstovi za čitače ekrana
|
||||
screenReader: {
|
||||
stepProgress: 'Korak {{number}} od {{total}}: {{title}}'
|
||||
}
|
||||
} as const;
|
||||
// Tip za tipsku sigurnost
|
||||
export type WorkflowTranslations = typeof workflow;
|
||||
@@ -0,0 +1,41 @@
|
||||
// src/i18n/locales/sr/pages/contact/contactform.ts
|
||||
export const contactform = {
|
||||
// Zaglavlje formulara
|
||||
title: 'Kontaktirajte me',
|
||||
description: 'Imate pitanja ili želite da sarađujemo? Pošaljite mi poruku.',
|
||||
// Polja formulara
|
||||
name: {
|
||||
label: 'Ime',
|
||||
placeholder: 'Vaše puno ime'
|
||||
},
|
||||
email: {
|
||||
label: 'E-mail',
|
||||
placeholder: 'vasa.adresa@primer.com'
|
||||
},
|
||||
message: {
|
||||
label: 'Poruka',
|
||||
placeholder: 'Vaša poruka za mene...'
|
||||
},
|
||||
// Dugme
|
||||
submit: 'Pošalji poruku',
|
||||
// Status poruke
|
||||
successMessage: 'Hvala vam na poruci! Javiću vam se u najkraćem mogućem roku.',
|
||||
errorMessage: 'Izvinite, došlo je do greške prilikom slanja vaše poruke. Molimo pokušajte ponovo kasnije.',
|
||||
// Poruke o greškama
|
||||
errors: {
|
||||
nameRequired: 'Molimo unesite vaše ime',
|
||||
emailRequired: 'Molimo unesite vašu e-mail adresu',
|
||||
emailInvalid: 'Molimo unesite ispravnu e-mail adresu',
|
||||
messageRequired: 'Molimo unesite poruku'
|
||||
},
|
||||
// Aria oznake
|
||||
aria: {
|
||||
form: 'Kontakt formular',
|
||||
submitting: 'Slanje formulara',
|
||||
successAlert: 'Poruka o uspehu',
|
||||
errorAlert: 'Poruka o grešci'
|
||||
}
|
||||
} as const;
|
||||
|
||||
// Tip za tipsku sigurnost
|
||||
export type ContactFormTranslations = typeof contactform;
|
||||
@@ -0,0 +1,27 @@
|
||||
// src/i18n/locales/sr/pages/contact/contactinfo.ts
|
||||
export const contactinfo = {
|
||||
// Zaglavlje
|
||||
title: 'Kontakt informacije',
|
||||
description: 'Možete me kontaktirati na sledeće načine',
|
||||
// Oznake kontakt metoda
|
||||
addressLabel: 'Lokacija kancelarije',
|
||||
phoneLabel: 'Telefon',
|
||||
emailLabel: 'E-mail',
|
||||
// Kontakt informacije
|
||||
address: 'Rotdornallee, Köln',
|
||||
phone: '+49 175 695 0979',
|
||||
email: 'info@damjan-savic.com',
|
||||
// Dodatne informacije
|
||||
availabilityNote: 'Radno vreme: ponedeljak - petak, 9:00 - 17:00',
|
||||
// Aria oznake
|
||||
aria: {
|
||||
contactCard: 'Kartica kontakt informacija',
|
||||
addressLink: 'Otvori lokaciju u Google Maps',
|
||||
phoneLink: 'Pozovi',
|
||||
emailLink: 'Pošalji e-mail',
|
||||
externalLink: 'Otvara se u novom tabu'
|
||||
}
|
||||
} as const;
|
||||
|
||||
// Tip za tipsku sigurnost
|
||||
export type ContactInfoTranslations = typeof contactinfo;
|
||||
@@ -0,0 +1,71 @@
|
||||
// src/i18n/locales/sr/pages/contact/index.ts
|
||||
export const contact = {
|
||||
breadcrumb: "KONTAKT",
|
||||
hero: {
|
||||
title: "Radimo Zajedno",
|
||||
subtitle: "Imate projekat na umu? Hajde da razgovaramo o tome kako vam možemo pomoći da ostvarite svoje ciljeve."
|
||||
},
|
||||
contactInfo: {
|
||||
title: "Kontakt informacije",
|
||||
description: "Možete me kontaktirati na sledeće načine",
|
||||
address: {
|
||||
label: "Lokacija kancelarije",
|
||||
value: "Rotdornalle, Köln"
|
||||
},
|
||||
phone: {
|
||||
label: "Telefon",
|
||||
value: "+49 175 695 0979"
|
||||
},
|
||||
email: {
|
||||
label: "E-mail",
|
||||
value: "info@damjan-savic.com"
|
||||
},
|
||||
availabilityNote: "Radno vreme: ponedeljak - petak, 9:00 - 17:00",
|
||||
aria: {
|
||||
contactCard: "Kartica kontakt informacija",
|
||||
addressLink: "Otvori lokaciju u Google Maps",
|
||||
phoneLink: "Pozovi",
|
||||
emailLink: "Pošalji e-mail",
|
||||
externalLink: "Otvara se u novom tabu"
|
||||
}
|
||||
},
|
||||
contactForm: {
|
||||
title: "Kontaktirajte me",
|
||||
description: "Imate pitanja ili želite da sarađujemo? Pošaljite mi poruku.",
|
||||
name: {
|
||||
label: "Ime",
|
||||
placeholder: "Vaše puno ime"
|
||||
},
|
||||
email: {
|
||||
label: "E-mail",
|
||||
placeholder: "vasa.adresa@primer.com"
|
||||
},
|
||||
message: {
|
||||
label: "Poruka",
|
||||
placeholder: "Vaša poruka za mene..."
|
||||
},
|
||||
submit: "Pošalji poruku",
|
||||
successMessage: "Hvala vam na poruci! Javiću vam se u najkraćem mogućem roku.",
|
||||
errorMessage: "Izvinite, došlo je do greške prilikom slanja vaše poruke. Molimo pokušajte ponovo kasnije.",
|
||||
errors: {
|
||||
nameRequired: "Molimo unesite vaše ime",
|
||||
emailRequired: "Molimo unesite vašu e-mail adresu",
|
||||
emailInvalid: "Molimo unesite ispravnu e-mail adresu",
|
||||
messageRequired: "Molimo unesite poruku"
|
||||
},
|
||||
aria: {
|
||||
form: "Kontakt formular",
|
||||
submitting: "Slanje formulara",
|
||||
successAlert: "Poruka o uspehu",
|
||||
errorAlert: "Poruka o grešci"
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type ContactTranslations = typeof contact;
|
||||
|
||||
export default {
|
||||
pages: {
|
||||
contact: contact
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
// src/i18n/locales/sr/pages/dashboard.ts
|
||||
export const dashboard = {
|
||||
// SEO
|
||||
seo: {
|
||||
title: 'Analitički dashboard',
|
||||
description: 'Dashboard za analizu veb sajta'
|
||||
},
|
||||
// Glavni naslovi
|
||||
header: {
|
||||
title: 'Analitički dashboard',
|
||||
activeUsers: 'aktivnih korisnika'
|
||||
},
|
||||
// Kartice sa metrikama
|
||||
metrics: {
|
||||
pageViews: {
|
||||
title: 'Pregledi stranica',
|
||||
perMinute: 'po minutu'
|
||||
},
|
||||
uniqueVisitors: {
|
||||
title: 'Jedinstveni posetioci',
|
||||
currentlyActive: 'trenutno aktivni'
|
||||
},
|
||||
conversions: {
|
||||
title: 'Konverzije',
|
||||
rate: 'Stopa konverzije'
|
||||
},
|
||||
timeOnSite: {
|
||||
title: 'Prosečno vreme posete',
|
||||
bounceRate: 'Stopa napuštanja'
|
||||
}
|
||||
},
|
||||
// Sekcija najpopularnijih stranica
|
||||
topPages: {
|
||||
title: 'Najpopularnije stranice',
|
||||
columns: {
|
||||
path: 'Putanja',
|
||||
views: 'Pregledi',
|
||||
change: 'Promena'
|
||||
}
|
||||
},
|
||||
// Sekcija za praćenje događaja
|
||||
events: {
|
||||
title: 'Praćenje događaja',
|
||||
types: {
|
||||
contactForm: 'Slanje kontakt forme',
|
||||
portfolioView: 'Pregled portfolija',
|
||||
cvDownload: 'Preuzimanje biografije',
|
||||
blogRead: 'Čitanje bloga'
|
||||
}
|
||||
},
|
||||
// Status poruke
|
||||
status: {
|
||||
loading: 'Učitavanje dashboard-a...',
|
||||
error: 'Greška pri učitavanju podataka',
|
||||
notAuthenticated: 'Molimo prijavite se'
|
||||
},
|
||||
// Ostalo
|
||||
misc: {
|
||||
viewMore: 'Prikaži više',
|
||||
refresh: 'Osveži',
|
||||
period: {
|
||||
today: 'Danas',
|
||||
yesterday: 'Juče',
|
||||
last7Days: 'Poslednjih 7 dana',
|
||||
last30Days: 'Poslednjih 30 dana',
|
||||
thisMonth: 'Ovaj mesec',
|
||||
lastMonth: 'Prošli mesec'
|
||||
}
|
||||
},
|
||||
// Trendovi i promene
|
||||
trends: {
|
||||
increase: 'Porast',
|
||||
decrease: 'Pad',
|
||||
noChange: 'Bez promene'
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
// src/i18n/locales/sr/pages/home/about.ts
|
||||
export const about = {
|
||||
title: 'O Meni',
|
||||
content: 'Као старији програмер пуног стека и консултант за дигитална решења, специјализован сам за софтвер за предузећа, облак архитектуру и интеграцију вештачке интелигенције. Са седиштем у Келну, Немачка, помажем компанијама широм Европе да оптимизују своје пословне процесе кроз модерна технолошка решења. Моја експертиза обухвата развој скалабилних система, имплементацију облак архитектуре, као и интеграцију најновијих AI технологија. У компанији Ritter Digital GmbH радим на JTL интеграцијама и развијам прилагођена решења за дигиталну трансформацију. Један од кључних пројеката је била интеграција Breuninger ERP система са Apparel Magic платформом преко TB.One решења. Мој циљ је да омогућим компанијама да постану ефикасније и конкурентније кроз иновативна софтверска решења.',
|
||||
image: {
|
||||
alt: 'Damjan Savić (Дамјан Савић) - Старији програмер пуног стека и консултант за дигитална решења из Келна, Немачка'
|
||||
},
|
||||
buttons: {
|
||||
learnMore: 'Сазнај више',
|
||||
downloadCV: 'Преузми CV'
|
||||
}
|
||||
} as const;
|
||||
export type AboutTranslations = typeof about;
|
||||
@@ -0,0 +1,86 @@
|
||||
// src/i18n/locales/sr/pages/home/experience.ts
|
||||
export const experience = {
|
||||
title: 'Radno iskustvo',
|
||||
navigation: {
|
||||
prev: '←',
|
||||
next: '→'
|
||||
},
|
||||
positions: [
|
||||
{
|
||||
role: 'Specijalist za automatizaciju procesa',
|
||||
company: 'Everlast Consulting GmbH',
|
||||
period: '12/2024 - DANAS',
|
||||
highlights: [
|
||||
'Razvoj AI agenata sa n8n i Zapier',
|
||||
'Izrada web scraping rešenja',
|
||||
'Migracija sa Power Automate na n8n'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'Consultant Digital Solutions',
|
||||
company: 'Ritter Digital GmbH',
|
||||
period: '08/2023 - 11/2024',
|
||||
highlights: [
|
||||
'Backend servisi na dedikovanim serverima',
|
||||
'AI integracija preko Power Automate',
|
||||
'RFID/IoT rešenja sa Zebra hardverom'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'ERP integracioni specijalista i E-Commerce developer',
|
||||
company: 'Joyce & Girls',
|
||||
period: '01/2023 - 08/2023',
|
||||
highlights: [
|
||||
'ApparelMagic i TradeByte integracija',
|
||||
'MariaDB middleware razvoj',
|
||||
'Windows Server administracija',
|
||||
'Shopify optimizacija'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'RPA Developer & E-Commerce Manager',
|
||||
company: 'C&S Marketing',
|
||||
period: '08/2022 - 01/2023',
|
||||
highlights: [
|
||||
'Shopware 6 i JTL integracija',
|
||||
'Python automatizacija',
|
||||
'Google Ads optimizacija',
|
||||
'CMS menadžment'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'E-Commerce Developer',
|
||||
company: 'Brands Club GmbH',
|
||||
period: '08/2021 - 07/2022',
|
||||
highlights: [
|
||||
'Shopify i JTL integracija',
|
||||
'Server administracija',
|
||||
'Produkcija sadržaja',
|
||||
'Marketing automatizacija'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'E-Commerce Developer',
|
||||
company: 'Feine Uhren Eupen',
|
||||
period: '01/2021 - 08/2021',
|
||||
highlights: [
|
||||
'Shopware 5 razvoj',
|
||||
'Fotografija proizvoda',
|
||||
'Prodaja u segmentu luksuznih satova',
|
||||
'E-Commerce menadžment'
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'Online Marketing Manager',
|
||||
company: 'Ufer8, Ambis, Teatro & Die Halle Tor 2',
|
||||
period: '01/2018 - 12/2020',
|
||||
highlights: [
|
||||
'Social Media sadržaj',
|
||||
'Event marketing',
|
||||
'Organizacija događaja',
|
||||
'Marketing automatizacija'
|
||||
]
|
||||
}
|
||||
]
|
||||
} as const;
|
||||
export type ExperienceTranslations = typeof experience;
|
||||
@@ -0,0 +1,27 @@
|
||||
// src/i18n/locales/sr/pages/home/expertise.ts
|
||||
export const expertise = {
|
||||
title: 'Oblasti ekspertize',
|
||||
areas: [
|
||||
{
|
||||
title: 'ERP Integracija',
|
||||
description: 'Ekspert za JTL-Wawi implementaciju, konfiguraciju i optimizaciju. Specijalizovan za sisteme za upravljanje robom i POS integraciju.',
|
||||
skills: ['JTL-Wawi', 'JTL-WMS', 'JTL-POS', 'Apparel Magic']
|
||||
},
|
||||
{
|
||||
title: 'Razvoj',
|
||||
description: 'Full-Stack razvoj sa fokusom na Python automatizaciju, React frontende i dizajn baza podataka.',
|
||||
skills: ['Python', 'React/Next.js', 'MariaDB', 'Docker']
|
||||
},
|
||||
{
|
||||
title: 'E-Commerce',
|
||||
description: 'Obimno iskustvo sa različitim e-commerce platformama i integracijama sa marketplace-ima.',
|
||||
skills: ['Shopify', 'Shopware', 'WooCommerce', 'API Integration']
|
||||
},
|
||||
{
|
||||
title: 'Digitalni Marketing',
|
||||
description: 'Strateški pristup u digitalnom marketingu sa fokusom na automatizaciju i analitiku.',
|
||||
skills: ['Google Ads', 'Meta Ads', 'SEO', 'Analytics']
|
||||
}
|
||||
]
|
||||
} as const;
|
||||
export type ExpertiseTranslations = typeof expertise;
|
||||
@@ -0,0 +1,31 @@
|
||||
// src/i18n/locales/sr/pages/home/hero.ts
|
||||
export const hero = {
|
||||
title: 'AI & AUTOMATION SPECIALIST',
|
||||
name: 'DAMJAN SAVIĆ',
|
||||
subtitle: 'AI AGENTI | VOICE AI | AUTOMATIZACIJA PROCESA',
|
||||
description: 'Razvoj AI agenata i rešenja za automatizaciju. Od voice AI platformi do autonomnih web agenata.',
|
||||
currentRole: 'Trenutno @ Everlast Consulting GmbH',
|
||||
cta: 'KONTAKTIRAJTE ME',
|
||||
image: {
|
||||
alt: 'Damjan Savić (Дамјан Савић) - AI & Automation Specialist | AI Agenti, Voice AI & Automatizacija'
|
||||
},
|
||||
social: {
|
||||
getInTouch: 'Kontaktirajte me',
|
||||
linkedin: {
|
||||
title: 'Posetite moj LinkedIn profil'
|
||||
},
|
||||
github: {
|
||||
title: 'Posetite moj GitHub profil'
|
||||
},
|
||||
email: {
|
||||
title: 'Pošaljite mi e-mail'
|
||||
}
|
||||
},
|
||||
navigation: {
|
||||
experience: 'ISKUSTVO',
|
||||
skills: 'VEŠTINE',
|
||||
projects: 'PROJEKTI',
|
||||
about: 'O MENI'
|
||||
}
|
||||
} as const;
|
||||
export type HeroTranslations = typeof hero;
|
||||
@@ -0,0 +1,25 @@
|
||||
// src/i18n/locales/de/pages/home/index.ts
|
||||
import { hero } from './hero';
|
||||
import { about } from './about';
|
||||
import { experience } from './experience';
|
||||
import { expertise } from './expertise';
|
||||
import { skills } from './skills';
|
||||
import { projects } from './projects';
|
||||
export const home = {
|
||||
hero,
|
||||
about,
|
||||
experience,
|
||||
expertise,
|
||||
skills,
|
||||
projects
|
||||
} as const;
|
||||
export type HomeTranslations = typeof home;
|
||||
// Re-export individual sections for direct access
|
||||
export {
|
||||
hero,
|
||||
about,
|
||||
experience,
|
||||
expertise,
|
||||
skills,
|
||||
projects
|
||||
};
|
||||
@@ -0,0 +1,10 @@
|
||||
// src/i18n/locales/sr/pages/home/projects.ts
|
||||
export const projects = {
|
||||
title: 'Portfolio',
|
||||
viewAll: 'Svi projekti →',
|
||||
loading: 'Učitavanje projekata...',
|
||||
error: {
|
||||
loading: 'Greška pri učitavanju projekata'
|
||||
}
|
||||
} as const;
|
||||
export type ProjectsTranslations = typeof projects;
|
||||
@@ -0,0 +1,41 @@
|
||||
// src/i18n/locales/sr/pages/home/skills.ts
|
||||
export const skills = {
|
||||
title: 'Veštine',
|
||||
skills: [
|
||||
{
|
||||
name: 'AI & LLMs',
|
||||
level: 90,
|
||||
description: 'GPT-4, Claude API, Vapi Voice AI'
|
||||
},
|
||||
{
|
||||
name: 'Automatizacija',
|
||||
level: 85,
|
||||
description: 'n8n, Zapier, Power Automate'
|
||||
},
|
||||
{
|
||||
name: 'Python',
|
||||
level: 90,
|
||||
description: 'Backend, API-ji, Automatizacija'
|
||||
},
|
||||
{
|
||||
name: 'TypeScript',
|
||||
level: 85,
|
||||
description: 'React, Next.js, Node.js'
|
||||
},
|
||||
{
|
||||
name: 'Baze podataka',
|
||||
level: 85,
|
||||
description: 'PostgreSQL, Supabase, MariaDB'
|
||||
},
|
||||
{
|
||||
name: 'DevOps',
|
||||
level: 75,
|
||||
description: 'Docker, Vercel, Dedicated Servers'
|
||||
}
|
||||
],
|
||||
aria: {
|
||||
skillLevel: 'Nivo veštine',
|
||||
selectSkill: 'Izaberite veštinu'
|
||||
}
|
||||
} as const;
|
||||
export type SkillsTranslations = typeof skills;
|
||||
@@ -0,0 +1,54 @@
|
||||
// src/i18n/locales/sr/pages/login.ts
|
||||
export const login = {
|
||||
// SEO
|
||||
seo: {
|
||||
title: 'Prijava',
|
||||
description: 'Prijavite se za pristup dashboard-u'
|
||||
},
|
||||
// Glavni naslov
|
||||
header: {
|
||||
title: 'Prijava na dashboard'
|
||||
},
|
||||
// Formular
|
||||
form: {
|
||||
// Polja
|
||||
email: {
|
||||
label: 'E-mail adresa',
|
||||
placeholder: 'vas.email@primer.com'
|
||||
},
|
||||
password: {
|
||||
label: 'Lozinka',
|
||||
placeholder: 'Vaša lozinka'
|
||||
},
|
||||
// Dugmad
|
||||
submit: {
|
||||
default: 'Prijavi se',
|
||||
loading: 'Prijava u toku...'
|
||||
},
|
||||
// Poruke o greškama
|
||||
errors: {
|
||||
default: 'Došlo je do greške',
|
||||
invalidCredentials: 'Neispravni podaci za prijavu',
|
||||
emailRequired: 'Molimo unesite vašu e-mail adresu',
|
||||
passwordRequired: 'Molimo unesite vašu lozinku',
|
||||
emailInvalid: 'Molimo unesite važeću e-mail adresu'
|
||||
}
|
||||
},
|
||||
// Linkovi i pomoć
|
||||
help: {
|
||||
forgotPassword: 'Zaboravili ste lozinku?',
|
||||
needHelp: 'Potrebna vam je pomoć?',
|
||||
contactSupport: 'Kontaktirajte podršku'
|
||||
},
|
||||
// Status poruke
|
||||
status: {
|
||||
authenticating: 'Autentifikacija...',
|
||||
success: 'Uspešna prijava',
|
||||
redirecting: 'Preusmeravanje na dashboard...'
|
||||
},
|
||||
// Bezbednosna obaveštenja
|
||||
security: {
|
||||
secureConnection: 'Bezbedna veza',
|
||||
privacyNote: 'Vaši podaci se prenose u šifrovanom obliku'
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
// src/i18n/locales/sr/pages/notfound.ts
|
||||
export const notfound = {
|
||||
// SEO
|
||||
seo: {
|
||||
title: '404 - Stranica nije pronađena',
|
||||
description: 'Tražena stranica ne postoji.'
|
||||
},
|
||||
// Glavni sadržaj
|
||||
content: {
|
||||
errorCode: '404',
|
||||
title: 'Stranica nije pronađena',
|
||||
description: 'Tražena stranica ne postoji ili je premeštena.',
|
||||
},
|
||||
// Akciona dugmad
|
||||
actions: {
|
||||
goBack: 'Nazad',
|
||||
homePage: 'Početna'
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,117 @@
|
||||
// src/i18n/locales/sr/pages/portfolio.ts
|
||||
export const portfolio = {
|
||||
// SEO i meta informacije
|
||||
seo: {
|
||||
title: 'Portfolio - Damjan Savić',
|
||||
description: 'Otkrijte moje projekte u oblasti JTL integracije, e-commerce-a i digitalne transformacije.'
|
||||
},
|
||||
// Glavna stranica
|
||||
main: {
|
||||
title: 'Portfolio',
|
||||
loading: 'Učitavanje projekata...',
|
||||
error: 'Greška pri učitavanju projekata',
|
||||
noProjects: {
|
||||
title: 'Nije pronađen nijedan projekat',
|
||||
description: 'Trenutno nema dostupnih projekata. Posetite nas ponovo kasnije.'
|
||||
}
|
||||
},
|
||||
// Kartice projekata
|
||||
projectCard: {
|
||||
date: 'Datum',
|
||||
technologies: 'Tehnologije',
|
||||
moreCount: 'još', // za '+X još'
|
||||
readMore: 'Saznaj više'
|
||||
},
|
||||
// Detalji projekta
|
||||
project: {
|
||||
loading: 'Učitavanje projekta...',
|
||||
backToPortfolio: 'Nazad na portfolio',
|
||||
notFound: {
|
||||
title: 'Projekat nije pronađen',
|
||||
description: 'Traženi projekat nije pronađen.'
|
||||
},
|
||||
navigation: {
|
||||
back: 'Nazad na portfolio',
|
||||
projectDetails: 'DETALJI PROJEKTA'
|
||||
},
|
||||
metadata: {
|
||||
date: 'Datum',
|
||||
client: 'Klijent',
|
||||
duration: 'Trajanje',
|
||||
repository: 'Repozitorijum',
|
||||
documentation: 'Dokumentacija',
|
||||
technologies: 'Tehnologije',
|
||||
live: 'Uživo'
|
||||
},
|
||||
sections: {
|
||||
overview: 'Pregled',
|
||||
challenge: 'Izazov',
|
||||
solution: 'Rešenje',
|
||||
results: 'Rezultati',
|
||||
systemArchitecture: 'Sistemska arhitektura',
|
||||
implementation: 'Implementacija',
|
||||
technologies: 'Korišćene tehnologije'
|
||||
}
|
||||
},
|
||||
// Kategorije i filteri
|
||||
categories: {
|
||||
all: 'Sve',
|
||||
'Data Science': 'Data Science',
|
||||
'AI Development': 'AI razvoj',
|
||||
'Integration': 'Integracija',
|
||||
'Full-Stack Development': 'Full-Stack razvoj',
|
||||
'Data Processing': 'Obrada podataka',
|
||||
'Content Production': 'Produkcija sadržaja',
|
||||
'Machine Learning': 'Machine Learning',
|
||||
'Automation': 'Automatizacija'
|
||||
},
|
||||
// Specifični projekti
|
||||
projects: {
|
||||
'ai-data-reader': {
|
||||
title: 'AI održavanje podataka o proizvodima iz PDF fajlova',
|
||||
description: 'Razvoj automatizovanog sistema za ekstrakciju i strukturiranje podataka o proizvodima iz PDF dokumenata'
|
||||
},
|
||||
'bi-vision': {
|
||||
title: 'AI video za BI softver',
|
||||
description: 'Razvoj video objašnjenja zasnovanih na AI za Business Intelligence dashboard-e'
|
||||
},
|
||||
'business-intelligence-ai': {
|
||||
title: 'AI za Business Intelligence',
|
||||
description: 'Integracija AI modela u Business Intelligence sisteme za optimizaciju procesa'
|
||||
},
|
||||
'claude-personal-assistant': {
|
||||
title: 'AI lični asistent sa Claude AI',
|
||||
description: 'Razvoj personalizovanog AI asistenta za profesionalnu e-mail komunikaciju'
|
||||
},
|
||||
'e-commerce-integration': {
|
||||
title: 'Integracija sa TradeByte-om',
|
||||
description: 'Integracija Shopify prodavnice sa JTL-WaWi za optimizovano upravljanje zalihama'
|
||||
},
|
||||
'jtl-integration-project': {
|
||||
title: 'JTL integracioni referentni projekat',
|
||||
description: 'Kompletan sistem za upravljanje skladištem u Krefeld-u baziran na JTL-u'
|
||||
},
|
||||
'local-llm-training': {
|
||||
title: 'Treniranje lokalnih AI modela',
|
||||
description: 'Razvoj pipeline-a za treniranje i fino podešavanje lokalnih AI modela'
|
||||
},
|
||||
'processautomation': {
|
||||
title: 'Automatizacija sa Python-om',
|
||||
description: 'Razvoj automatizacionih rešenja za poslovne procese'
|
||||
},
|
||||
'rfid-automation': {
|
||||
title: 'RFID automatizacija',
|
||||
description: 'Razvoj automatizovanog sistema za kreiranje i štampanje RFID etiketa'
|
||||
},
|
||||
'timetracking-software': {
|
||||
title: 'Digitalna evidencija radnog vremena',
|
||||
description: 'Razvoj modernog rešenja za evidenciju radnog vremena sa Next.js, Flask i MSSQL'
|
||||
}
|
||||
},
|
||||
// Status poruke
|
||||
status: {
|
||||
loading: 'Učitavanje...',
|
||||
error: 'Došlo je do greške',
|
||||
success: 'Uspešno učitano'
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,96 @@
|
||||
// src/i18n/locales/sr/pages/privacy.ts
|
||||
export const privacy = {
|
||||
// SEO i šema
|
||||
seo: {
|
||||
title: 'Politika privatnosti',
|
||||
description: 'Politika privatnosti za portfolio sajt Damjana Savića'
|
||||
},
|
||||
schema: {
|
||||
name: 'Politika privatnosti',
|
||||
description: 'Politika privatnosti za portfolio sajt Damjana Savića'
|
||||
},
|
||||
// Glavni sadržaj
|
||||
content: {
|
||||
title: 'Politika privatnosti',
|
||||
lastUpdated: 'Poslednje ažuriranje: 10. mart 2024.',
|
||||
// Navigacija
|
||||
breadcrumbs: {
|
||||
currentTitle: 'Politika privatnosti'
|
||||
},
|
||||
// Sekcije
|
||||
sections: {
|
||||
introduction: {
|
||||
title: '1. Uvod',
|
||||
content: 'Ova politika privatnosti objašnjava kako prikupljamo, koristimo i štitimo vaše lične podatke prilikom korišćenja našeg sajta.'
|
||||
},
|
||||
dataCollection: {
|
||||
title: '2. Prikupljanje podataka',
|
||||
providedInfo: {
|
||||
title: '2.1 Informacije koje vi dostavljate',
|
||||
intro: 'Prilikom korišćenja našeg kontakt formulara, prikupljamo:',
|
||||
items: [
|
||||
'Ime',
|
||||
'E-mail adresu',
|
||||
'Sadržaj poruke'
|
||||
]
|
||||
},
|
||||
automaticInfo: {
|
||||
title: '2.2 Automatski prikupljene informacije',
|
||||
intro: 'Automatski prikupljamo:',
|
||||
items: [
|
||||
'IP adresu',
|
||||
'Tip pretraživača',
|
||||
'Informacije o uređaju',
|
||||
'Posećene stranice',
|
||||
'Vreme provedeno na sajtu'
|
||||
]
|
||||
}
|
||||
},
|
||||
dataUsage: {
|
||||
title: '3. Korišćenje vaših podataka',
|
||||
intro: 'Vaše podatke koristimo za:',
|
||||
items: [
|
||||
'Odgovaranje na vaše upite',
|
||||
'Unapređenje našeg sajta',
|
||||
'Analizu obrazaca korišćenja',
|
||||
'Prevenciju prevara'
|
||||
]
|
||||
},
|
||||
cookies: {
|
||||
title: '4. Kolačići',
|
||||
intro: 'Kolačiće koristimo za:',
|
||||
items: [
|
||||
'Čuvanje vaših podešavanja',
|
||||
'Analizu saobraćaja na sajtu',
|
||||
'Razumevanje ponašanja korisnika'
|
||||
]
|
||||
},
|
||||
security: {
|
||||
title: '5. Bezbednost podataka',
|
||||
intro: 'Implementiramo odgovarajuće bezbednosne mere za zaštitu vaših ličnih podataka, uključujući:',
|
||||
items: [
|
||||
'Enkripciju prenosa podataka',
|
||||
'Redovne bezbednosne procene',
|
||||
'Kontrole pristupa',
|
||||
'Bezbedno skladištenje podataka'
|
||||
]
|
||||
},
|
||||
rights: {
|
||||
title: '6. Vaša prava',
|
||||
intro: 'Imate pravo na:',
|
||||
items: [
|
||||
'Pristup vašim ličnim podacima',
|
||||
'Ispravku podataka',
|
||||
'Brisanje podataka',
|
||||
'Prigovor na obradu podataka',
|
||||
'Prenosivost podataka'
|
||||
]
|
||||
},
|
||||
contact: {
|
||||
title: '7. Kontakt informacije',
|
||||
intro: 'Za pitanja u vezi sa privatnošću kontaktirajte nas na:',
|
||||
email: 'E-mail: privacy@damjan-savic.com'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,59 @@
|
||||
// src/i18n/locales/sr/pages/terms.ts
|
||||
export const terms = {
|
||||
// SEO i šema
|
||||
seo: {
|
||||
title: 'Uslovi korišćenja',
|
||||
description: 'Uslovi korišćenja za portfolio sajt Damjana Savića'
|
||||
},
|
||||
schema: {
|
||||
name: 'Uslovi korišćenja',
|
||||
description: 'Uslovi korišćenja za portfolio sajt Damjana Savića'
|
||||
},
|
||||
// Glavni sadržaj
|
||||
content: {
|
||||
title: 'Uslovi korišćenja',
|
||||
lastUpdated: 'Poslednje ažuriranje: 10. mart 2024.',
|
||||
// Navigacija
|
||||
breadcrumbs: {
|
||||
currentTitle: 'Uslovi korišćenja'
|
||||
},
|
||||
// Sekcije
|
||||
sections: {
|
||||
agreement: {
|
||||
title: '1. Prihvatanje uslova',
|
||||
content: 'Pristupom našem sajtu prihvatate da ste obavezani ovim Uslovima korišćenja i da ćete se pridržavati svih važećih zakona i propisa.'
|
||||
},
|
||||
intellectualProperty: {
|
||||
title: '2. Prava intelektualne svojine',
|
||||
content: 'Sav sadržaj ovog sajta, uključujući ali ne ograničavajući se na tekstove, grafike, logotipe, slike i softver, vlasništvo je Damjana Savića i zaštićen je zakonima o intelektualnoj svojini.'
|
||||
},
|
||||
userResponsibilities: {
|
||||
title: '3. Odgovornosti korisnika',
|
||||
intro: 'Korišćenjem našeg sajta pristajete da:',
|
||||
items: [
|
||||
'Pružate tačne informacije',
|
||||
'Koristite sajt legalno i etički',
|
||||
'Ne pokušavate neovlašćeni pristup',
|
||||
'Ne ometate rad sajta'
|
||||
]
|
||||
},
|
||||
liability: {
|
||||
title: '4. Ograničenje odgovornosti',
|
||||
content: 'Ne snosimo odgovornost za indirektne, slučajne, posebne, posledične ili kaznene štete koje proizilaze iz vašeg korišćenja ili nemogućnosti korišćenja sajta.'
|
||||
},
|
||||
changes: {
|
||||
title: '5. Izmene uslova',
|
||||
content: 'Zadržavamo pravo da izmenimo ove uslove u bilo kom trenutku. O značajnim izmenama ćemo obavestiti korisnike objavljivanjem novih Uslova korišćenja na ovoj stranici.'
|
||||
},
|
||||
governingLaw: {
|
||||
title: '6. Merodavno pravo',
|
||||
content: 'Ovi uslovi podležu zakonima Savezne Republike Nemačke i tumače se u skladu sa njima, bez obzira na sukob pravnih normi.'
|
||||
},
|
||||
contact: {
|
||||
title: '7. Kontakt informacije',
|
||||
intro: 'Za pitanja u vezi sa ovim Uslovima korišćenja kontaktirajte nas na:',
|
||||
email: 'E-mail: legal@damjan-savic.com'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
// src/i18n/locales/sr/portfolio/index.ts
|
||||
import { aiDataReader } from './projects/ai-data-reader';
|
||||
import kamenpro from './projects/kamenpro';
|
||||
import smartWarehouse from './projects/smart-warehouse';
|
||||
import powerPlatformGovernance from './projects/power-platform-governance';
|
||||
import websiteMitKi from './projects/website-mit-ki';
|
||||
import aiMusicProduction from './projects/ai-music-production';
|
||||
import automatedAdCreatives from './projects/automated-ad-creatives';
|
||||
import cursorIde from './projects/cursor-ide';
|
||||
export const portfolio = {
|
||||
// Meta informacije za portfolio stranicu
|
||||
seo: {
|
||||
title: 'Portfolio - Damjan Savić',
|
||||
description: 'Otkrijte moje projekte u oblasti JTL integracije, e-commerce-a i digitalne transformacije.'
|
||||
},
|
||||
// Portfolio naslovi i filteri
|
||||
sections: {
|
||||
title: 'Portfolio',
|
||||
subtitle: 'Odabrani projekti i reference',
|
||||
filterTitle: 'Kategorije',
|
||||
sortTitle: 'Sortiranje'
|
||||
},
|
||||
// Opcije filtera
|
||||
filters: {
|
||||
all: 'Sve',
|
||||
categories: {
|
||||
'Data Science': 'Data Science',
|
||||
'AI Development': 'AI razvoj',
|
||||
'Integration': 'Integracija',
|
||||
'Full-Stack Development': 'Full-Stack razvoj',
|
||||
'Data Processing': 'Obrada podataka',
|
||||
'Content Production': 'Produkcija sadržaja',
|
||||
'Machine Learning': 'Machine Learning',
|
||||
'Automation': 'Automatizacija',
|
||||
'Web Development': 'Web razvoj',
|
||||
'AI & Automation': 'AI & Automatizacija',
|
||||
'Enterprise Software': 'Enterprise Software'
|
||||
}
|
||||
},
|
||||
// Opcije sortiranja
|
||||
sort: {
|
||||
date: 'Datum',
|
||||
title: 'Naslov',
|
||||
category: 'Kategorija'
|
||||
},
|
||||
// UI tekstovi
|
||||
ui: {
|
||||
loading: 'Učitavanje projekata...',
|
||||
noProjects: 'Nije pronađen nijedan projekat',
|
||||
viewProject: 'Pogledaj projekat',
|
||||
backToPortfolio: 'Nazad na portfolio',
|
||||
technologies: 'Tehnologije',
|
||||
client: 'Klijent',
|
||||
duration: 'Trajanje',
|
||||
visitWebsite: 'Poseti sajt',
|
||||
viewRepository: 'Pogledaj repozitorijum',
|
||||
viewDocumentation: 'Dokumentacija'
|
||||
},
|
||||
// Svi projekti
|
||||
projects: {
|
||||
'ai-data-reader': aiDataReader,
|
||||
'kamenpro': kamenpro,
|
||||
'smart-warehouse': smartWarehouse,
|
||||
'power-platform-governance': powerPlatformGovernance,
|
||||
'website-mit-ki': websiteMitKi,
|
||||
'ai-music-production': aiMusicProduction,
|
||||
'automated-ad-creatives': automatedAdCreatives,
|
||||
'cursor-ide': cursorIde,
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,107 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/ai-data-reader.ts
|
||||
export const aiDataReader = {
|
||||
meta: {
|
||||
slug: 'ai-data-reader',
|
||||
title: "Veštačka inteligencija za ekstrakciju podataka iz PDF dokumenata",
|
||||
description: "Razvoj automatizovanog sistema za ekstrakciju i strukturiranje podataka o proizvodima iz PDF dokumenata",
|
||||
excerpt: "Integracija Claude AI za inteligentnu obradu informacija o proizvodima i besprekornu JTL-ERP integraciju.",
|
||||
date: "2025-02",
|
||||
category: "Data Processing",
|
||||
client: "Amazon Seller",
|
||||
duration: "2 meseca",
|
||||
url: "https://www.damjan-savic.com",
|
||||
repository: "",
|
||||
documentation: "",
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ["Python", "FastAPI", "Claude AI", "PyPDF", "Pydantic", "JTL-Wawi"],
|
||||
tags: ["Ekstrakcija podataka", "ERP", "Automatizacija procesa", "PDF obrada"]
|
||||
},
|
||||
content: {
|
||||
intro: "AI sistem za automatizovanu ekstrakciju podataka o proizvodima iz PDF dokumenata sa direktnom integracijom u JTL sisteme za upravljanje robom, razvijen za maksimalnu efikasnost u održavanju podataka o proizvodima.",
|
||||
|
||||
challenge: {
|
||||
title: "Izazov",
|
||||
description: "Ručna obrada podataka o proizvodima iz PDF dokumenata bila je vremenski zahtevna i podložna greškama.",
|
||||
points: [
|
||||
"Velika količina PDF dokumenata sa informacijama o proizvodima",
|
||||
"Vremenski zahtevno ručno unošenje podataka",
|
||||
"Nekonzistentan kvalitet podataka",
|
||||
"Visoki zahtevi za osobljem"
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: "Naše rešenje",
|
||||
description: "Razvoj AI sistema za automatizovanu ekstrakciju podataka",
|
||||
content: "Koristeći Claude AI i moderne Python tehnologije, stvorili smo potpuno automatizovano rešenje koje obrađuje PDF dokumente i integriše izdvojene podatke direktno u JTL sistem za upravljanje robom.",
|
||||
points: [
|
||||
"Automatizovana obrada PDF-ova",
|
||||
"AI ekstrakcija podataka",
|
||||
"Inteligentna validacija podataka",
|
||||
"Besprekorna JTL integracija"
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: "Tehnička implementacija",
|
||||
description: "Rešenje je zasnovano na modularnoj Python arhitekturi sa nekoliko ključnih komponenti:",
|
||||
points: [
|
||||
"Robusna ekstrakcija teksta iz PDF-a sa PyPDF",
|
||||
"AI ekstrakcija podataka sa Claude AI",
|
||||
"Validacija kroz Pydantic modele",
|
||||
"JTL-ERP integracija preko CSV izvoza"
|
||||
],
|
||||
code: `class ProductData(BaseModel):
|
||||
artikel_nummer: str
|
||||
name: str
|
||||
hersteller: str
|
||||
inhaltsstoffe: List[str]
|
||||
allergene: List[str]
|
||||
naehrwerte: NaehrwertData
|
||||
nettogewicht: str
|
||||
vegan: bool
|
||||
vegetarisch: bool
|
||||
|
||||
def _extract_with_claude(self, prompt: str) -> Dict[str, Any]:
|
||||
'''Ekstrahuje strukturirane podatke sa Claude AI.'''
|
||||
response = self.client.messages.create(
|
||||
model='claude-3-sonnet-20240229',
|
||||
messages=[{
|
||||
'role': 'user',
|
||||
'content': prompt
|
||||
}]
|
||||
)
|
||||
return self._clean_json_string(response.content)`
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: "Proces implementacije",
|
||||
description: "Automatizovani tok rada je implementiran u nekoliko faza:",
|
||||
points: [
|
||||
"Batch obrada PDF-ova iz ulaznog direktorijuma",
|
||||
"Inteligentno prepoznavanje i strukturiranje teksta",
|
||||
"Višeslojna logika validacije",
|
||||
"Robusno rukovanje greškama",
|
||||
"Integracija sa postojećim sistemima"
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: "Rezultati i uticaj",
|
||||
description: "Implementacija je dovela do značajnih poboljšanja u poslovnim procesima:",
|
||||
points: [
|
||||
"90% uštede vremena u održavanju podataka o proizvodima",
|
||||
"99% preciznost u ekstrakciji podataka",
|
||||
"Eliminacija ručnog unosa podataka",
|
||||
"Standardizovan kvalitet podataka o proizvodima",
|
||||
"Značajno smanjena stopa grešaka"
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: "Razvijeni sistem je revolucionirao upravljanje podacima o proizvodima. Kombinovanjem AI tehnologije sa automatizovanom obradom podataka, ne samo da smo drastično povećali efikasnost već smo i značajno poboljšali kvalitet podataka. Projekat impresivno demonstrira kako moderna AI rešenja mogu rešiti praktične poslovne probleme."
|
||||
}
|
||||
};
|
||||
|
||||
// Re-export za kompatibilnost sa sistemom za uvoz projekata
|
||||
export default aiDataReader;
|
||||
@@ -0,0 +1,114 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/ai-music-production.ts
|
||||
export const aiMusicProduction = {
|
||||
meta: {
|
||||
slug: 'ai-music-production',
|
||||
title: "Suno AI - Muzička produkcija uz pomoć VI | Od teksta do gotovog tracka",
|
||||
description: "Kompletan workflow za muzičku produkciju sa Suno AI: pisanje tekstova, generisanje instrumentala, miksovanje stilova i objavljivanje na Soundcloud-u.",
|
||||
excerpt: "Muzička produkcija uz pomoć VI sa Suno AI. Od ručno napisanog teksta do gotovog tracka za 2-3 sata - uključujući dizajn covera i upload na Soundcloud.",
|
||||
date: "2025-01",
|
||||
category: "VI & Kreativa",
|
||||
client: "Lični projekat",
|
||||
duration: "U toku",
|
||||
url: "https://soundcloud.com/desetka",
|
||||
videoUrl: "https://www.tella.tv/video/musikproduktion-per-ki-mit-damjan-savic-desetka-1-2mjh",
|
||||
repository: "",
|
||||
documentation: "",
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ["Suno AI", "Soundcloud", "Pinterest", "Photoshop", "VI Muzička Produkcija"],
|
||||
tags: ["Suno AI", "Muzička Produkcija", "VI Muzika", "Desetka", "Soundcloud", "Kreativna VI"]
|
||||
},
|
||||
content: {
|
||||
intro: "Muzička produkcija uz pomoć VI: Kompletan workflow za kreiranje profesionalnih pesama sa Suno AI. Od ideje preko teksta do gotovog tracka na Soundcloud-u - sve u strukturiranom procesu.",
|
||||
|
||||
challenge: {
|
||||
title: "Izazov",
|
||||
description: "Tradicionalna muzička produkcija zahteva opsežne resurse i veštine.",
|
||||
points: [
|
||||
"Klasična muzička produkcija zahteva skup softver i hardver",
|
||||
"Instrumentalisti i producenti moraju biti koordinisani",
|
||||
"Proces produkcije često traje nedeljama ili mesecima",
|
||||
"Visoke prepreke za umetnike bez muzičkog obrazovanja",
|
||||
"Kreativne vizije je teško brzo realizovati"
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: "Rešenje",
|
||||
description: "Strukturiran VI workflow za efikasnu muzičku produkciju",
|
||||
content: "Sa Suno AI, ceo proces muzičke produkcije može se svesti na samo nekoliko sati. Workflow kombinuje ljudsku kreativnost (tekstovi) sa VI-generisanom muzikom za autentične, profesionalne rezultate.",
|
||||
points: [
|
||||
"Tekstovi se pišu ručno - puna kreativna kontrola",
|
||||
"Suno AI generiše instrumentale na osnovu style prompta",
|
||||
"Iterativno remiksovanje za savršen zvuk",
|
||||
"Dizajn covera sa Pinterest inspiracijom i Photoshop-om",
|
||||
"Direktan upload na Soundcloud pod aliasom 'Desetka'"
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: "Workflow",
|
||||
description: "Korak po korak proces za VI muzičku produkciju:",
|
||||
points: [
|
||||
"Pisanje teksta sa jasnom šemom rima (npr. završeci na e, a, i)",
|
||||
"Mentalno razvijanje melodije tokom pisanja",
|
||||
"Generisanje instrumentala u Suno AI sa style promptovima",
|
||||
"Konfiguracija Weirdness (35%) i Audio Influence (75%)",
|
||||
"Miksovanje različitih stilova (npr. Synthwave → Luxury Rap)",
|
||||
"Lajkovanje favorita za VI efekat učenja",
|
||||
"Pronalaženje covera na Pinterest-u i obrada u Photoshop-u (1950x1950px)",
|
||||
"WAV eksport i upload na Soundcloud"
|
||||
],
|
||||
code: `// Suno AI Style Konfiguracija
|
||||
const sunoConfig = {
|
||||
name: "205 Matrica Instrumental",
|
||||
settings: {
|
||||
weirdness: "35%",
|
||||
styleInfluence: "75%",
|
||||
audioInfluence: "25-35%" // Niže za remastered
|
||||
},
|
||||
styles: [
|
||||
"Synthwave",
|
||||
"Melodic RIP",
|
||||
"Luxury Rap"
|
||||
],
|
||||
tips: [
|
||||
"Lajkovane pesme utiču na buduće generacije",
|
||||
"Za artefakte: smanjiti Audio Influence",
|
||||
"Kombinovati stilove za jedinstven zvuk"
|
||||
]
|
||||
};`
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: "Kreativni proces",
|
||||
description: "Umetnost pisanja pesama uz VI podršku:",
|
||||
points: [
|
||||
"Pisanje tekstova na srpskom (melodičan zvuk)",
|
||||
"Jasna šema rima za hook i strofe",
|
||||
"Mentalno razvijanje melodije pre produkcije",
|
||||
"Nisu potrebni instrumentali za početne ideje",
|
||||
"Prevod na engleski moguć kasnije",
|
||||
"2-3 sata za kompletnu pesmu",
|
||||
"U dobrim danima: 3 pesme po satu moguće"
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: "Rezultati",
|
||||
description: "Prednosti VI muzičke produkcije:",
|
||||
points: [
|
||||
"Vreme produkcije smanjeno sa nedelja na sate",
|
||||
"Puna kreativna kontrola nad tekstovima i pravcem",
|
||||
"Profesionalni instrumentali bez studija",
|
||||
"Iterativan rad do savršenog zvuka",
|
||||
"Direktan put od koncepta do publikacije",
|
||||
"Umetnički alias 'Desetka' uspostavljen na Soundcloud-u"
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: "VI muzička produkcija sa Suno AI revolucionira kreativni proces. Kombinacija ručno napisanih tekstova i VI-generisanih instrumentala omogućava brzu i profesionalnu realizaciju muzičkih vizija. Čovek ostaje kreativno u centru - VI je alat za realizaciju."
|
||||
}
|
||||
};
|
||||
|
||||
export default aiMusicProduction;
|
||||
@@ -0,0 +1,95 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/automated-ad-creatives.ts
|
||||
export const automatedAdCreatives = {
|
||||
meta: {
|
||||
slug: 'automated-ad-creatives',
|
||||
title: 'Automatizovani Ad Kreativci: Kreiranje reklama uz pomoć VI',
|
||||
description: 'Razvoj radnog toka za automatizovano kreiranje Facebook Ad kreativaca sa Claude Opus 4.5 - bez dizajn softvera, u potpunosti u chatu',
|
||||
excerpt: 'Od dizajn šablona do gotove reklame: Kako VI revolucioniše kreiranje reklamnih kreativaca.',
|
||||
date: '2025-01',
|
||||
category: 'VI & Automatizacija',
|
||||
client: 'Lični projekat',
|
||||
duration: '1 Dan',
|
||||
url: '',
|
||||
repository: '',
|
||||
documentation: '',
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ['Claude Opus 4.5', 'HTML/CSS', 'PNG Export', 'Prompt Engineering'],
|
||||
tags: ['VI', 'Automatizacija', 'Facebook Ads', 'Marketing', 'No-Code'],
|
||||
videoUrl: 'https://www.tella.tv/video/automatisierte-ad-creatives-1kyw'
|
||||
},
|
||||
content: {
|
||||
intro: 'Programi kao što su Illustrator, InDesign, Figma ili Canva mogu biti komplikovani. Ovaj projekat pokazuje kako se Facebook Ad kreativci mogu kreirati u potpunosti u VI chatu - bez dizajn softvera, bez znanja programiranja.',
|
||||
|
||||
challenge: {
|
||||
title: 'Izazov',
|
||||
description: 'Kreiranje reklamnih materijala za Facebook kampanje tradicionalno zahteva:',
|
||||
points: [
|
||||
'Poznavanje dizajn softvera (Illustrator, Figma, Canva)',
|
||||
'Vreme za učenje i implementaciju',
|
||||
'Razumevanje zahteva formata i najboljih praksi',
|
||||
'Iteracije između dizajna i marketinga',
|
||||
'Budžet za dizajnere ili dizajn alate'
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: 'Rešenje',
|
||||
description: 'VI-vođen radni tok koji obrađuje ceo proces u chat prozoru:',
|
||||
content: 'Kompletan radni tok se odvija u chatu sa Claude Opus 4.5. Alternativno, Gemini ili ChatGPT takođe rade.',
|
||||
points: [
|
||||
'Dizajn šablon kao vizuelna referenca za VI',
|
||||
'HTML generisanje kroz promptove na prirodnom jeziku',
|
||||
'Automatska konverzija u PNG slike',
|
||||
'Integracija dodatnih slika putem drag & drop',
|
||||
'Iteracije kroz jednostavne chat instrukcije'
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: 'Tehnička implementacija',
|
||||
description: 'Radni tok u detaljima:',
|
||||
points: [
|
||||
'Korak 1: Dizajn šablon sa Envato Elements kao referenca',
|
||||
'Korak 2: Pošalji prompt sa slikom Claude-u - HTML se generiše',
|
||||
'Korak 3: Eksportuj HTML u PNG',
|
||||
'Korak 4: Integriši dodatne slike putem drag & drop'
|
||||
]
|
||||
},
|
||||
|
||||
tools: {
|
||||
title: 'Korišćeni alati',
|
||||
items: [
|
||||
{ name: 'Claude Opus 4.5', purpose: 'VI za HTML generisanje i eksport slika' },
|
||||
{ name: 'Envato Elements', purpose: 'Dizajn šabloni kao referenca' },
|
||||
{ name: 'Unsplash', purpose: 'Besplatne slike za kreativce' }
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: 'Prednosti ovog pristupa',
|
||||
description: 'VI-vođen radni tok nudi nekoliko prednosti:',
|
||||
points: [
|
||||
'Nisu potrebne dizajnerske veštine: VI preuzima tehničku implementaciju',
|
||||
'Brze iteracije: Promene u sekundama kroz chat instrukcije',
|
||||
'Skalabilno: Neograničen broj varijanti za A/B testiranje',
|
||||
'Isplativo: Nisu potrebni skupi dizajn alati',
|
||||
'Fleksibilno: Radi i sa Gemini ili ChatGPT'
|
||||
]
|
||||
},
|
||||
|
||||
useCases: {
|
||||
title: 'Slučajevi upotrebe',
|
||||
points: [
|
||||
'Performance Marketing: Brzi testovi kreativaca bez čekanja',
|
||||
'E-Commerce: Reklamiranje proizvoda na skali',
|
||||
'Startapi: Profesionalni oglasi bez dizajn tima',
|
||||
'Agencije: Efikasan rad sa klijentima za kreiranje reklama'
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: 'Radni tok demonstrira kako VI pojednostavljuje kreiranje reklamnih kreativaca. Rezultat možda još nije na nivou profesionalnog grafičkog dizajnera - ali za brze testove, početne nacrte ili timove bez dizajn resursa, ovaj pristup je prava alternativa. Tehnologija se brzo razvija.'
|
||||
}
|
||||
};
|
||||
|
||||
export default automatedAdCreatives;
|
||||
@@ -0,0 +1,89 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/cursor-ide.ts
|
||||
export const cursorIde = {
|
||||
meta: {
|
||||
slug: 'cursor-ide',
|
||||
title: 'Cursor IDE: Razvoj softvera sa veštačkom inteligencijom',
|
||||
description: 'Uvod u Cursor - revolucionarno razvojno okruženje sa veštačkom inteligencijom koje omogućava softverske projekte kroz prirodni jezik',
|
||||
excerpt: 'Otkrijte kako Cursor IDE funkcioniše kao vaš lični AI programer i kreira kompletne projekte iz prirodnog jezika.',
|
||||
date: '2025-01',
|
||||
category: 'AI & Razvoj',
|
||||
client: 'Tutorial',
|
||||
duration: 'Uvod',
|
||||
url: 'https://cursor.com',
|
||||
repository: '',
|
||||
documentation: '',
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ['Cursor IDE', 'AI', 'Next.js', 'React', 'TypeScript', 'Node.js'],
|
||||
tags: ['AI', 'IDE', 'Razvoj', 'Tutorial', 'Generisanje koda', 'Automatizacija'],
|
||||
videoUrl: 'https://www.tella.tv/video/cursor-ide-1-1kjg'
|
||||
},
|
||||
content: {
|
||||
intro: 'Cursor je razvojno okruženje sa veštačkom inteligencijom koje funkcioniše kao lični programer. Razume prirodni jezik, samostalno generiše kod, pronalazi i ispravlja greške - i gradi kompletne softverske projekte na zahtev.',
|
||||
|
||||
challenge: {
|
||||
title: 'Ranije: Izazovi',
|
||||
description: 'Tradicionalni razvoj softvera je imao visoke prepreke:',
|
||||
points: [
|
||||
'Programski jezici su morali da se nauče',
|
||||
'Traženje grešaka je često trajalo satima',
|
||||
'Svaki red koda je morao da se otkuca ručno',
|
||||
'Google i Stackoverflow su bili stalni pratioci',
|
||||
'Visoka ulazna barijera za ne-programere'
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: 'Sada: Rešenje sa Cursorom',
|
||||
description: 'Cursor revolucioniše razvoj softvera kroz AI integraciju:',
|
||||
content: 'Zamislite da imate ličnog programera koji sedi pored vas i može da razume sve vaše softverske ideje na prirodnom govornom jeziku. To je upravo Cursor.',
|
||||
points: [
|
||||
'Jednostavno opišite šta želite',
|
||||
'AI automatski pronalazi i ispravlja greške',
|
||||
'AI generiše kompletan kod',
|
||||
'AI objašnjava ceo projekat u editoru',
|
||||
'Integrisani pretraživač za direktan pregled'
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: 'Cursor interfejs',
|
||||
description: 'Nakon preuzimanja sa cursor.com, interfejs se sastoji od:',
|
||||
points: [
|
||||
'Meni traka (gore): Navigacija kroz IDE',
|
||||
'File Explorer (levo): Struktura projekta sa direktorijumima i fajlovima',
|
||||
'Editor (centar): Pregled i uređivanje fajlova',
|
||||
'Terminal (dole): Dostupan preko View > Terminal',
|
||||
'AI Chat (desno): Kontrola razvoja preko AI'
|
||||
]
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: 'Prvi koraci',
|
||||
description: 'Kako započeti sa Cursorom:',
|
||||
points: [
|
||||
'Preuzmite Cursor sa cursor.com',
|
||||
'Instalirajte za vaš operativni sistem',
|
||||
'Kreirajte folder projekta i otvorite ga u Cursoru',
|
||||
'Opišite šta želite da napravite u AI chatu',
|
||||
'Pustite AI da radi i prilagodite po potrebi'
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: 'Praktičan primer',
|
||||
description: 'Jednostavan prompt kao "Želim da napravim sajt sa Next, React i TypeScript sa modernim Hello World prikazom" je dovoljan:',
|
||||
points: [
|
||||
'AI proverava stanje projekta',
|
||||
'Ceo projekat se automatski gradi',
|
||||
'Posle nekoliko sekundi, sajt je spreman',
|
||||
'Instalirajte zavisnosti sa npm install',
|
||||
'Pokrenite razvojni server sa npm run dev'
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: 'Cursor revolucioniše razvoj softvera dramatično snižavajući barijeru između ideje i implementacije. Umesto učenja programskih jezika, jednostavno opišete na prirodnom jeziku šta želite - a AI odradi ostatak.'
|
||||
}
|
||||
};
|
||||
|
||||
export default cursorIde;
|
||||
@@ -0,0 +1,135 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/kamenpro.ts
|
||||
export const kamenpro = {
|
||||
meta: {
|
||||
slug: 'kamenpro',
|
||||
title: "KamenPro: Digitalna transformacija za dekorativni kamen",
|
||||
description: "Razvoj moderne multi-lokacijske PWA aplikacije za proizvođača dekorativnog kamena iz Bijeljine koristeći React 18.3 i Supabase",
|
||||
excerpt: "Od kamena do piksela: Kako tradicionalna zanatska radnja generiše 300% više upita kroz modernu web tehnologiju.",
|
||||
date: "2025-01",
|
||||
category: "Web Development",
|
||||
client: "KamenPro - Željko",
|
||||
duration: "3 meseca",
|
||||
url: "https://kamenpro.net",
|
||||
repository: "",
|
||||
documentation: "",
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ["React 18.3", "TypeScript", "Vite", "Supabase", "Framer Motion", "TailwindCSS", "PWA", "Schema.org"],
|
||||
tags: ["Multi-Location SEO", "E-Commerce", "PWA", "Lokalni biznis", "Performance"]
|
||||
},
|
||||
content: {
|
||||
intro: "KamenPro, etablirani proizvođač dekorativnog kamena iz Bijeljine, suočio se sa izazovom prenošenja svog tradicionalnog zanata u digitalni svet. Ova studija slučaja pokazuje kako moderna web tehnologija pomaže lokalnoj zanatskoj radnji da postigne regionalni uspeh.",
|
||||
|
||||
challenge: {
|
||||
title: "Izazov",
|
||||
description: "Kao proizvođač visokokvalitetnih kamenih obloga od belog cementa, KamenPro-u je nedostajala digitalna prezentacija za takmičenje sa online konkurencijom.",
|
||||
points: [
|
||||
"Bez digitalne prezentacije uprkos visokoj online potražnji",
|
||||
"Kupci su tražili 'dekorativni kamen' bez pronalaženja KamenPro",
|
||||
"Nedostaje prezentacija proizvoda za 3 različite teksture kamena",
|
||||
"Bez lokalne SEO prezentacije u Bijeljini, Brčkom i Tuzli",
|
||||
"Gubitak potencijalnih kupaca zbog digitalno prisutne konkurencije"
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: "Pristup rešenju",
|
||||
description: "Moderna PWA sa multi-lokacijskom SEO strategijom za maksimalnu lokalnu vidljivost",
|
||||
content: "Razvili smo visoko-performantnu Progressive Web aplikaciju koja čini KamenPro-ov zanat digitalno opipljivim. Fokus je bio na lokalnoj vidljivosti u tri grada i optimalnoj prezentaciji proizvoda za graditelje i arhitekte.",
|
||||
points: [
|
||||
"Multi-lokacijski SEO za Bijeljinu, Brčko i Tuzlu",
|
||||
"Katalog proizvoda sa HD slikama tekstura kamena",
|
||||
"PWA za offline dostupnost na gradilištima",
|
||||
"Supabase backend za upravljanje proizvodima i upitima",
|
||||
"Schema.org LocalBusiness za optimalnu Google prezentaciju"
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: "Tehnička implementacija",
|
||||
description: "Multi-lokacijska SEO arhitektura sa lokacijski specifičnim landing stranicama:",
|
||||
points: [
|
||||
"Rutiranje bazirano na lokaciji za 3 grada",
|
||||
"Sistem kataloga proizvoda sa Supabase",
|
||||
"Optimizacija slika za teške fotografije teksture kamena",
|
||||
"PWA za offline katalog proizvoda",
|
||||
"Schema.org LocalBusiness za svaki grad"
|
||||
],
|
||||
code: `// Multi-lokacijski SEO sa Schema.org
|
||||
const LocationPage: React.FC<{city: string}> = ({ city }) => {
|
||||
const structuredData = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "LocalBusiness",
|
||||
"name": \`KamenPro \${city}\`,
|
||||
"description": \`Dekorativni kamen i fasadne obloge u \${city}\`,
|
||||
"telephone": "+387 65 678 634",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"addressLocality": city,
|
||||
"addressCountry": "BA"
|
||||
},
|
||||
"areaServed": {
|
||||
"@type": "GeoCircle",
|
||||
"geoRadius": "50000"
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>Dekorativni kamen {city} | KamenPro</title>
|
||||
<script type="application/ld+json">
|
||||
{JSON.stringify(structuredData)}
|
||||
</script>
|
||||
</Helmet>
|
||||
<LocationHero city={city} />
|
||||
<ProductShowcase />
|
||||
<ContactSection city={city} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
// Upravljanje proizvodima sa Supabase
|
||||
interface StoneProduct {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'decorative_stone' | 'rustic_brick';
|
||||
dimensions: { length: 44, width: 8.5, thickness: 15 };
|
||||
price_per_m2: number; // 33-40 BAM
|
||||
weight_per_m2: 32; // kg
|
||||
textures: string[]; // 3 različite
|
||||
available_colors: string[];
|
||||
}`
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: "Lokalni SEO uspesi",
|
||||
description: "Kroz ciljanu multi-lokacijsku optimizaciju postigli smo top rangiranja:",
|
||||
points: [
|
||||
"Rang #1 za 'dekorativni kamen bijeljina'",
|
||||
"Rang #2 za 'fasadne obloge brčko'",
|
||||
"Rang #1 za 'rustik cigla tuzla'",
|
||||
"Google My Business integracija za sve lokacije",
|
||||
"Lokalni backlink-ovi od građevinskih kompanija"
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: "Merljivi poslovni rezultati",
|
||||
description: "Digitalna transformacija donela je impresivne rezultate:",
|
||||
points: [
|
||||
"300% više upita u prva 3 meseca",
|
||||
"Od 0 do ranga 1-3 za lokalne pretrage",
|
||||
"45 upita/mesec umesto prethodnih ~12",
|
||||
"25-30 projekata/kvartal umesto 8-10",
|
||||
"ROI od 275% za 6 meseci",
|
||||
"Ekspanzija na nova tržišta kroz online prisustvo"
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: "Digitalna transformacija KamenPro impresivno pokazuje kako tradicionalna zanatska radnja može otvoriti nova tržišta kroz modernu web tehnologiju. Kombinacija multi-lokacijskog SEO, optimizovane prezentacije proizvoda i tehničke izvrsnosti dovela je do utrostručavanja upita kupaca. Posebno značajno: lokalni proizvođač kamenih obloga iz Bijeljine sada dostiže kupce u celom regionu - dokaz da promišljena digitalizacija donosi merljive uspehe čak i u tradicionalnom zanatu."
|
||||
}
|
||||
};
|
||||
|
||||
// Re-export za kompatibilnost sa sistemom uvoza projekata
|
||||
export default kamenpro;
|
||||
@@ -0,0 +1,244 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/power-platform-governance.ts
|
||||
export const powerPlatformGovernance = {
|
||||
meta: {
|
||||
slug: 'power-platform-governance',
|
||||
title: "Power Platform Governance & Automation Suite",
|
||||
description: "Enterprise platforma za upravljanje Microsoft Power Platform i SharePoint Online",
|
||||
excerpt: "Centralno upravljanje, monitoring i automatizacija celokupnog M365 okruženja - od provizioniranja do praćenja usklađenosti.",
|
||||
date: "2025-01",
|
||||
category: "Enterprise Software",
|
||||
client: "Enterprise CoE timovi",
|
||||
duration: "6 meseci",
|
||||
url: "https://governance-demo.azurewebsites.net",
|
||||
repository: "",
|
||||
documentation: "/docs/power-platform-governance",
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ["React", "TypeScript", "Node.js", "Microsoft Graph", "PowerShell", "Azure Functions", "GraphQL", "Fluent UI"],
|
||||
tags: ["Microsoft 365", "Power Platform", "SharePoint", "Upravljanje", "Automatizacija", "Enterprise"]
|
||||
},
|
||||
content: {
|
||||
intro: "Sveobuhvatna enterprise platforma koja omogućava IT administratorima i Power Platform CoE timovima da centralno upravljaju i automatizuju celokupno M365 okruženje.",
|
||||
|
||||
challenge: {
|
||||
title: "Izazov",
|
||||
description: "Nekontrolisan rast Power Apps, Flows i SharePoint sajtova doveo je do kritičnih problema.",
|
||||
points: [
|
||||
"Shadow IT kroz neupravljani citizen development",
|
||||
"Rizici usklađenosti i kršenje zaštite podataka",
|
||||
"Eksplodirajući troškovi licenci zbog nekorišćenih resursa",
|
||||
"Nedostatak vidljivosti u Power Platform pejzaž",
|
||||
"Ručni, procesima skloni greškama provizioniranja",
|
||||
"Nekonzistentne politike upravljanja među timovima"
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: "Rešenje",
|
||||
description: "Centralna platforma za upravljanje sa real-time monitoringom i automatizacijom",
|
||||
content: "Platforma kombinuje moderne web tehnologije sa Microsoft 365 API-jima kako bi omogućila besprekorno integrisanje i potpunu kontrolu nad celokupnim Power Platform okruženjem.",
|
||||
points: [
|
||||
"Automated Provisioning Hub za sajtove, timove i okruženja",
|
||||
"Real-Time Monitoring Dashboard sa live activity stream-ovima",
|
||||
"Power Platform Governance Center sa DLP policy enforcement",
|
||||
"Compliance & Security Suite sa permission analyzer-om",
|
||||
"PowerShell Automation Framework za prilagođene operacije",
|
||||
"Intelligent Resource Optimization sa ML-baziranim predikcijama"
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: "Tehnička implementacija",
|
||||
description: "Rešenje se zasniva na modernoj mikroservisnoj arhitekturi sa event-driven dizajnom:",
|
||||
points: [
|
||||
"React 18.3 sa TypeScript-om za type-safe frontend razvoj",
|
||||
"Fluent UI v9 za prirodan Microsoft izgled",
|
||||
"GraphQL API sa Apollo Server-om za efikasne upite podataka",
|
||||
"Azure Functions za serverless automatizaciju",
|
||||
"PowerShell 7.4 Core za M365 operacije",
|
||||
"Azure Service Bus za asinhrono procesiranje poslova",
|
||||
"Cosmos DB za globalnu replikaciju podataka"
|
||||
]
|
||||
},
|
||||
|
||||
features: {
|
||||
title: "Ključne funkcionalnosti",
|
||||
items: [
|
||||
{
|
||||
title: "Automated Provisioning Hub",
|
||||
description: "Kreiranje SharePoint sajtova bazirano na šablonima sa bulk provizioniranjem i post-provisioning workflow-ima",
|
||||
icon: "automation"
|
||||
},
|
||||
{
|
||||
title: "Real-Time Monitoring",
|
||||
description: "Live activity stream-ovi sa ažuriranjima u realnom vremenu preko WebSocket-a i GraphQL subscription-a",
|
||||
icon: "monitoring"
|
||||
},
|
||||
{
|
||||
title: "Permission Analyzer",
|
||||
description: "Cross-tenant izveštaji o dozvolama sa detekcijom overprivileged korisnika i audit eksternog deljenja",
|
||||
icon: "security"
|
||||
},
|
||||
{
|
||||
title: "PowerShell Framework",
|
||||
description: "120+ prilagođenih cmdlet-a sa centralizovanom bibliotekom skripti i zakazanom automatizacijom",
|
||||
icon: "powershell"
|
||||
},
|
||||
{
|
||||
title: "Compliance Suite",
|
||||
description: "DLP policy builder sa otkrivanjem osetljivih podataka i automatizovanom remedijacijom",
|
||||
icon: "compliance"
|
||||
},
|
||||
{
|
||||
title: "Resource Optimizer",
|
||||
description: "ML-bazirana predikcija korišćenja sa automatizovanim čišćenjem i alokacijom troškova",
|
||||
icon: "optimization"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: "Faze implementacije",
|
||||
phases: [
|
||||
{
|
||||
title: "Faza 1: Osnova",
|
||||
duration: "6 nedelja",
|
||||
description: "Postavljanje arhitekture i osnovnih servisa",
|
||||
tasks: [
|
||||
"Azure infrastruktura sa Terraform-om",
|
||||
"GraphQL API i servis autentifikacije",
|
||||
"Microsoft Graph integracija",
|
||||
"PowerShell framework za izvršavanje"
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Faza 2: Osnovne funkcionalnosti",
|
||||
duration: "10 nedelja",
|
||||
description: "Razvoj glavnih funkcionalnosti",
|
||||
tasks: [
|
||||
"Provisioning engine sa sistemom šablona",
|
||||
"Real-time monitoring dashboard",
|
||||
"Implementacija permission analyzer-a",
|
||||
"DLP policy upravljanje"
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Faza 3: Inteligencija",
|
||||
duration: "8 nedelja",
|
||||
description: "ML funkcionalnosti i automatizacija",
|
||||
tasks: [
|
||||
"Model predikcije korišćenja resursa",
|
||||
"Automatizovani cleanup workflow-i",
|
||||
"Engine za optimizaciju troškova",
|
||||
"Sistem detekcije anomalija"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
challenges: {
|
||||
title: "Izazovi i rešenja",
|
||||
items: [
|
||||
{
|
||||
challenge: "API rate limiting",
|
||||
solution: "Inteligentno grupisanje zahteva sa eksponencijalnim backoff-om i Redis keširanje"
|
||||
},
|
||||
{
|
||||
challenge: "Multi-tenant izolacija",
|
||||
solution: "Odvojene baze podataka po tenant-u sa row-level bezbednošću i enkripcijom"
|
||||
},
|
||||
{
|
||||
challenge: "Real-time ažuriranja sa velikim količinama podataka",
|
||||
solution: "WebSocket ažuriranja sa GraphQL subscription-ima i delta upitima"
|
||||
},
|
||||
{
|
||||
challenge: "Bezbednost izvršavanja PowerShell-a",
|
||||
solution: "Sandboxed izvršavanje sa Azure Container Instances i Just Enough Administration"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: "Rezultati",
|
||||
description: "Platforma je potpuno transformisala Power Platform upravljanje:",
|
||||
metrics: [
|
||||
{ label: "Vreme provizioniranja", value: "95% brže" },
|
||||
{ label: "Stopa usklađenosti", value: "94%" },
|
||||
{ label: "Smanjenje troškova", value: "40%" },
|
||||
{ label: "Produktivnost admina", value: "3x" },
|
||||
{ label: "Incident response", value: "80% brže" },
|
||||
{ label: "Smanjenje Shadow IT", value: "90%" }
|
||||
],
|
||||
impact: "Rešenje je omogućilo organizacijama da pronađu balans između inovacije i kontrole. Citizen developeri su mogli bezbedno da rade dok je IT zadržao potpuno upravljanje."
|
||||
},
|
||||
|
||||
performance: {
|
||||
title: "Performanse i skaliranje",
|
||||
metrics: {
|
||||
technical: {
|
||||
title: "Tehničke metrike",
|
||||
items: [
|
||||
"35.000+ linija koda",
|
||||
"45+ React komponenti",
|
||||
"120+ PowerShell cmdlet-a",
|
||||
"80+ GraphQL endpoint-a",
|
||||
"92% test pokrivenost"
|
||||
]
|
||||
},
|
||||
scale: {
|
||||
title: "Skaliranje",
|
||||
items: [
|
||||
"25+ enterprise tenant-a",
|
||||
"50.000+ upravljanih resursa",
|
||||
"5.000+ dnevnih automatizacija",
|
||||
"100+ istovremenih korisnika",
|
||||
"99.9% uptime SLA"
|
||||
]
|
||||
},
|
||||
architecture: {
|
||||
title: "Arhitektura",
|
||||
items: [
|
||||
"Multi-region deployment",
|
||||
"Auto-skaliranje sa AKS",
|
||||
"Globalna replikacija podataka",
|
||||
"Zero-downtime deployment",
|
||||
"Disaster recovery <1h RTO"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
testimonial: {
|
||||
text: "Ova platforma je revolucionisala naše Power Platform upravljanje. Ono što je nekad trajalo nedeljama sada se dešava za minute - potpuno automatizovano i usklađeno.",
|
||||
author: "Michael Schmidt",
|
||||
position: "Šef IT upravljanja",
|
||||
company: "Fortune 500 kompanija"
|
||||
},
|
||||
|
||||
learnings: {
|
||||
title: "Naučene lekcije",
|
||||
items: [
|
||||
"Event-driven arhitektura je esencijalna za skalabilnost sa enterprise workload-ima",
|
||||
"PowerShell Core omogućava cross-platform automatizaciju bez Windows zavisnosti",
|
||||
"GraphQL je smanjio API pozive za 60% kroz efikasno preuzimanje podataka",
|
||||
"Policy as Code je značajno pojednostavio upravljanje",
|
||||
"Inkrementalna sinhronizacija sa delta upitima je kritična za performanse"
|
||||
]
|
||||
},
|
||||
|
||||
future: {
|
||||
title: "Buduće perspektive",
|
||||
description: "Platforma se kontinuirano proširuje i poboljšava.",
|
||||
plans: [
|
||||
"AI-powered uvidi sa detekcijom anomalija",
|
||||
"Microsoft Copilot integracija za prirodno upravljanje jezikom",
|
||||
"Fabric Analytics za naprednu BI integraciju",
|
||||
"Container Apps za serverless PowerShell izvršavanje",
|
||||
"Zero Trust bezbednosni model",
|
||||
"Cross-cloud podrška za AWS i Google Cloud"
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default powerPlatformGovernance;
|
||||
@@ -0,0 +1,222 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/smart-warehouse.ts
|
||||
export const smartWarehouse = {
|
||||
meta: {
|
||||
slug: 'smart-warehouse',
|
||||
title: "Inteligentno upravljanje skladištem sa Computer Vision",
|
||||
description: "AI sistem za upravljanje zalihama u realnom vremenu i optimizaciju skladišnih procesa",
|
||||
excerpt: "Razvoj autonomnog sistema za upravljanje skladištem sa Computer Vision, IoT senzorima i mašinskim učenjem za precizno praćenje zaliha.",
|
||||
date: "2025-01",
|
||||
category: "AI & Automatizacija",
|
||||
client: "LogiTech Solutions GmbH",
|
||||
duration: "4 meseca",
|
||||
url: "https://warehouse-demo.example.com",
|
||||
repository: "",
|
||||
documentation: "/case-studies/smart-warehouse",
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ["YOLOv8", "Python", "FastAPI", "React", "PostgreSQL", "Docker", "Kubernetes", "IoT", "MQTT"],
|
||||
tags: ["Computer Vision", "Mašinsko učenje", "IoT", "Edge Computing", "Automatizacija"]
|
||||
},
|
||||
content: {
|
||||
intro: "Srednje veliki logistički provajder transformisao je svoje ručno upravljanje skladištem kroz potpuno automatizovan sistem koji kombinuje Computer Vision, IoT senzore i mašinsko učenje.",
|
||||
|
||||
challenge: {
|
||||
title: "Izazov",
|
||||
description: "Ručno upravljanje zalihama dovelo je do značajnih operativnih problema.",
|
||||
points: [
|
||||
"Neusaglašenosti između stvarnih i evidentiranih zaliha do 15%",
|
||||
"Vremenski intenzivni ručni inventari (3-4 dana po kvartalu)",
|
||||
"Nedostatak transparentnosti u realnom vremenu o nivoima zaliha",
|
||||
"Neefikasno korišćenje skladišnog prostora zbog nedostatka optimizacije",
|
||||
"Visoki troškovi osoblja zbog ručnih procesa"
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: "Rešenje",
|
||||
description: "Razvoj potpuno automatizovanog sistema za upravljanje skladištem",
|
||||
content: "Sistem kombinuje Computer Vision, IoT senzore i mašinsko učenje za kontinuirano, precizno praćenje zaliha bez ljudske intervencije.",
|
||||
points: [
|
||||
"AI detekcija objekata pomoću kamera visoke rezolucije",
|
||||
"IoT senzori težine za validaciju",
|
||||
"Prediktivna analitika za optimizaciju zaliha",
|
||||
"Dashboard u realnom vremenu sa mobilnim pristupom",
|
||||
"Automatski okidači za ponovnu narudžbu"
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: "Tehnička implementacija",
|
||||
description: "Rešenje se zasniva na modularnoj mikroservisnoj arhitekturi sa edge computing-om za procesiranje u realnom vremenu:",
|
||||
points: [
|
||||
"YOLOv8 za preciznu detekciju objekata",
|
||||
"Edge Computing za <50ms procesiranje slike",
|
||||
"Apache Kafka za stream procesiranje 2TB podataka/dan",
|
||||
"MQTT-bazirana IoT integracija sa 200+ senzora",
|
||||
"PostgreSQL za perzistenciju podataka",
|
||||
"Kubernetes za skalabilnost"
|
||||
]
|
||||
},
|
||||
|
||||
features: {
|
||||
title: "Ključne funkcionalnosti",
|
||||
items: [
|
||||
{
|
||||
title: "Detekcija objekata u realnom vremenu",
|
||||
description: "98,7% tačnost u praćenju zaliha kroz AI prepoznavanje slike",
|
||||
icon: "camera"
|
||||
},
|
||||
{
|
||||
title: "Integracija IoT senzora",
|
||||
description: "200+ senzora validuje CV rezultate kroz merenja težine",
|
||||
icon: "sensor"
|
||||
},
|
||||
{
|
||||
title: "Prediktivna analitika",
|
||||
description: "Predviđanje kretanja zaliha i automatska ponovna narudžba",
|
||||
icon: "chart"
|
||||
},
|
||||
{
|
||||
title: "Mobilni Dashboard",
|
||||
description: "Pristup svim podacima skladišta u realnom vremenu sa bilo kog mesta",
|
||||
icon: "mobile"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
implementation: {
|
||||
title: "Faze implementacije",
|
||||
phases: [
|
||||
{
|
||||
title: "Faza 1: Proof of Concept",
|
||||
duration: "4 nedelje",
|
||||
description: "Razvoj prototipa i obuka modela",
|
||||
tasks: [
|
||||
"Razvoj prototipa za jedan deo skladišta",
|
||||
"Obuka ML modela sa 10.000+ anotiranih slika",
|
||||
"Integracija 5 test kamera i 20 IoT senzora",
|
||||
"Validacija tačnosti detekcije"
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Faza 2: Skaliranje",
|
||||
duration: "8 nedelja",
|
||||
description: "Kompletno uvođenje na 5.000m² skladišnog prostora",
|
||||
tasks: [
|
||||
"Instalacija 45 kamera i 200+ senzora",
|
||||
"Razvoj dashboard-a u realnom vremenu",
|
||||
"Integracija sa postojećim ERP sistemom",
|
||||
"Optimizacija performansi"
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Faza 3: Optimizacija",
|
||||
duration: "4 nedelje",
|
||||
description: "Fino podešavanje i napredne funkcionalnosti",
|
||||
tasks: [
|
||||
"Fino podešavanje ML modela",
|
||||
"Implementacija prediktivne analitike",
|
||||
"Razvoj mobilne aplikacije",
|
||||
"Obuka zaposlenih"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
challenges: {
|
||||
title: "Izazovi i rešenja",
|
||||
items: [
|
||||
{
|
||||
challenge: "Promenljivi uslovi osvetljenja",
|
||||
solution: "HDR kamere sa adaptivnom predobradom slike i augmentovanim podacima za obuku"
|
||||
},
|
||||
{
|
||||
challenge: "Procesiranje velikih količina podataka u realnom vremenu",
|
||||
solution: "Edge Computing za predprocesiranje i Apache Kafka za stream procesiranje"
|
||||
},
|
||||
{
|
||||
challenge: "Integracija sa nasleđenim sistemima",
|
||||
solution: "Razvoj adapter sloja sa dvosmernom sinhronizacijom"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: "Rezultati",
|
||||
description: "Sistem je potpuno transformisao upravljanje skladištem:",
|
||||
metrics: [
|
||||
{ label: "Tačnost detekcije", value: "98,7%" },
|
||||
{ label: "Smanjenje vremena inventara", value: "85%" },
|
||||
{ label: "Manje neusaglašenosti zaliha", value: "60%" },
|
||||
{ label: "Iskorišćenost skladišnog prostora", value: "+35%" },
|
||||
{ label: "ROI", value: "14 meseci" },
|
||||
{ label: "Dostupnost sistema", value: "99,95%" }
|
||||
],
|
||||
impact: "Transparentnost u realnom vremenu omogućila je proaktivno donošenje odluka i sprečila prekide u snabdevanju. Zaposleni su mogli da se fokusiraju na aktivnosti koje dodaju vrednost dok je AI upravljao zalihama."
|
||||
},
|
||||
|
||||
performance: {
|
||||
title: "Metrike performansi",
|
||||
metrics: {
|
||||
processing: {
|
||||
title: "Procesiranje",
|
||||
items: [
|
||||
"Procesiranje slike: <50ms po frejmu",
|
||||
"API Response Time: p95 < 100ms",
|
||||
"Procesiranje podataka: 500 događaja/sekund",
|
||||
"System Uptime: 99.95%"
|
||||
]
|
||||
},
|
||||
scale: {
|
||||
title: "Skaliranje",
|
||||
items: [
|
||||
"45 aktivnih kamera (do 200 moguće)",
|
||||
"200+ IoT senzora",
|
||||
"50+ istovremenih korisnika",
|
||||
"50TB skladištenje podataka"
|
||||
]
|
||||
},
|
||||
ml: {
|
||||
title: "ML Performanse",
|
||||
items: [
|
||||
"mAP@50: 0.92",
|
||||
"Inference Time: 23ms",
|
||||
"False Positive Rate: <2%",
|
||||
"Model Size: 138MB"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
testimonial: {
|
||||
text: "Implementacija je revolucionisala naše skladišne procese. Ono što je ranije trajalo danima sada se dešava u realnom vremenu. Tačnost i efikasnost su impresivne.",
|
||||
author: "Thomas Weber",
|
||||
position: "Šef logistike",
|
||||
company: "LogiTech Solutions GmbH"
|
||||
},
|
||||
|
||||
learnings: {
|
||||
title: "Naučene lekcije",
|
||||
items: [
|
||||
"Edge Computing je esencijalan: Predprocesiranje direktno na kameri smanjilo je mrežno opterećenje za 70%",
|
||||
"Kvalitet podataka pre kvantiteta: 1.000 visokokvalitetnih anotacija bilo je vrednije od 10.000 automatski generisanih",
|
||||
"Iterativni razvoj: Rano pilotiranje u jednoj oblasti omogućilo je brza prilagođavanja",
|
||||
"Upravljanje promenama: Rano uključivanje zaposlenih bilo je ključno za prihvatanje"
|
||||
]
|
||||
},
|
||||
|
||||
future: {
|
||||
title: "Buduće perspektive",
|
||||
description: "Sistem je dizajniran kao white-label rešenje i može se primeniti u drugim skladištima sa minimalnim prilagođavanjima.",
|
||||
plans: [
|
||||
"Integracija robotike za automatizovano komisioniranje",
|
||||
"Proširenje na spoljašnja skladišta i mobilne jedinice",
|
||||
"AI-bazirano predviđanje potreba za održavanjem",
|
||||
"Blockchain integracija za transparentnost lanca snabdevanja",
|
||||
"AR naočare za radnike skladišta sa vizuelnim naznakama"
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default smartWarehouse;
|
||||
@@ -0,0 +1,80 @@
|
||||
// src/i18n/locales/sr/portfolio/projects/website-mit-ki.ts
|
||||
export const websiteMitKi = {
|
||||
meta: {
|
||||
slug: 'website-mit-ki',
|
||||
title: 'Napravi svoj sajt uz pomoć VI: Od nule do gotove stranice',
|
||||
description: 'Korak-po-korak vodič za izgradnju profesionalnog sajta sa Claude Code - usklađen sa GDPR-om, višejezičan, sa portfoliom i blogom',
|
||||
excerpt: 'Kako da napraviš kompletan sajt za manje od sat vremena - bez pisanja ijedne linije koda.',
|
||||
date: '2025-01',
|
||||
category: 'VI & Automatizacija',
|
||||
client: 'Lični projekat',
|
||||
duration: '30 Minuta',
|
||||
url: '',
|
||||
repository: '',
|
||||
documentation: '',
|
||||
published: true,
|
||||
featured: true,
|
||||
technologies: ['Claude Code', 'React', 'TypeScript', 'Vercel', 'GitHub', 'Vite'],
|
||||
tags: ['VI', 'Website', 'No-Code', 'Tutorial', 'Claude Code', 'Vercel'],
|
||||
videoUrl: 'https://www.tella.tv/video/baue-deine-website-noch-heute-mit-ki-8f7v'
|
||||
},
|
||||
content: {
|
||||
intro: 'Profesionalni sajt bez znanja programiranja? Sa VI, to je danas moguće. Ovaj tutorijal pokazuje kompletan proces - od praznog projektnog foldera do gotovog, hostovanog sajta.',
|
||||
|
||||
challenge: {
|
||||
title: 'Izazov',
|
||||
description: 'Tradicionalni put do sopstvenog sajta je često komplikovan i skup:',
|
||||
points: [
|
||||
'Web bilderi kao Wix, WordPress ili Webflow imaju mesečne troškove',
|
||||
'Sopstveni razvoj zahteva znanje programiranja',
|
||||
'Dizajneri i programeri su skupi',
|
||||
'GDPR usklađenost i SEO optimizacija su kompleksni',
|
||||
'Višejezična podrška i responsivan dizajn zahtevaju dodatni napor'
|
||||
]
|
||||
},
|
||||
|
||||
solution: {
|
||||
title: 'Rešenje',
|
||||
description: 'Sa VI, kompletan sajt se može napraviti za manje od sat vremena:',
|
||||
content: 'Kompletan radni tok koristi Claude Code za autonomni razvoj, GitHub za verzioniranje i Vercel za besplatan hosting.',
|
||||
points: [
|
||||
'GDPR-usklađena implementacija sa banerom za kolačiće',
|
||||
'Višejezična podrška (nemački, engleski, moguće i više)',
|
||||
'Portfolio stranica sa interaktivnim projektima',
|
||||
'Blog funkcionalnost za blog postove',
|
||||
'SEO optimizacija za bolje Google rangiranje',
|
||||
'Kontakt forma za potencijalne klijente'
|
||||
]
|
||||
},
|
||||
|
||||
technical: {
|
||||
title: 'Radni tok',
|
||||
description: 'Ovako proces funkcioniše korak po korak:',
|
||||
points: [
|
||||
'Korak 1: Kreiraj GitHub nalog i repozitorijum',
|
||||
'Korak 2: Podesi Vercel nalog za besplatan hosting',
|
||||
'Korak 3: Pripremi lokalni projektni folder sa relevantnim dokumentima',
|
||||
'Korak 4: Otvori Claude Code i unesi prompt sa željenim funkcijama',
|
||||
'Korak 5: VI autonomno radi i kreira kompletan sajt',
|
||||
'Korak 6: Pushuj projekat na GitHub i importuj u Vercel'
|
||||
]
|
||||
},
|
||||
|
||||
results: {
|
||||
title: 'Prednosti ovog rešenja',
|
||||
description: 'VI-vođen razvoj sajta nudi nekoliko prednosti:',
|
||||
points: [
|
||||
'Nisu potrebne veštine programiranja',
|
||||
'Minimalni troškovi: Samo VI pretplata i opciono domen',
|
||||
'Bolja vidljivost kroz SEO optimizaciju',
|
||||
'Potpuna kontrola: Kod je na GitHub-u, hosting je besplatan',
|
||||
'Brze izmene moguće kroz chat instrukcije',
|
||||
'Mobilno-optimiziran, responsivan dizajn uključen'
|
||||
]
|
||||
},
|
||||
|
||||
conclusion: 'Kompletan, profesionalni sajt može se napraviti danas za manje od sat vremena - bez pisanja ijedne linije koda. Kombinacija VI razvoja, besplatnog hostinga i verzioniranja čini ovo rešenje interesantnim ne samo za programere, već za sve kojima je potrebna profesionalna web prezentacija.'
|
||||
}
|
||||
};
|
||||
|
||||
export default websiteMitKi;
|
||||
@@ -0,0 +1,94 @@
|
||||
// src/i18n/locales/sr/seo-content.ts
|
||||
export const seoContent = {
|
||||
hero: {
|
||||
title: 'Damjan Savić | Fullstack, IoT и AI програмер',
|
||||
subtitle: 'Скалабилна софтверска решења са IoT и AI интеграцијом',
|
||||
description: 'Као fullstack програмер из Келна, Дамјан Савић се специјализује за развој скалабилних софтверских решења са IoT и AI интеграцијом.',
|
||||
cta: {
|
||||
primary: 'Погледајте пројекте',
|
||||
secondary: 'Контактирајте ме'
|
||||
}
|
||||
},
|
||||
home: {
|
||||
h1: 'Damjan Savić | Fullstack, IoT и AI програмер',
|
||||
h2: [
|
||||
'Скалабилна софтверска решења са IoT интеграцијом',
|
||||
'AI интеграција за модерне компаније',
|
||||
'Fullstack развој и дигитална трансформација'
|
||||
],
|
||||
description: 'Као fullstack програмер из Келна, Дамјан Савић се специјализује за развој скалабилних софтверских решења са IoT и AI интеграцијом.',
|
||||
structuredData: {
|
||||
personName: 'Damjan Savić',
|
||||
personNameCyrillic: 'Дамјан Савић',
|
||||
jobTitle: 'Старији програмер пуног стека / Консултант за дигитална решења',
|
||||
skills: [
|
||||
'Софтвер за предузећа',
|
||||
'Облак архитектура',
|
||||
'Интеграција вештачке интелигенције',
|
||||
'JTL интеграција',
|
||||
'Python развој',
|
||||
'React/Next.js',
|
||||
'Дигитална трансформација'
|
||||
],
|
||||
location: {
|
||||
city: 'Келн',
|
||||
region: 'Северна Рајна-Вестфалија',
|
||||
country: 'Немачка',
|
||||
countryCode: 'DE'
|
||||
}
|
||||
}
|
||||
},
|
||||
about: {
|
||||
h1: 'О Дамјану Савићу - Старији програмер пуног стека из Немачке',
|
||||
h2: 'Експертиза у софтверу за предузећа и дигиталним решењима',
|
||||
description: 'Упознајте Дамјана Савића (Damjan Savić), искусног старијег програмера пуног стека и консултанта за дигитална решења који помаже компанијама у Немачкој и Европи да оптимизују своје процесе кроз модерни софтвер, облак архитектуру и интеграцију вештачке интелигенције.',
|
||||
expertise: {
|
||||
title: 'Области стручности',
|
||||
areas: [
|
||||
'Развој софтвера за предузећа',
|
||||
'Облак архитектура и миграције',
|
||||
'Интеграција вештачке интелигенције',
|
||||
'JTL-WaWi интеграција',
|
||||
'Аутоматизација пословних процеса',
|
||||
'Дигитална трансформација'
|
||||
]
|
||||
}
|
||||
},
|
||||
portfolio: {
|
||||
h1: 'Портфолио - Дамјан Савић',
|
||||
h2: 'Пројекти софтвера за предузећа и дигиталних решења',
|
||||
description: 'Истражите портфолио Дамјана Савића са пројектима из области софтвера за предузећа, облак архитектуре и интеграције вештачке интелигенције за водеће компаније у Немачкој и Европи.'
|
||||
},
|
||||
contact: {
|
||||
h1: 'Контактирајте Дамјана Савића',
|
||||
h2: 'Старији програмер пуног стека и консултант за дигитална решења у Немачкој',
|
||||
description: 'Ступите у контакт са Дамјаном Савићем за консултације о софтверу за предузећа, облак архитектури, интеграцији вештачке интелигенције или дигиталној трансформацији вашег пословања у Немачкој и Европи.'
|
||||
},
|
||||
services: {
|
||||
title: 'Услуге',
|
||||
list: [
|
||||
{
|
||||
name: 'Развој софтвера за предузећа',
|
||||
description: 'Прилагођена решења за велике организације'
|
||||
},
|
||||
{
|
||||
name: 'Облак архитектура',
|
||||
description: 'Дизајн и имплементација скалабилних облак решења'
|
||||
},
|
||||
{
|
||||
name: 'Интеграција вештачке интелигенције',
|
||||
description: 'Модерна AI решења за оптимизацију процеса'
|
||||
},
|
||||
{
|
||||
name: 'JTL интеграција',
|
||||
description: 'Експертска интеграција JTL-WaWi система'
|
||||
},
|
||||
{
|
||||
name: 'Дигитална трансформација',
|
||||
description: 'Комплетна модернизација пословних процеса'
|
||||
}
|
||||
]
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type SEOContentTranslations = typeof seoContent;
|
||||
Reference in New Issue
Block a user