Initial commit: open-source release of atakanozban.com
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": 1,
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-ef": {
|
||||
"version": "9.0.4",
|
||||
"commands": [
|
||||
"dotnet-ef"
|
||||
],
|
||||
"rollForward": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
+378
@@ -0,0 +1,378 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# User-uploaded content (keep folder structure via .gitkeep, ignore actual files)
|
||||
Content/uploads/affiliate-logos/*
|
||||
!Content/uploads/affiliate-logos/.gitkeep
|
||||
Content/uploads/projects/*
|
||||
!Content/uploads/projects/.gitkeep
|
||||
Content/uploads/projects-media/*
|
||||
!Content/uploads/projects-media/.gitkeep
|
||||
Content/uploads/wallpaper/*
|
||||
!Content/uploads/wallpaper/.gitkeep
|
||||
App_Data/Uploads/*
|
||||
!App_Data/Uploads/.gitkeep
|
||||
|
||||
# Old backup folder, not needed
|
||||
bin-bckp/
|
||||
Generated
+288
@@ -0,0 +1,288 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace atakanozbancom.App_GlobalResources {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
public class Resource {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resource() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("atakanozbancom.App_GlobalResources.Resource", typeof(Resource).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Hey, I’m Atakan! A developer who just can’t sit still when it comes to creating. Whether I’m coding up web apps, experimenting with sound, or capturing moments through a lens, I love turning ideas into something real..
|
||||
/// </summary>
|
||||
public static string About1 {
|
||||
get {
|
||||
return ResourceManager.GetString("About1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to I started my dev journey back in 2016 with HTML & CSS. In 2020, my curiosity for cybersecurity led me to Python and Kali Linux. Then, in 2022, I dove into JavaScript and Node.js to build more professional websites and work with server-side logic. These days, I’m focused on creating smooth, functional web applications and managing server resources efficiently..
|
||||
/// </summary>
|
||||
public static string About2 {
|
||||
get {
|
||||
return ResourceManager.GetString("About2", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Music’s been a big part of my life too, especially classical music and piano. I love experimenting with production, mixing, and translating emotions into sound. It’s more than just a hobby, it’s another creative outlet that keeps me inspired even when I’m not writing code..
|
||||
/// </summary>
|
||||
public static string About3 {
|
||||
get {
|
||||
return ResourceManager.GetString("About3", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Photography’s another passion of mine. I love traveling and capturing 360° photos to upload on Google Street View, making hidden places visible to the world. It’s like my own version of a vlog channel, just in pictures..
|
||||
/// </summary>
|
||||
public static string About4 {
|
||||
get {
|
||||
return ResourceManager.GetString("About4", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to About Me.
|
||||
/// </summary>
|
||||
public static string AboutMeTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("AboutMeTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Affiliate links will be listed here soon..
|
||||
/// </summary>
|
||||
public static string AffiliateLinksComingSoon {
|
||||
get {
|
||||
return ResourceManager.GetString("AffiliateLinksComingSoon", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Affiliate Links.
|
||||
/// </summary>
|
||||
public static string AffiliateLinksTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("AffiliateLinksTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to If you'd like to support my work, you can use the links below. It costs money for me to run and maintain these services, and using them may earn me a small benefit at no extra cost to you..
|
||||
/// </summary>
|
||||
public static string AffiliateLinksIntro {
|
||||
get {
|
||||
return ResourceManager.GetString("AffiliateLinksIntro", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to I m working hard and on these projects, and your support really motivates me. If you d like to support you can support by these links.
|
||||
/// </summary>
|
||||
public static string DonateP {
|
||||
get {
|
||||
return ResourceManager.GetString("DonateP", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Support my work.
|
||||
/// </summary>
|
||||
public static string DonateTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("DonateTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Thank you.
|
||||
/// </summary>
|
||||
public static string DonateTY {
|
||||
get {
|
||||
return ResourceManager.GetString("DonateTY", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Gitea.
|
||||
/// </summary>
|
||||
public static string Gitea {
|
||||
get {
|
||||
return ResourceManager.GetString("Gitea", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to here.
|
||||
/// </summary>
|
||||
public static string Here {
|
||||
get {
|
||||
return ResourceManager.GetString("Here", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to TR.
|
||||
/// </summary>
|
||||
public static string Language {
|
||||
get {
|
||||
return ResourceManager.GetString("Language", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to you can surf by navbar..
|
||||
/// </summary>
|
||||
public static string MainDiv {
|
||||
get {
|
||||
return ResourceManager.GetString("MainDiv", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Welcome to my portfolio,.
|
||||
/// </summary>
|
||||
public static string MainH1 {
|
||||
get {
|
||||
return ResourceManager.GetString("MainH1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to I'm posting here just my web projects. For my other works you can visit my.
|
||||
/// </summary>
|
||||
public static string MyProjectsP1 {
|
||||
get {
|
||||
return ResourceManager.GetString("MyProjectsP1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to page..
|
||||
/// </summary>
|
||||
public static string MyProjectsP1_1 {
|
||||
get {
|
||||
return ResourceManager.GetString("MyProjectsP1_1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to For uptime checking of speedtest servers and website you can visit.
|
||||
/// </summary>
|
||||
public static string MyProjectsP2 {
|
||||
get {
|
||||
return ResourceManager.GetString("MyProjectsP2", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to My Projects.
|
||||
/// </summary>
|
||||
public static string MyProjectsTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("MyProjectsTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to About Me.
|
||||
/// </summary>
|
||||
public static string NavAboutMe {
|
||||
get {
|
||||
return ResourceManager.GetString("NavAboutMe", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Affiliate Links.
|
||||
/// </summary>
|
||||
public static string NavAffiliateLinks {
|
||||
get {
|
||||
return ResourceManager.GetString("NavAffiliateLinks", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Home.
|
||||
/// </summary>
|
||||
public static string NavHome {
|
||||
get {
|
||||
return ResourceManager.GetString("NavHome", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to My Projects.
|
||||
/// </summary>
|
||||
public static string NavMyProjects {
|
||||
get {
|
||||
return ResourceManager.GetString("NavMyProjects", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Service Status.
|
||||
/// </summary>
|
||||
public static string Server {
|
||||
get {
|
||||
return ResourceManager.GetString("Server", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About1" xml:space="preserve">
|
||||
<value>Hey, I’m Atakan! A developer who just can’t sit still when it comes to creating. Whether I’m coding up web apps, experimenting with sound, or capturing moments through a lens, I love turning ideas into something real.</value>
|
||||
</data>
|
||||
<data name="DonateP" xml:space="preserve">
|
||||
<value>I m working hard and on these projects, and your support really motivates me. If you d like to support you can support by these links</value>
|
||||
</data>
|
||||
<data name="DonateTitle" xml:space="preserve">
|
||||
<value>Support my work</value>
|
||||
</data>
|
||||
<data name="MainH1" xml:space="preserve">
|
||||
<value>Welcome to my portfolio,</value>
|
||||
</data>
|
||||
<data name="MainDiv" xml:space="preserve">
|
||||
<value>you can surf by navbar.</value>
|
||||
</data>
|
||||
<data name="MyProjectsTitle" xml:space="preserve">
|
||||
<value>My Projects</value>
|
||||
</data>
|
||||
<data name="MyProjectsP1" xml:space="preserve">
|
||||
<value>I'm posting here just my web projects. For my other works you can visit my</value>
|
||||
</data>
|
||||
<data name="MyProjectsP2" xml:space="preserve">
|
||||
<value>For uptime checking of speedtest servers and website you can visit</value>
|
||||
</data>
|
||||
<data name="NavHome" xml:space="preserve">
|
||||
<value>Home</value>
|
||||
</data>
|
||||
<data name="NavAboutMe" xml:space="preserve">
|
||||
<value>About Me</value>
|
||||
</data>
|
||||
<data name="NavMyProjects" xml:space="preserve">
|
||||
<value>My Projects</value>
|
||||
</data>
|
||||
<data name="NavAffiliateLinks" xml:space="preserve">
|
||||
<value>Affiliate Links</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksTitle" xml:space="preserve">
|
||||
<value>Affiliate Links</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksIntro" xml:space="preserve">
|
||||
<value>If you'd like to support my work, you can use the links below. It costs money for me to run and maintain these services, and using them may earn me a small benefit at no extra cost to you.</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksComingSoon" xml:space="preserve">
|
||||
<value>Affiliate links will be listed here soon.</value>
|
||||
</data>
|
||||
<data name="DonateTY" xml:space="preserve">
|
||||
<value>Thank you</value>
|
||||
</data>
|
||||
<data name="AboutMeTitle" xml:space="preserve">
|
||||
<value>About Me</value>
|
||||
</data>
|
||||
<data name="Here" xml:space="preserve">
|
||||
<value>here</value>
|
||||
</data>
|
||||
<data name="Language" xml:space="preserve">
|
||||
<value>TR</value>
|
||||
</data>
|
||||
<data name="About2" xml:space="preserve">
|
||||
<value>I started my dev journey back in 2016 with HTML & CSS. In 2020, my curiosity for cybersecurity led me to Python and Kali Linux. Then, in 2022, I dove into JavaScript and Node.js to build more professional websites and work with server-side logic. These days, I’m focused on creating smooth, functional web applications and managing server resources efficiently.</value>
|
||||
</data>
|
||||
<data name="About3" xml:space="preserve">
|
||||
<value>Music’s been a big part of my life too, especially classical music and piano. I love experimenting with production, mixing, and translating emotions into sound. It’s more than just a hobby, it’s another creative outlet that keeps me inspired even when I’m not writing code.</value>
|
||||
</data>
|
||||
<data name="About4" xml:space="preserve">
|
||||
<value>Photography’s another passion of mine. I love traveling and capturing 360° photos to upload on Google Street View, making hidden places visible to the world. It’s like my own version of a vlog channel, just in pictures.</value>
|
||||
</data>
|
||||
<data name="Gitea" xml:space="preserve">
|
||||
<value>Gitea</value>
|
||||
</data>
|
||||
<data name="MyProjectsP1_1" xml:space="preserve">
|
||||
<value>page.</value>
|
||||
</data>
|
||||
<data name="Server" xml:space="preserve">
|
||||
<value>Service Status</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,195 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About1" xml:space="preserve">
|
||||
<value>Merhaba, ben Atakan. Fikirleri gerçeğe dönüştürmeyi seven, yazılım, müzik ve fotoğrafçılık alanlarında üreten biriyim.</value>
|
||||
</data>
|
||||
<data name="DonateP" xml:space="preserve">
|
||||
<value>Bu projeler üzerinde çok çalışıyorum ve desteğiniz beni motive ediyor Çalışmalarıma aşağıdaki linklerden destek olabilirsiniz</value>
|
||||
</data>
|
||||
<data name="DonateTitle" xml:space="preserve">
|
||||
<value>Çalışmalarımı destekleyin</value>
|
||||
</data>
|
||||
<data name="MainH1" xml:space="preserve">
|
||||
<value>Portfolyoma hoşgeldiniz,</value>
|
||||
</data>
|
||||
<data name="MainDiv" xml:space="preserve">
|
||||
<value>üstteki menü ile gezinebilirsiniz.</value>
|
||||
</data>
|
||||
<data name="MyProjectsTitle" xml:space="preserve">
|
||||
<value>Projelerim</value>
|
||||
</data>
|
||||
<data name="MyProjectsP1" xml:space="preserve">
|
||||
<value>Buraya yalnızca web projelerimi ekliyorum. Diğer çalışmalarım için</value>
|
||||
</data>
|
||||
<data name="MyProjectsP2" xml:space="preserve">
|
||||
<value>Sunucuların durumlarını görüntülemek için</value>
|
||||
</data>
|
||||
<data name="NavHome" xml:space="preserve">
|
||||
<value>Giriş</value>
|
||||
</data>
|
||||
<data name="NavAboutMe" xml:space="preserve">
|
||||
<value>Hakkımda</value>
|
||||
</data>
|
||||
<data name="NavMyProjects" xml:space="preserve">
|
||||
<value>Projelerim</value>
|
||||
</data>
|
||||
<data name="NavAffiliateLinks" xml:space="preserve">
|
||||
<value>Referans Linklerim</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksTitle" xml:space="preserve">
|
||||
<value>Affiliate Linklerim</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksIntro" xml:space="preserve">
|
||||
<value>Çalışmalarımı desteklemek isterseniz aşağıdaki linkleri kullanabilirsiniz. Bu servisleri çalıştırmak ve sürdürmek benim için maliyetli, bu linkleri kullanmanız size ekstra bir maliyet çıkarmadan bana küçük bir fayda sağlayabilir.</value>
|
||||
</data>
|
||||
<data name="AffiliateLinksComingSoon" xml:space="preserve">
|
||||
<value>Affiliate linkleri yakında burada listelenecek.</value>
|
||||
</data>
|
||||
<data name="DonateTY" xml:space="preserve">
|
||||
<value>Teşekkür ederim</value>
|
||||
</data>
|
||||
<data name="AboutMeTitle" xml:space="preserve">
|
||||
<value>Hakkımda</value>
|
||||
</data>
|
||||
<data name="Here" xml:space="preserve">
|
||||
<value>tıklayın</value>
|
||||
</data>
|
||||
<data name="Language" xml:space="preserve">
|
||||
<value>EN</value>
|
||||
</data>
|
||||
<data name="About2" xml:space="preserve">
|
||||
<value>Yazılım yolculuğuma 2016 yılında HTML ve CSS ile başladım. 2020’de siber güvenliğe olan merakım sayesinde Python ve Kali Linux öğrenmeye başladım. 2022’de ise JavaScript ve Node.js ile daha profesyonel web siteleri ve sunucu tarafı projeleri geliştirmeye yöneldim. Şu anda, akıcı ve işlevsel web uygulamaları geliştiriyor ve sunucu kaynaklarıyla çalışıyorum.</value>
|
||||
</data>
|
||||
<data name="About3" xml:space="preserve">
|
||||
<value>Müzik de hayatımın önemli bir parçası, özellikle klasik müzik ve piyano. Üretim, mixing ve duyguları sese dönüştürme konularında denemeler yapmayı seviyorum. Benim için müzik bir hobiden çok daha fazlası; kod yazmadığım zamanlarda bile üretkenliğimi besleyen başka bir alan.</value>
|
||||
</data>
|
||||
<data name="About4" xml:space="preserve">
|
||||
<value>Fotoğrafçılık ise bir başka tutkum. Seyahat etmeyi ve 360° fotoğraflar çekmeyi seviyorum. Bu fotoğrafları Google Street View’a yükleyerek dünyanın görülmeyen yerlerini görünür kılmayı hedefliyorum. Benim için bu, görsel bir vlog kanalı gibi.</value>
|
||||
</data>
|
||||
<data name="Gitea" xml:space="preserve">
|
||||
<value>Gitea</value>
|
||||
</data>
|
||||
<data name="MyProjectsP1_1" xml:space="preserve">
|
||||
<value>sayfamı ziyaret edebilirsiniz.</value>
|
||||
</data>
|
||||
<data name="Server" xml:space="preserve">
|
||||
<value>Servis Durumu</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,30 @@
|
||||
using System.Web;
|
||||
using System.Web.Optimization;
|
||||
|
||||
namespace atakanozbancom
|
||||
{
|
||||
public class BundleConfig
|
||||
{
|
||||
// For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862
|
||||
public static void RegisterBundles(BundleCollection bundles)
|
||||
{
|
||||
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
|
||||
"~/Scripts/jquery-{version}.js"));
|
||||
|
||||
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
|
||||
"~/Scripts/jquery.validate*"));
|
||||
|
||||
// Use the development version of Modernizr to develop with and learn from. Then, when you're
|
||||
// ready for production, use the build tool at https://modernizr.com to pick only the tests you need.
|
||||
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
|
||||
"~/Scripts/modernizr-*"));
|
||||
|
||||
bundles.Add(new Bundle("~/bundles/bootstrap").Include(
|
||||
"~/Scripts/bootstrap.js"));
|
||||
|
||||
bundles.Add(new StyleBundle("~/Content/css").Include(
|
||||
"~/Content/bootstrap.css",
|
||||
"~/Content/site.css"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace atakanozbancom
|
||||
{
|
||||
public class FilterConfig
|
||||
{
|
||||
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
|
||||
{
|
||||
filters.Add(new HandleErrorAttribute());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Routing;
|
||||
|
||||
namespace atakanozbancom
|
||||
{
|
||||
public class RouteConfig
|
||||
{
|
||||
public static void RegisterRoutes(RouteCollection routes)
|
||||
{
|
||||
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
|
||||
|
||||
routes.MapRoute(
|
||||
name: "Default",
|
||||
url: "{controller}/{action}/{id}",
|
||||
defaults: new { controller = "main", action = "Index", id = UrlParameter.Optional },
|
||||
new[] { "atakanozbancom.Controllers" }
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/* Set padding to keep content from hitting the edges */
|
||||
.body-content {
|
||||
margin-top: 15px;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
/* Override the default bootstrap behavior where horizontal description lists
|
||||
will truncate terms that are too long to fit in the left column
|
||||
*/
|
||||
.dl-horizontal dt {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
/* Set width on the form input elements since they're 100% wide by default */
|
||||
input,
|
||||
select,
|
||||
textarea {
|
||||
max-width: 280px;
|
||||
}
|
||||
Vendored
+4124
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+4123
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+488
@@ -0,0 +1,488 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.2.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2022 The Bootstrap Authors
|
||||
* Copyright 2011-2022 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-2xl: 2rem;
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: 1px solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--bs-link-color);
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
color: var(--bs-link-hover-color);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: #6c757d;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: left;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
outline-offset: -2px;
|
||||
-webkit-appearance: textfield;
|
||||
}
|
||||
|
||||
/* rtl:raw:
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
*/
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
||||
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+485
@@ -0,0 +1,485 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.2.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2022 The Bootstrap Authors
|
||||
* Copyright 2011-2022 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-2xl: 2rem;
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: 1px solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--bs-link-color);
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
color: var(--bs-link-hover-color);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: #6c757d;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: right;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
outline-offset: -2px;
|
||||
-webkit-appearance: textfield;
|
||||
}
|
||||
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
|
||||
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+4266
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+4257
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+10878
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+10842
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using atakanozbancom;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class AboutController : Controller
|
||||
{
|
||||
// GET: /About
|
||||
[HttpGet]
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
// POST: /About/ChangeLanguage
|
||||
[HttpPost]
|
||||
public ActionResult ChangeLanguage(string lang)
|
||||
{
|
||||
new LanguageTR().SetLanguage(lang);
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,676 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using System.Data.Entity;
|
||||
using atakanozbancom.Models.classes;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class adminController : Controller
|
||||
{
|
||||
private readonly Context db = new Context();
|
||||
|
||||
[Authorize]
|
||||
public ActionResult Index()
|
||||
{
|
||||
ViewBag.MyProjectsCount = db.MyProjects.Count();
|
||||
ViewBag.AffiliateLinksCount = db.AffiliateLinks.Count();
|
||||
ViewBag.SocialIconsCount = db.SocialIcons.Count();
|
||||
return View();
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult MyProjects()
|
||||
{
|
||||
var value = db.MyProjects.ToList();
|
||||
return View(value);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult myprojectsget(int id)
|
||||
{
|
||||
var p = db.MyProjects
|
||||
.Include(x => x.Translations)
|
||||
.FirstOrDefault(x => x.id == id);
|
||||
|
||||
if (p == null)
|
||||
return HttpNotFound();
|
||||
|
||||
var tr = p.Translations?
|
||||
.FirstOrDefault(t => t.culture == "tr" || t.culture == "tr-TR");
|
||||
|
||||
var vm = new AdminMyProjectsEditVM
|
||||
{
|
||||
id = p.id,
|
||||
|
||||
TitleEN = p.title,
|
||||
DescEN = p.description,
|
||||
|
||||
TitleTR = tr != null ? tr.title : "",
|
||||
DescTR = tr != null ? tr.description : ""
|
||||
};
|
||||
|
||||
vm.medias = db.projectmedia
|
||||
.Where(m => m.project_id == p.id)
|
||||
.OrderBy(m => m.sort_order)
|
||||
.ThenBy(m => m.id)
|
||||
.ToList();
|
||||
|
||||
return View("myprojectsget", vm);
|
||||
}
|
||||
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult myprojectsget(AdminMyProjectsEditVM vm)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
vm.medias = db.projectmedia
|
||||
.Where(m => m.project_id == vm.id)
|
||||
.OrderBy(m => m.sort_order)
|
||||
.ThenBy(m => m.id)
|
||||
.ToList();
|
||||
|
||||
return View("myprojectsget", vm);
|
||||
}
|
||||
|
||||
var p = db.MyProjects.FirstOrDefault(x => x.id == vm.id);
|
||||
if (p == null) return HttpNotFound();
|
||||
|
||||
// EN -> base
|
||||
p.title = vm.TitleEN;
|
||||
p.description = vm.DescEN;
|
||||
|
||||
// TR -> translations
|
||||
var tr = db.myprojectstranslations
|
||||
.FirstOrDefault(x => x.project_id == p.id && (x.culture == "tr" || x.culture == "tr-TR"));
|
||||
|
||||
if (tr == null)
|
||||
{
|
||||
tr = new myprojectstranslation { project_id = p.id, culture = "tr" };
|
||||
db.myprojectstranslations.Add(tr);
|
||||
}
|
||||
|
||||
tr.title = vm.TitleTR;
|
||||
tr.description = vm.DescTR;
|
||||
|
||||
db.SaveChanges();
|
||||
TempData["ok"] = "Project updated successfully!";
|
||||
return RedirectToAction("myprojectsget", new { id = p.id });
|
||||
}
|
||||
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult newmppost() // newmppost = New My Projects Post
|
||||
{
|
||||
return View(new AdminMyProjectsEditVM());
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult newmppost(AdminMyProjectsEditVM vm)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
return View(vm);
|
||||
|
||||
// EN -> base table
|
||||
var newProject = new myprojects
|
||||
{
|
||||
title = vm.TitleEN,
|
||||
description = vm.DescEN
|
||||
// image/iframe artık yok
|
||||
};
|
||||
|
||||
db.MyProjects.Add(newProject);
|
||||
db.SaveChanges();
|
||||
|
||||
// TR -> translations
|
||||
var tr = new myprojectstranslation
|
||||
{
|
||||
project_id = newProject.id,
|
||||
culture = "tr",
|
||||
title = vm.TitleTR ?? "",
|
||||
description = vm.DescTR ?? ""
|
||||
};
|
||||
|
||||
db.myprojectstranslations.Add(tr);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Project added successfully!";
|
||||
return RedirectToAction("myprojectsget", new { id = newProject.id }); // direkt edit sayfasına at, media eklesin
|
||||
}
|
||||
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult myprojectsdelete(int id)
|
||||
{
|
||||
var mpd = db.MyProjects.Find(id); // mpd = my projects delete
|
||||
if (mpd != null)
|
||||
{
|
||||
db.MyProjects.Remove(mpd);
|
||||
db.SaveChanges();
|
||||
}
|
||||
return RedirectToAction("MyProjects");
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Authorize]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult addmedia(
|
||||
int projectId,
|
||||
int mediaType,
|
||||
int sortOrder = 0,
|
||||
string iframeUrl = null,
|
||||
HttpPostedFileBase mediaFile = null)
|
||||
{
|
||||
var type = (MediaType)mediaType;
|
||||
|
||||
// 1) IFRAME -> URL
|
||||
if (type == MediaType.Iframe)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(iframeUrl))
|
||||
{
|
||||
TempData["ok"] = "Iframe URL boş olamaz.";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
var row = new projectmedia
|
||||
{
|
||||
project_id = projectId,
|
||||
media_type = MediaType.Iframe,
|
||||
url = iframeUrl.Trim(),
|
||||
sort_order = sortOrder
|
||||
};
|
||||
|
||||
db.projectmedia.Add(row);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Media eklendi!";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
// 2) IMAGE/VIDEO/DOCUMENT -> FILE
|
||||
if (mediaFile == null || mediaFile.ContentLength <= 0)
|
||||
{
|
||||
TempData["ok"] = "Dosya seçmelisin.";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
var ext = Path.GetExtension(mediaFile.FileName)?.ToLowerInvariant() ?? "";
|
||||
|
||||
// Tip bazlı uzantı whitelist
|
||||
string[] allowed;
|
||||
switch (type)
|
||||
{
|
||||
case MediaType.Image:
|
||||
allowed = new[] { ".jpg", ".jpeg", ".png", ".webp", ".gif" };
|
||||
break;
|
||||
//case MediaType.Video:
|
||||
// allowed = new[] { ".mp4", ".webm", ".mov" };
|
||||
// break;
|
||||
//case MediaType.Document:
|
||||
// allowed = new[] { ".pdf" };
|
||||
// break;
|
||||
default:
|
||||
TempData["ok"] = "Geçersiz media type.";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
if (!allowed.Contains(ext))
|
||||
{
|
||||
TempData["ok"] = "Bu dosya tipi kabul edilmiyor: " + ext;
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
// Upload path
|
||||
var uploadsRoot = Server.MapPath("~/Content/uploads/projects-media");
|
||||
if (!Directory.Exists(uploadsRoot))
|
||||
Directory.CreateDirectory(uploadsRoot);
|
||||
|
||||
var fileName = Guid.NewGuid().ToString("N") + ext;
|
||||
var filePath = Path.Combine(uploadsRoot, fileName);
|
||||
mediaFile.SaveAs(filePath);
|
||||
|
||||
var publicUrl = "/Content/uploads/projects-media/" + fileName;
|
||||
|
||||
var m = new projectmedia
|
||||
{
|
||||
project_id = projectId,
|
||||
media_type = type,
|
||||
url = publicUrl,
|
||||
sort_order = sortOrder
|
||||
};
|
||||
|
||||
db.projectmedia.Add(m);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Media eklendi!";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult deletemedia(int id, int projectId)
|
||||
{
|
||||
var m = db.projectmedia.FirstOrDefault(x => x.id == id && x.project_id == projectId);
|
||||
if (m == null)
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
|
||||
// Dosya silme: sadece Iframe dışındakiler + URL bizim uploads klasörümüzse
|
||||
if (m.media_type != MediaType.Iframe && !string.IsNullOrWhiteSpace(m.url))
|
||||
{
|
||||
try
|
||||
{
|
||||
// Güvenlik: sadece bizim klasördeki dosyaları sil
|
||||
var prefix = "/Content/uploads/projects-media/";
|
||||
if (m.url.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var relative = "~" + m.url; // ~/Content/uploads/...
|
||||
var physicalPath = Server.MapPath(relative);
|
||||
|
||||
if (System.IO.File.Exists(physicalPath))
|
||||
System.IO.File.Delete(physicalPath);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// istersen log yazdırırız, şimdilik sessiz geçiyoruz
|
||||
}
|
||||
}
|
||||
|
||||
db.projectmedia.Remove(m);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Media silindi.";
|
||||
return RedirectToAction("myprojectsget", new { id = projectId });
|
||||
}
|
||||
|
||||
private static readonly string[] AllowedLogoExtensions = { ".jpg", ".jpeg", ".png", ".webp", ".gif" };
|
||||
private const string AffiliateLogosPrefix = "/Content/uploads/affiliate-logos/";
|
||||
|
||||
[Authorize]
|
||||
public ActionResult AffiliateLinks()
|
||||
{
|
||||
var value = db.AffiliateLinks
|
||||
.OrderBy(x => x.sort_order)
|
||||
.ThenBy(x => x.id)
|
||||
.ToList();
|
||||
return View(value);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult newaffiliatepost()
|
||||
{
|
||||
return View(new AdminAffiliateLinkVM());
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult newaffiliatepost(AdminAffiliateLinkVM vm)
|
||||
{
|
||||
if (vm.logoFile == null || vm.logoFile.ContentLength <= 0)
|
||||
{
|
||||
ModelState.AddModelError("logoFile", "Logo image is required.");
|
||||
}
|
||||
|
||||
if (!ModelState.IsValid)
|
||||
return View(vm);
|
||||
|
||||
var logoUrl = SaveAffiliateLogo(vm.logoFile);
|
||||
if (logoUrl == null)
|
||||
{
|
||||
ModelState.AddModelError("logoFile", "This file type is not accepted.");
|
||||
return View(vm);
|
||||
}
|
||||
|
||||
var link = new affiliatelink
|
||||
{
|
||||
title = vm.TitleEN,
|
||||
description = vm.DescEN,
|
||||
url = vm.url,
|
||||
sort_order = vm.sort_order,
|
||||
image = logoUrl
|
||||
};
|
||||
|
||||
db.AffiliateLinks.Add(link);
|
||||
db.SaveChanges();
|
||||
|
||||
var tr = new affiliatelinktranslation
|
||||
{
|
||||
affiliatelink_id = link.id,
|
||||
culture = "tr",
|
||||
title = vm.TitleTR ?? "",
|
||||
description = vm.DescTR ?? ""
|
||||
};
|
||||
|
||||
db.affiliatelinktranslations.Add(tr);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Affiliate link added successfully!";
|
||||
return RedirectToAction("AffiliateLinks");
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult affiliatelinkget(int id)
|
||||
{
|
||||
var a = db.AffiliateLinks
|
||||
.Include(x => x.Translations)
|
||||
.FirstOrDefault(x => x.id == id);
|
||||
if (a == null) return HttpNotFound();
|
||||
|
||||
var tr = a.Translations?.FirstOrDefault(t => t.culture == "tr" || t.culture == "tr-TR");
|
||||
|
||||
var vm = new AdminAffiliateLinkVM
|
||||
{
|
||||
id = a.id,
|
||||
TitleEN = a.title,
|
||||
DescEN = a.description,
|
||||
TitleTR = tr != null ? tr.title : "",
|
||||
DescTR = tr != null ? tr.description : "",
|
||||
url = a.url,
|
||||
sort_order = a.sort_order,
|
||||
existingImage = a.image
|
||||
};
|
||||
|
||||
return View(vm);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult affiliatelinkget(AdminAffiliateLinkVM vm)
|
||||
{
|
||||
var a = db.AffiliateLinks.Find(vm.id);
|
||||
if (a == null) return HttpNotFound();
|
||||
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
vm.existingImage = a.image;
|
||||
return View(vm);
|
||||
}
|
||||
|
||||
if (vm.logoFile != null && vm.logoFile.ContentLength > 0)
|
||||
{
|
||||
var logoUrl = SaveAffiliateLogo(vm.logoFile);
|
||||
if (logoUrl == null)
|
||||
{
|
||||
ModelState.AddModelError("logoFile", "This file type is not accepted.");
|
||||
vm.existingImage = a.image;
|
||||
return View(vm);
|
||||
}
|
||||
|
||||
DeleteAffiliateLogo(a.image);
|
||||
a.image = logoUrl;
|
||||
}
|
||||
|
||||
a.title = vm.TitleEN;
|
||||
a.description = vm.DescEN;
|
||||
a.url = vm.url;
|
||||
a.sort_order = vm.sort_order;
|
||||
|
||||
var tr = db.affiliatelinktranslations
|
||||
.FirstOrDefault(x => x.affiliatelink_id == a.id && (x.culture == "tr" || x.culture == "tr-TR"));
|
||||
|
||||
if (tr == null)
|
||||
{
|
||||
tr = new affiliatelinktranslation { affiliatelink_id = a.id, culture = "tr" };
|
||||
db.affiliatelinktranslations.Add(tr);
|
||||
}
|
||||
|
||||
tr.title = vm.TitleTR;
|
||||
tr.description = vm.DescTR;
|
||||
|
||||
db.SaveChanges();
|
||||
TempData["ok"] = "Affiliate link updated successfully!";
|
||||
return RedirectToAction("affiliatelinkget", new { id = a.id });
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult affiliatelinkdelete(int id)
|
||||
{
|
||||
var a = db.AffiliateLinks.Find(id);
|
||||
if (a != null)
|
||||
{
|
||||
var translations = db.affiliatelinktranslations.Where(x => x.affiliatelink_id == id);
|
||||
db.affiliatelinktranslations.RemoveRange(translations);
|
||||
|
||||
DeleteAffiliateLogo(a.image);
|
||||
db.AffiliateLinks.Remove(a);
|
||||
db.SaveChanges();
|
||||
}
|
||||
return RedirectToAction("AffiliateLinks");
|
||||
}
|
||||
|
||||
private string SaveAffiliateLogo(HttpPostedFileBase file)
|
||||
{
|
||||
var ext = Path.GetExtension(file.FileName)?.ToLowerInvariant() ?? "";
|
||||
if (!AllowedLogoExtensions.Contains(ext))
|
||||
return null;
|
||||
|
||||
var uploadsRoot = Server.MapPath("~/Content/uploads/affiliate-logos");
|
||||
if (!Directory.Exists(uploadsRoot))
|
||||
Directory.CreateDirectory(uploadsRoot);
|
||||
|
||||
var fileName = Guid.NewGuid().ToString("N") + ext;
|
||||
var filePath = Path.Combine(uploadsRoot, fileName);
|
||||
file.SaveAs(filePath);
|
||||
|
||||
return AffiliateLogosPrefix + fileName;
|
||||
}
|
||||
|
||||
private void DeleteAffiliateLogo(string publicUrl)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(publicUrl)) return;
|
||||
if (!publicUrl.StartsWith(AffiliateLogosPrefix, StringComparison.OrdinalIgnoreCase)) return;
|
||||
|
||||
try
|
||||
{
|
||||
var physicalPath = Server.MapPath("~" + publicUrl);
|
||||
if (System.IO.File.Exists(physicalPath))
|
||||
System.IO.File.Delete(physicalPath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult SocialIcons()
|
||||
{
|
||||
var value = db.SocialIcons
|
||||
.OrderBy(x => x.sort_order)
|
||||
.ThenBy(x => x.id)
|
||||
.ToList();
|
||||
return View(value);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult newsocialicon()
|
||||
{
|
||||
return View(new AdminSocialIconVM());
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult newsocialicon(AdminSocialIconVM vm)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
return View(vm);
|
||||
|
||||
var icon = new socialicon
|
||||
{
|
||||
icon = vm.icon,
|
||||
url = vm.url,
|
||||
sort_order = vm.sort_order
|
||||
};
|
||||
|
||||
db.SocialIcons.Add(icon);
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Social icon added successfully!";
|
||||
return RedirectToAction("SocialIcons");
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult socialiconget(int id)
|
||||
{
|
||||
var s = db.SocialIcons.Find(id);
|
||||
if (s == null) return HttpNotFound();
|
||||
|
||||
var vm = new AdminSocialIconVM
|
||||
{
|
||||
id = s.id,
|
||||
icon = s.icon,
|
||||
url = s.url,
|
||||
sort_order = s.sort_order
|
||||
};
|
||||
|
||||
return View(vm);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult socialiconget(AdminSocialIconVM vm)
|
||||
{
|
||||
var s = db.SocialIcons.Find(vm.id);
|
||||
if (s == null) return HttpNotFound();
|
||||
|
||||
if (!ModelState.IsValid)
|
||||
return View(vm);
|
||||
|
||||
s.icon = vm.icon;
|
||||
s.url = vm.url;
|
||||
s.sort_order = vm.sort_order;
|
||||
|
||||
db.SaveChanges();
|
||||
TempData["ok"] = "Social icon updated successfully!";
|
||||
return RedirectToAction("socialiconget", new { id = s.id });
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult socialicondelete(int id)
|
||||
{
|
||||
var s = db.SocialIcons.Find(id);
|
||||
if (s != null)
|
||||
{
|
||||
db.SocialIcons.Remove(s);
|
||||
db.SaveChanges();
|
||||
}
|
||||
return RedirectToAction("SocialIcons");
|
||||
}
|
||||
|
||||
private static readonly string[] AllowedWallpaperExtensions = { ".jpg", ".jpeg", ".png", ".webp", ".gif" };
|
||||
private const string WallpaperPrefix = "/Content/uploads/wallpaper/";
|
||||
private const string DefaultWallpaperUrl = "/web_atakanozbancom/assets/img/wp.jpg";
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult Wallpaper()
|
||||
{
|
||||
var setting = db.SiteSettings.FirstOrDefault();
|
||||
ViewBag.CurrentWallpaper = !string.IsNullOrWhiteSpace(setting?.wallpaper) ? setting.wallpaper : DefaultWallpaperUrl;
|
||||
return View();
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult Wallpaper(HttpPostedFileBase wallpaperFile)
|
||||
{
|
||||
if (wallpaperFile == null || wallpaperFile.ContentLength <= 0)
|
||||
{
|
||||
TempData["ok"] = "Please choose an image.";
|
||||
return RedirectToAction("Wallpaper");
|
||||
}
|
||||
|
||||
var ext = Path.GetExtension(wallpaperFile.FileName)?.ToLowerInvariant() ?? "";
|
||||
if (!AllowedWallpaperExtensions.Contains(ext))
|
||||
{
|
||||
TempData["ok"] = "This file type is not accepted.";
|
||||
return RedirectToAction("Wallpaper");
|
||||
}
|
||||
|
||||
var uploadsRoot = Server.MapPath("~/Content/uploads/wallpaper");
|
||||
if (!Directory.Exists(uploadsRoot))
|
||||
Directory.CreateDirectory(uploadsRoot);
|
||||
|
||||
var fileName = Guid.NewGuid().ToString("N") + ext;
|
||||
var filePath = Path.Combine(uploadsRoot, fileName);
|
||||
wallpaperFile.SaveAs(filePath);
|
||||
|
||||
var publicUrl = WallpaperPrefix + fileName;
|
||||
|
||||
var setting = db.SiteSettings.FirstOrDefault();
|
||||
if (setting == null)
|
||||
{
|
||||
setting = new sitesetting();
|
||||
db.SiteSettings.Add(setting);
|
||||
}
|
||||
else
|
||||
{
|
||||
DeleteWallpaperFile(setting.wallpaper);
|
||||
}
|
||||
|
||||
setting.wallpaper = publicUrl;
|
||||
db.SaveChanges();
|
||||
|
||||
TempData["ok"] = "Wallpaper updated successfully!";
|
||||
return RedirectToAction("Wallpaper");
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
[ValidateAntiForgeryToken]
|
||||
public ActionResult WallpaperReset()
|
||||
{
|
||||
var setting = db.SiteSettings.FirstOrDefault();
|
||||
if (setting != null && !string.IsNullOrWhiteSpace(setting.wallpaper))
|
||||
{
|
||||
DeleteWallpaperFile(setting.wallpaper);
|
||||
setting.wallpaper = null;
|
||||
db.SaveChanges();
|
||||
}
|
||||
|
||||
TempData["ok"] = "Wallpaper reset to default.";
|
||||
return RedirectToAction("Wallpaper");
|
||||
}
|
||||
|
||||
private void DeleteWallpaperFile(string publicUrl)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(publicUrl)) return;
|
||||
if (!publicUrl.StartsWith(WallpaperPrefix, StringComparison.OrdinalIgnoreCase)) return;
|
||||
|
||||
try
|
||||
{
|
||||
var physicalPath = Server.MapPath("~" + publicUrl);
|
||||
if (System.IO.File.Exists(physicalPath))
|
||||
System.IO.File.Delete(physicalPath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Entity;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using atakanozbancom;
|
||||
using atakanozbancom.Models.classes;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class AffiliateController : Controller
|
||||
{
|
||||
private readonly Context db = new Context();
|
||||
|
||||
[HttpGet]
|
||||
public ActionResult Index()
|
||||
{
|
||||
var cultureFull = Thread.CurrentThread.CurrentUICulture.Name;
|
||||
var cultureShort = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
|
||||
var isEnglish = cultureShort == "en";
|
||||
|
||||
var links = db.AffiliateLinks
|
||||
.Include(x => x.Translations)
|
||||
.OrderBy(x => x.sort_order)
|
||||
.ThenBy(x => x.id)
|
||||
.ToList();
|
||||
|
||||
var model = links.Select(a =>
|
||||
{
|
||||
var title = !isEnglish
|
||||
? a.Translations
|
||||
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
|
||||
.Select(t => t.title)
|
||||
.FirstOrDefault() ?? a.title
|
||||
: a.title;
|
||||
|
||||
var description = !isEnglish
|
||||
? a.Translations
|
||||
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
|
||||
.Select(t => t.description)
|
||||
.FirstOrDefault() ?? a.description
|
||||
: a.description;
|
||||
|
||||
return new AffiliateLinkVM
|
||||
{
|
||||
id = a.id,
|
||||
title = title,
|
||||
description = description,
|
||||
url = a.url,
|
||||
image = a.image
|
||||
};
|
||||
}).ToList();
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult ChangeLanguage(string lang)
|
||||
{
|
||||
new LanguageTR().SetLanguage(lang);
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using atakanozbancom;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class languageController : Controller
|
||||
{
|
||||
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
|
||||
{
|
||||
string lang = null;
|
||||
|
||||
HttpCookie langCookie = Request.Cookies["culture"];
|
||||
if (langCookie != null && !string.IsNullOrWhiteSpace(langCookie.Value))
|
||||
{
|
||||
lang = langCookie.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
var userLang = Request.UserLanguages != null && Request.UserLanguages.Length > 0
|
||||
? Request.UserLanguages[0]
|
||||
: null;
|
||||
|
||||
lang = string.IsNullOrWhiteSpace(userLang)
|
||||
? LanguageTR.GetDefaultLanguage()
|
||||
: userLang;
|
||||
}
|
||||
|
||||
new LanguageTR().SetLanguage(lang);
|
||||
return base.BeginExecuteCore(callback, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Security;
|
||||
using atakanozbancom.Models.classes;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class loginController : Controller
|
||||
{
|
||||
// GET: Login
|
||||
Context c = new Context();
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult Index(admin ad)
|
||||
{
|
||||
var bilgiler = c.admins.FirstOrDefault(x => x.username == ad.username && x.password == ad.password);
|
||||
if (bilgiler != null)
|
||||
{
|
||||
FormsAuthentication.SetAuthCookie(bilgiler.username, false);
|
||||
Session["username"] = bilgiler.username.ToString();
|
||||
return RedirectToAction("Index", "admin");
|
||||
}
|
||||
else
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
||||
public ActionResult logout()
|
||||
{
|
||||
FormsAuthentication.SignOut();
|
||||
return RedirectToAction("index", "login");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using atakanozbancom;
|
||||
using atakanozbancom.Models.classes;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class MainController : languageController
|
||||
{
|
||||
private readonly Context db = new Context();
|
||||
|
||||
[HttpGet]
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
public PartialViewResult socialicons()
|
||||
{
|
||||
var icons = db.SocialIcons
|
||||
.OrderBy(x => x.sort_order)
|
||||
.ThenBy(x => x.id)
|
||||
.ToList();
|
||||
|
||||
return PartialView(icons);
|
||||
}
|
||||
|
||||
public PartialViewResult wallpaper()
|
||||
{
|
||||
var setting = db.SiteSettings.FirstOrDefault();
|
||||
ViewBag.WallpaperUrl = !string.IsNullOrWhiteSpace(setting?.wallpaper)
|
||||
? setting.wallpaper
|
||||
: "/web_atakanozbancom/assets/img/wp.jpg";
|
||||
|
||||
return PartialView();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public ActionResult ChangeLanguage(string lang, string returnUrl)
|
||||
{
|
||||
new LanguageTR().SetLanguage(lang);
|
||||
if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
|
||||
return Redirect(returnUrl);
|
||||
|
||||
return RedirectToAction("Index", "Main");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Web.Mvc;
|
||||
using System.Data.Entity;
|
||||
using atakanozbancom.Models.classes;
|
||||
|
||||
namespace atakanozbancom.Controllers
|
||||
{
|
||||
public class myprojectsController : Controller
|
||||
{
|
||||
private readonly Context c = new Context();
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
public PartialViewResult projectposts()
|
||||
{
|
||||
var cultureFull = Thread.CurrentThread.CurrentUICulture.Name;
|
||||
var cultureShort = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
|
||||
var isEnglish = cultureShort == "en";
|
||||
|
||||
var projects = c.MyProjects
|
||||
.Include(p => p.Translations)
|
||||
.ToList();
|
||||
|
||||
var ids = projects.Select(p => p.id).ToList();
|
||||
|
||||
var medias = c.projectmedia
|
||||
.Where(m => ids.Contains(m.project_id))
|
||||
.OrderBy(m => m.sort_order)
|
||||
.ThenBy(m => m.id)
|
||||
.ToList();
|
||||
|
||||
var mediaLookup = medias
|
||||
.GroupBy(m => m.project_id)
|
||||
.ToDictionary(g => g.Key, g => g.ToList());
|
||||
|
||||
var model = projects.Select(p =>
|
||||
{
|
||||
var title = !isEnglish
|
||||
? p.Translations
|
||||
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
|
||||
.Select(t => t.title)
|
||||
.FirstOrDefault() ?? p.title
|
||||
: p.title;
|
||||
|
||||
var description = !isEnglish
|
||||
? p.Translations
|
||||
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
|
||||
.Select(t => t.description)
|
||||
.FirstOrDefault() ?? p.description
|
||||
: p.description;
|
||||
|
||||
var vm = new MyProjectsVM
|
||||
{
|
||||
id = p.id,
|
||||
title = title,
|
||||
description = description,
|
||||
image = p.image,
|
||||
iframe = p.iframe
|
||||
};
|
||||
|
||||
if (mediaLookup.TryGetValue(p.id, out var list))
|
||||
{
|
||||
vm.medias = list.Select(m => new ProjectMediaVM
|
||||
{
|
||||
url = m.url,
|
||||
order = m.sort_order,
|
||||
type =
|
||||
m.media_type == MediaType.Image ? "image" :
|
||||
m.media_type == MediaType.Iframe ? "iframe" :
|
||||
// m.media_type == MediaType.Video ? "video" :
|
||||
"document"
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
if (vm.medias == null || vm.medias.Count == 0)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(p.iframe))
|
||||
vm.medias.Add(new ProjectMediaVM { type = "iframe", url = p.iframe, order = 0 });
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(p.image))
|
||||
vm.medias.Add(new ProjectMediaVM { type = "image", url = p.image, order = 1 });
|
||||
}
|
||||
|
||||
return vm;
|
||||
}).ToList();
|
||||
|
||||
return PartialView(model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<%@ Application Codebehind="Global.asax.cs" Inherits="atakanozbancom.MvcApplication" Language="C#" %>
|
||||
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
using System.Web;
|
||||
using System.Web.Helpers;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Optimization;
|
||||
using System.Web.Routing;
|
||||
|
||||
namespace atakanozbancom
|
||||
{
|
||||
public class MvcApplication : System.Web.HttpApplication
|
||||
{
|
||||
protected void Application_Start()
|
||||
{
|
||||
AreaRegistration.RegisterAllAreas();
|
||||
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
|
||||
RouteConfig.RegisterRoutes(RouteTable.Routes);
|
||||
BundleConfig.RegisterBundles(BundleTable.Bundles);
|
||||
}
|
||||
|
||||
protected void Application_BeginRequest()
|
||||
{
|
||||
var lang = (HttpContext.Current.Request.RequestContext.RouteData.Values["lang"] as string)
|
||||
?? HttpContext.Current.Request.Cookies["culture"]?.Value
|
||||
?? "en";
|
||||
|
||||
try
|
||||
{
|
||||
var ci = CultureInfo.CreateSpecificCulture(lang);
|
||||
Thread.CurrentThread.CurrentCulture = ci;
|
||||
Thread.CurrentThread.CurrentUICulture = ci;
|
||||
|
||||
HttpContext.Current.Response.Cookies.Add(new HttpCookie("culture", ci.Name)
|
||||
{
|
||||
Expires = DateTime.Now.AddYears(1),
|
||||
HttpOnly = true
|
||||
});
|
||||
}
|
||||
catch
|
||||
{
|
||||
var fallback = CultureInfo.CreateSpecificCulture("en");
|
||||
Thread.CurrentThread.CurrentCulture = fallback;
|
||||
Thread.CurrentThread.CurrentUICulture = fallback;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Atakan Doğan Özban
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,29 @@
|
||||
// <auto-generated />
|
||||
namespace atakanozbancom.Migrations
|
||||
{
|
||||
using System.CodeDom.Compiler;
|
||||
using System.Data.Entity.Migrations;
|
||||
using System.Data.Entity.Migrations.Infrastructure;
|
||||
using System.Resources;
|
||||
|
||||
[GeneratedCode("EntityFramework.Migrations", "6.5.1")]
|
||||
public sealed partial class InitialCreate : IMigrationMetadata
|
||||
{
|
||||
private readonly ResourceManager Resources = new ResourceManager(typeof(InitialCreate));
|
||||
|
||||
string IMigrationMetadata.Id
|
||||
{
|
||||
get { return "202504272001072_InitialCreate"; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Source
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Target
|
||||
{
|
||||
get { return Resources.GetString("Target"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
namespace atakanozbancom.Migrations
|
||||
{
|
||||
using System;
|
||||
using System.Data.Entity.Migrations;
|
||||
|
||||
public partial class InitialCreate : DbMigration
|
||||
{
|
||||
public override void Up()
|
||||
{
|
||||
CreateTable(
|
||||
"dbo.admins",
|
||||
c => new
|
||||
{
|
||||
id = c.Int(nullable: false, identity: true),
|
||||
username = c.String(),
|
||||
password = c.String(),
|
||||
})
|
||||
.PrimaryKey(t => t.id);
|
||||
|
||||
CreateTable(
|
||||
"dbo.myprojects",
|
||||
c => new
|
||||
{
|
||||
id = c.Int(nullable: false, identity: true),
|
||||
image = c.String(),
|
||||
title = c.String(),
|
||||
description = c.String(),
|
||||
admin_id = c.Int(),
|
||||
})
|
||||
.PrimaryKey(t => t.id)
|
||||
.ForeignKey("dbo.admins", t => t.admin_id)
|
||||
.Index(t => t.admin_id);
|
||||
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{
|
||||
DropForeignKey("dbo.myprojects", "admin_id", "dbo.admins");
|
||||
DropIndex("dbo.myprojects", new[] { "admin_id" });
|
||||
DropTable("dbo.myprojects");
|
||||
DropTable("dbo.admins");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Target" xml:space="preserve">
|
||||
<value>H4sIAAAAAAAEAO1Z227jNhB9L9B/EPTUFlnLSV7awN5F6iSF0c0FcbLoW0BLY4ddilRJKmu36Jf1oZ/UX+hQV4ryRXaSxaIo9iWmhoczwzMXzv7z19+Dd4uYeU8gFRV86B/2+r4HPBQR5fOhn+rZm+/9d2+//mpwHsUL70Mpd2zkcCdXQ/9R6+QkCFT4CDFRvZiGUigx071QxAGJRHDU7/8QHB4GgBA+Ynne4DblmsaQ/cCfI8FDSHRK2KWIgKliHb9MMlTvisSgEhLC0CeafCRc/D4lqGasZS/f0gsZUQqU750ySlCtCbCZ7xHOhSYalT65VzDRUvD5JMEFwu6WCaDcjDAFhTEntXhXu/pHxq6g3lhChanSIt4R8PC4cFTgbt/L3X7lSHTlObpcL43VmTvRk1FMEdc96WTEpJHa6upeBnDguWIHFU+QTubfgTdKmU4lDDmkWhJ24N2kU0bDn2F5Jz4CH/KUMVtZVBe/NRZw6UaKBKRe3sKsMIFGvhc09wXuxmqbtSe3b8z18ZHvXeHhZMqg4oLli4kWEn4CDpJoiG6I1iDxKscRZN5sne6clSoUx7/KE5GAGFi+d0kW74HP9ePQxz9974IuICpXCi3uOcU4xE1aprDtoARv5JOQ0csfdEWe6DxzhnPk5RIXfoVQY8zdAstE1CNN8tDLyfFgC11IEd8KVjLP+vYwEakMjZfEGoE7Iuegm8oNgprSG4keL5NKif3ZXqP8T/lNZ8Vk/vp8R03Y658SgQolTfL8+6JnrePuqVIipNlF2FnajqOmxuc88rYFVa54FZSoPHKTJshG1GDo93u9w5YnNuCWsWjh2hHWBP/OtduysB202AhoQpF6hfHmNyz0irDFal5Erir86+pv8CagbTeidrXbmy5pmd/cbuexFoRtvYNjWevo0kiNlti69Olmhg4XXxlRmx/sAFPeswVj6+wmoaapK7heXW7d3gV5f1f2gcGaRnBwSZIEw85qDIsVb5J3haM3k907pDjHCEK1olGqtK1OwryIqc35ajgawQWVSp9hVZgSE/ijKF4hllN5Dc/KUxpsbV9WybxS3PxdbOnSrLmItSMv0LYYM3xmJrjMae/LenPCiFxRakaCpTFfV6427a77JRujXu2OVDdENlK92kYaBI4rXO8HLfc7EeBeZqer3hji+1+3lZN2v/NNm1/n4ouuoQGQL3XHKHoCG6NY6o7RqPg2UuPD5ydPM7muSBaNcrJjVmjs7c4FUzsc960rRW1/deJQDreKScZf1eF76FXUtj312lkjTP4RzZq6sTK9d9UidrHWLa1tgrQqrCtS0bOqtE5FHRTVbfv8pVXuchHfQ9ufaGRK3WSpNMQ9I9Cb/MZGjGJA1AKXhNMZKJ2/g/yj/uGRM7X5ciYogVIR6zJG+ewvOWpcuvWt1nro7Tav4E9Eho9EfhOTxbc22j4ziR3A9nna/zduoPF8fpb7G0/kZyGteAY/C69OdJYjWy+8MY9gMfT/yDadeONfHsp9B961xDxy4vW9P/fj0XOf2c9+VNtPxn3e0WaGDjOQhmWEYd5XWmLmb7UdN5LykCaENbRvl70usWHcWeG5X84gAW5I3zawy2mbKn0F7UTqNgfsPGtw33EdJgrrBwp5WcTgmQq84pygq1/hLWSbBRuHDavO+BKGEe3Rw8bJQ9tet/N8lWFDu+VBTln/MYWcVnReQ5gujqM6NpsqmTGfiZLWjkaliDs/B00ipNqp1HRGQo2fQ1Aqmy5+ICxFkfN4CtGYX6c6STWaDPGUNQawJjg2nZ9NVJo6D66zRK5ewgRUk6IJcM1/TCmLKr0v2pVuHYSJuqJ8mrvUpozOlxXSleAdgQr3VcniDuKEIZi65hPyBPvodq/gPcxJuCw71/Ug2y+i6fbBGSVzSWJVYNT78SdyOIoXb/8Fjj7OqZ8dAAA=</value>
|
||||
</data>
|
||||
<data name="DefaultSchema" xml:space="preserve">
|
||||
<value>dbo</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace atakanozbancom.Migrations
|
||||
{
|
||||
using System;
|
||||
using System.Data.Entity;
|
||||
using System.Data.Entity.Migrations;
|
||||
using System.Linq;
|
||||
|
||||
internal sealed class Configuration : DbMigrationsConfiguration<atakanozbancom.Models.classes.Context>
|
||||
{
|
||||
public Configuration()
|
||||
{
|
||||
AutomaticMigrationsEnabled = true;
|
||||
}
|
||||
|
||||
protected override void Seed(atakanozbancom.Models.classes.Context context)
|
||||
{
|
||||
// This method will be called after migrating to the latest version.
|
||||
|
||||
// You can use the DbSet<T>.AddOrUpdate() helper extension method
|
||||
// to avoid creating duplicate seed data.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Web;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class AdminAffiliateLinkVM
|
||||
{
|
||||
public int id { get; set; }
|
||||
|
||||
[Display(Name = "Title (EN)")]
|
||||
[Required(ErrorMessage = "Title is required.")]
|
||||
[StringLength(200)]
|
||||
public string TitleEN { get; set; }
|
||||
|
||||
[Display(Name = "Description (EN)")]
|
||||
[StringLength(500)]
|
||||
public string DescEN { get; set; }
|
||||
|
||||
[Display(Name = "Title (TR)")]
|
||||
[StringLength(200)]
|
||||
public string TitleTR { get; set; }
|
||||
|
||||
[Display(Name = "Description (TR)")]
|
||||
[StringLength(500)]
|
||||
public string DescTR { get; set; }
|
||||
|
||||
[Display(Name = "URL")]
|
||||
[Required(ErrorMessage = "URL is required.")]
|
||||
[StringLength(1000)]
|
||||
public string url { get; set; }
|
||||
|
||||
[Display(Name = "Sort Order")]
|
||||
public int sort_order { get; set; }
|
||||
|
||||
public string existingImage { get; set; }
|
||||
|
||||
public HttpPostedFileBase logoFile { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class AdminMyProjectsEditVM
|
||||
{
|
||||
public int id { get; set; }
|
||||
public string TitleTR { get; set; }
|
||||
public string TitleEN { get; set; }
|
||||
public string DescTR { get; set; }
|
||||
public string DescEN { get; set; }
|
||||
|
||||
public List<projectmedia> medias { get; set; } = new List<projectmedia>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class AdminSocialIconVM
|
||||
{
|
||||
public int id { get; set; }
|
||||
|
||||
[Display(Name = "Icon (Font Awesome class)")]
|
||||
[Required(ErrorMessage = "Icon class is required.")]
|
||||
[StringLength(100)]
|
||||
public string icon { get; set; }
|
||||
|
||||
[Display(Name = "URL")]
|
||||
[Required(ErrorMessage = "URL is required.")]
|
||||
[StringLength(500)]
|
||||
public string url { get; set; }
|
||||
|
||||
[Display(Name = "Sort Order")]
|
||||
public int sort_order { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class AffiliateLinkVM
|
||||
{
|
||||
public int id { get; set; }
|
||||
public string title { get; set; }
|
||||
public string description { get; set; }
|
||||
public string url { get; set; }
|
||||
public string image { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Data.Entity;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class Context : DbContext
|
||||
{
|
||||
public Context() : base("Context")
|
||||
{
|
||||
// Fixes MODEL–DB uncompaciable:
|
||||
Database.SetInitializer<Context>(null);
|
||||
}
|
||||
|
||||
public DbSet<admin> admins { get; set; }
|
||||
public DbSet<myprojects> MyProjects { get; set; }
|
||||
public DbSet<myprojectstranslation> myprojectstranslations { get; set; }
|
||||
public DbSet<projectmedia> projectmedia { get; set; }
|
||||
public DbSet<affiliatelink> AffiliateLinks { get; set; }
|
||||
public DbSet<affiliatelinktranslation> affiliatelinktranslations { get; set; }
|
||||
public DbSet<socialicon> SocialIcons { get; set; }
|
||||
public DbSet<sitesetting> SiteSettings { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public static class DescriptionFormatter
|
||||
{
|
||||
private static readonly Regex LinkPattern = new Regex(
|
||||
@"\[([^\]\r\n]{1,200})\]\((https?://[^\s)]{1,2000})\)",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public static string ToSafeHtml(string raw)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(raw))
|
||||
return string.Empty;
|
||||
|
||||
var encoded = HttpUtility.HtmlEncode(raw);
|
||||
|
||||
var withLinks = LinkPattern.Replace(encoded, m =>
|
||||
{
|
||||
var label = m.Groups[1].Value;
|
||||
var url = m.Groups[2].Value;
|
||||
return $"<a href=\"{url}\" class=\"text-secondary text-decoration-none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">{label}</a>";
|
||||
});
|
||||
|
||||
var withBreaks = withLinks
|
||||
.Replace("\r\n", "\n")
|
||||
.Replace("\n", "<br />");
|
||||
|
||||
return withBreaks;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Web;
|
||||
|
||||
namespace atakanozbancom
|
||||
{
|
||||
public class LanguageTR
|
||||
{
|
||||
public static List<Languages> AvailableLanguages = new List<Languages>
|
||||
{
|
||||
new Languages { LanguageFullName = "English", LanguageCultureName = "en-US" },
|
||||
new Languages { LanguageFullName = "Turkish", LanguageCultureName = "tr-TR" }
|
||||
};
|
||||
|
||||
public static bool IsLanguageAvailable(string lang)
|
||||
{
|
||||
return AvailableLanguages.Any(a => a.LanguageCultureName.Equals(lang, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public static string GetDefaultLanguage()
|
||||
{
|
||||
return AvailableLanguages[0].LanguageCultureName;
|
||||
}
|
||||
|
||||
public void SetLanguage(string lang)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!IsLanguageAvailable(lang))
|
||||
lang = GetDefaultLanguage();
|
||||
|
||||
var cultureInfo = new CultureInfo(lang);
|
||||
Thread.CurrentThread.CurrentUICulture = cultureInfo;
|
||||
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
|
||||
|
||||
HttpCookie langCookie = new HttpCookie("culture", lang)
|
||||
{
|
||||
Expires = DateTime.Now.AddYears(1),
|
||||
HttpOnly = true
|
||||
};
|
||||
HttpContext.Current.Response.Cookies.Add(langCookie);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
public class Languages
|
||||
{
|
||||
public string LanguageFullName { get; set; }
|
||||
public string LanguageCultureName { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class MyProjectsVM
|
||||
{
|
||||
public int id { get; set; }
|
||||
public string title { get; set; }
|
||||
[AllowHtml]
|
||||
public string description { get; set; }
|
||||
|
||||
// legacy (şimdilik kalsın)
|
||||
public string image { get; set; }
|
||||
public string iframe { get; set; }
|
||||
|
||||
public List<ProjectMediaVM> medias { get; set; } = new List<ProjectMediaVM>();
|
||||
}
|
||||
|
||||
public class ProjectMediaVM
|
||||
{
|
||||
public string type { get; set; }
|
||||
public string url { get; set; }
|
||||
public int order { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class admin
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
public string username { get; set; }
|
||||
public string password { get; set; }
|
||||
public List<myprojects> MyProjects { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
[Table("affiliatelinks")]
|
||||
public class affiliatelink
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
|
||||
[Required, StringLength(500)]
|
||||
[Column("image")]
|
||||
public string image { get; set; }
|
||||
|
||||
[Required, StringLength(200)]
|
||||
[Column("title")]
|
||||
public string title { get; set; }
|
||||
|
||||
[StringLength(500)]
|
||||
[Column("description")]
|
||||
public string description { get; set; }
|
||||
|
||||
[Required, StringLength(1000)]
|
||||
[Column("url")]
|
||||
public string url { get; set; }
|
||||
|
||||
[Column("sortorder")]
|
||||
public int sort_order { get; set; } = 0;
|
||||
|
||||
public virtual ICollection<affiliatelinktranslation> Translations { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
[Table("affiliatelinktranslations")]
|
||||
public class affiliatelinktranslation
|
||||
{
|
||||
public int id { get; set; }
|
||||
|
||||
[Required]
|
||||
public int affiliatelink_id { get; set; }
|
||||
|
||||
[Required, StringLength(10)]
|
||||
public string culture { get; set; }
|
||||
|
||||
[StringLength(255)]
|
||||
public string title { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
|
||||
[ForeignKey("affiliatelink_id")]
|
||||
public virtual affiliatelink AffiliateLink { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public class myprojects
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
public string image { get; set; }
|
||||
public string iframe { get; set; }
|
||||
public string title { get; set; }
|
||||
[AllowHtml]
|
||||
public string description { get; set; }
|
||||
public object admins { get; internal set; }
|
||||
public virtual ICollection<myprojectstranslation> Translations { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
[Table("myprojectstranslations")]
|
||||
public class myprojectstranslation
|
||||
{
|
||||
public int id { get; set; }
|
||||
|
||||
[Required]
|
||||
public int project_id { get; set; }
|
||||
|
||||
[Required, StringLength(10)]
|
||||
public string culture { get; set; }
|
||||
|
||||
[StringLength(255)]
|
||||
public string title { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
|
||||
[ForeignKey("project_id")]
|
||||
public virtual myprojects Project { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
public enum MediaType
|
||||
{
|
||||
Image = 1,
|
||||
Iframe = 2,
|
||||
// Video = 0,
|
||||
//Document = 3
|
||||
}
|
||||
|
||||
[Table("projectmedia")]
|
||||
public class projectmedia
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
|
||||
[Column("projectid")]
|
||||
public int project_id { get; set; }
|
||||
|
||||
[ForeignKey(nameof(project_id))]
|
||||
public virtual myprojects Project { get; set; }
|
||||
|
||||
[Column("mediatype")]
|
||||
public MediaType media_type { get; set; }
|
||||
|
||||
[Required, StringLength(1000)]
|
||||
[Column("mediaurl")]
|
||||
public string url { get; set; }
|
||||
|
||||
[Column("sortorder")]
|
||||
public int sort_order { get; set; } = 0;
|
||||
|
||||
// DB'de bu kolon yok → modelden kaldırıyoruz
|
||||
// public string title { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
[Table("sitesettings")]
|
||||
public class sitesetting
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
|
||||
[StringLength(500)]
|
||||
[Column("wallpaper")]
|
||||
public string wallpaper { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace atakanozbancom.Models.classes
|
||||
{
|
||||
[Table("socialicons")]
|
||||
public class socialicon
|
||||
{
|
||||
[Key]
|
||||
public int id { get; set; }
|
||||
|
||||
[Required, StringLength(100)]
|
||||
[Column("icon")]
|
||||
public string icon { get; set; }
|
||||
|
||||
[Required, StringLength(500)]
|
||||
[Column("url")]
|
||||
public string url { get; set; }
|
||||
|
||||
[Column("sortorder")]
|
||||
public int sort_order { get; set; } = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("atakanozbancom")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("atakanozbancom")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2025")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("f77d9927-e117-4ca2-a151-9dc37b8a23ab")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,127 @@
|
||||
# atakanozban.com
|
||||
|
||||
The source code for my personal portfolio website: an ASP.NET MVC 5 site with a small
|
||||
custom admin panel for managing projects, affiliate links, social icons and the site
|
||||
wallpaper, plus English/Turkish localization.
|
||||
|
||||
## Features
|
||||
|
||||
- Public site: home, about, my projects (with an image/iframe carousel per project),
|
||||
affiliate links, dynamic social icons in the footer, and a changeable background wallpaper.
|
||||
- Admin panel (`/admin`) protected by Forms Authentication:
|
||||
- My Projects: create/edit posts with EN/TR translations and a media manager
|
||||
(upload images or embed iframes, drag-free reordering via a sort order field).
|
||||
- Affiliate Links: create/edit links with a logo, title, description and EN/TR translations.
|
||||
- Social Icons: manage the icon row shown in the site footer (Font Awesome classes + URLs).
|
||||
- Wallpaper: upload a new background image for the whole site, or reset to the default.
|
||||
- Image uploads everywhere support both the regular file picker **and** pasting an
|
||||
image straight from the clipboard (Ctrl+V).
|
||||
- English / Turkish localization via `.resx` resource files and a culture cookie.
|
||||
|
||||
## Tech stack
|
||||
|
||||
- ASP.NET MVC 5 / .NET Framework 4.7.2
|
||||
- Entity Framework 6 (Code First, but with automatic migrations disabled — see
|
||||
[Database setup](#database-setup) below)
|
||||
- Microsoft SQL Server
|
||||
- Bootstrap 5.3.3 and Font Awesome 6 (loaded from CDN)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Windows with [Visual Studio 2019+](https://visualstudio.microsoft.com/) (the ".NET desktop
|
||||
development" / "ASP.NET and web development" workload) or MSBuild + IIS/IIS Express
|
||||
- SQL Server (LocalDB, SQL Server Express, or a full instance)
|
||||
- (Optional) An FTP/hosting environment if you want to deploy it somewhere other than IIS Express
|
||||
|
||||
## Getting started
|
||||
|
||||
### 1. Clone and restore packages
|
||||
|
||||
```bash
|
||||
git clone <this-repo-url>
|
||||
cd atakanozbancom
|
||||
```
|
||||
|
||||
Open `atakanozbancom.sln` in Visual Studio. NuGet packages will restore automatically on
|
||||
build (or run `nuget restore atakanozbancom.sln` from a Developer Command Prompt).
|
||||
|
||||
### 2. Database setup
|
||||
|
||||
This project uses EF6 Code First **with `Database.SetInitializer<Context>(null)`**, meaning
|
||||
Entity Framework will never create or alter tables for you — the schema is managed by hand.
|
||||
|
||||
1. Create an empty database (SQL Server Management Studio, Azure Data Studio, or `sqlcmd`):
|
||||
|
||||
```sql
|
||||
CREATE DATABASE atakanozbancomdb;
|
||||
```
|
||||
|
||||
2. Run [`database/schema.sql`](database/schema.sql) against that database. It creates every
|
||||
table the app needs (admins, projects, affiliate links, social icons, site settings) and
|
||||
inserts one seed admin account (`admin` / `change-this-password`).
|
||||
|
||||
3. **Change that seed password** (see [Security notes](#security-notes) — logins currently
|
||||
compare passwords as plain text, so don't reuse a real password here).
|
||||
|
||||
### 3. Configure `Web.config`
|
||||
|
||||
Open `Web.config` and update the `connectionStrings` section to point at your SQL Server
|
||||
instance:
|
||||
|
||||
```xml
|
||||
<connectionStrings>
|
||||
<add name="Context" connectionString="Data Source=YOUR_SERVER\INSTANCE;Initial Catalog=atakanozbancomdb;Integrated Security=true;" providerName="System.Data.SqlClient" />
|
||||
</connectionStrings>
|
||||
```
|
||||
|
||||
Then generate your own `<machineKey />` (see the comment above `<customErrors>` in
|
||||
`Web.config` for a couple of ways to do this) and paste it into `<system.web>`. This keeps
|
||||
authentication cookies and ViewState valid across app restarts/deployments — don't skip it,
|
||||
and don't reuse a sample key you find online.
|
||||
|
||||
### 4. Run it
|
||||
|
||||
Press F5 in Visual Studio (or `Ctrl+F5` to skip the debugger). The site starts at the URL
|
||||
shown in the IIS Express system tray icon / Visual Studio's toolbar. Log in at `/login`
|
||||
with the admin account you created above, then manage content from `/admin`.
|
||||
|
||||
## Project structure
|
||||
|
||||
```
|
||||
Controllers/ MVC controllers (public site + admin panel)
|
||||
Models/classes/ Entity Framework models, view models, helpers
|
||||
Views/ Razor views, organized by controller
|
||||
App_GlobalResources/ English (.resx) and Turkish (.tr-TR.resx) translation strings
|
||||
App_Start/ Routing, bundling and filter configuration
|
||||
Content/uploads/ User-uploaded images (logos, project media, wallpaper) — gitignored
|
||||
database/schema.sql Full database schema + seed admin account
|
||||
web_atakanozbancom/ Static assets (CSS/JS/images) for the public site
|
||||
```
|
||||
|
||||
## Uploaded content
|
||||
|
||||
Anything uploaded through the admin panel (project media, affiliate link logos, the
|
||||
wallpaper) is written to folders under `Content/uploads/`. Those folders are tracked with
|
||||
a `.gitkeep` placeholder but their contents are gitignored, since uploaded files are
|
||||
runtime data, not source code.
|
||||
|
||||
## Security notes
|
||||
|
||||
This project was open-sourced as a personal portfolio/reference, not as a hardened
|
||||
multi-tenant product. A few things worth knowing if you deploy your own copy or build on it:
|
||||
|
||||
- **Passwords are stored and compared in plain text** (`loginController`). If you plan to
|
||||
expose this beyond your own local use, replace this with a proper password hash
|
||||
(e.g. BCrypt/PBKDF2) before going live.
|
||||
- The admin panel already includes `[Authorize]` on every management action and
|
||||
`[ValidateAntiForgeryToken]` on every state-changing POST, so it's protected against CSRF
|
||||
once you're logged in — but access is still gated by a single shared admin login rather
|
||||
than per-user accounts/roles.
|
||||
- File uploads are restricted to an image extension allowlist (`.jpg`, `.jpeg`, `.png`,
|
||||
`.webp`, `.gif`) — SVG is intentionally excluded since it can carry executable script.
|
||||
- User-entered descriptions are HTML-encoded before rendering; a small `[text](https://...)`
|
||||
markdown-style syntax is the only way to add links, via `DescriptionFormatter`.
|
||||
|
||||
## License
|
||||
|
||||
MIT — see [LICENSE](LICENSE).
|
||||
Vendored
+7075
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+5202
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+5249
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+2670
File diff suppressed because it is too large
Load Diff
Vendored
+10704
File diff suppressed because it is too large
Load Diff
Vendored
+2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Vendored
+2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+1288
File diff suppressed because it is too large
Load Diff
Vendored
+1661
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user